用于查找表的5个整数的唯一键

时间:2015-02-19 21:09:04

标签: c data-structures lookup

我在图像数据上使用了5交叉中值滤波器的变体 在一个小的嵌入式系统上,即

    x
  x x x
    x

算法非常简单,读取5个值,得到最高2 并对这些进行一些计算并回写结果。

5个输入值均在0-20范围内。计算值也在0-20范围内!

我试图找出是否可以使用查找表来加速 事情,但我没有生成一个我可以使用的密钥。

举个例子,考虑输入是否在0-5范围内, 生成唯一键的一种方法是获取二进制 表示和只是连接数字,即

101 101 101 101 101

key = x[0] | x[1] << 3 | x[2] << 6 | x[3] << 9 | x[4] << 12

但LUT很大,约有23,000件物品。

由于[5,0,0,0,5][5,0,5,0,0]一样简化 可以使用2个LUT,

LUT1 = [0, 1, 6, 31, 156, 781]

每个项目的数量超过5的最大总和 以前的元素

然后密钥可以计算为(使用python语法)

key = sum([LUT1[x[0]], LUT1[x[1]], LUT1[x[2]],
           LUT1[x[3]], LUT1[x[4]a]])

但同样,这种方法不能扩展到0-20的范围 每个元素。

使用如上所述的分拣网络 Fastest sort of fixed length 6 int array 没有改善表现;我只对2感兴趣 最高价值。

那么,是否可以从五个正面创建一个唯一的密钥 0-20范围内的整数,可用作a的索引 LUT?

1 个答案:

答案 0 :(得分:1)

免责声明:这不是一般解决方案

我有类似的问题,并以这种方式解决:

1)在5个值中的每个值(至少21位,因此需要32位变量)的位掩码中设置一个位。

2)如果该位已设置(=重复值),则索引变量(初始化为-1)将设置为该值,如果它小于该值。

3)N 属于&#34;不是一般&#34;解决方案,因为它的性能取决于非常快速的位扫描指令的可用性(例如x86有一个):找到最高位集。它的指数是该货币对的第一个值。

4)如果它等于&#34;重复值&#34;变量,那么第二个值也是这个。

5)否则,该货币对的第二个价值是第二个最高位的指数。

6)现在你有一对0到20之间的值,我认为21x21的查找表足够小。

粗鲁的代码:

int dup = -1;
uint_32 m = 0;
uint_32 vm;
int i;

for (i = 0; i < 5; ++i) {
   vm = 1 << val[i];
   if ((m & vm) && (dup < val[i])) {
       dup = val[i];
   }
   else {
       m |= vm;
   }
}

// Now the part that needs a very fast "get higest bit" function

top[0] = get_higest_bit(m);
if (top[0] == dup) {
    top[1] = top[0];
}
else {
    m &= ~(1 << top[0]);
    top[1] = get_higest_bit(m);
}

编辑:此外,面向比特的运算符(&lt;&lt; etc ...)必须足够快。 X86 / x64符合此要求。不保证在不同的cpu。但至少表达&#34; 1&lt;&lt; X&#34;可以通过多种方式进行优化。