从c/c ++中从radix排序的int中获得单个数字的最佳方法
-
04-10-2019 - |
题
从n个数字数字数字中获取单个数字的最佳方法是什么?我想知道在C/C ++中是否有特别好的方法,如果不是什么,最好的解决方案是什么?
编辑:只是为了澄清,我一直在寻找一种解决方案,而不是将其转换为字符串并将其像对待一系列数字一样。
解决方案
使用大小的数字 2^k
. 。提取 n
数字:
#define BASE (2<<k)
#define MASK (BASE-1)
inline unsigned get_digit(unsigned word, int n) {
return (word >> (n*k)) & MASK;
}
使用换档和掩码(通过基础为2的功率启用)避免了昂贵的整数范围说明。
之后,选择最佳基础是一个实验性问题(您特定硬件的时间/空间折衷)。大概 k==3
(基数8)效果很好,限制了水桶的数量,但是 k==4
(基础16)看起来更具吸引力,因为它划分了单词大小。但是,没有将单词大小划分的基础实际上没有错,您可能会发现32或基础64的表现更好。这是一个实验性的问题,可能会因硬件而有所不同,这是根据缓存的行为以及数组中有多少元素的方式而有所不同。
最后注意:如果您要排序 签 整数生活是一种更大的痛苦,因为您想将最重要的位视为签名。我建议将所有内容视为未签名,然后如果您真的需要签名,则在Radix排序的最后一步中,您将交换桶,因此,具有最重要1的存储桶是在最重要的0。 确实 如果更容易 k
划分单词大小。
其他提示
不要使用基本10,使用基础16。
for (int i = 0; i < 8; i++) {
printf("%d\n", (n >> (i*4)) & 0xf);
}
由于整数在内部存储在二进制中,因此这将比除以10的效率更有效 小数 数字。
不隶属于 StackOverflow