使用查找表进行优化

时间:2011-04-04 19:03:07

标签: c optimization lookup-tables

我为一个程序制作了一些c代码,它对声音数据做了一些心理声学。

有一段代码运行得很慢。

我认为最好使用查找表。如何实施呢?

任何指针或帮助将不胜感激! :)

4 个答案:

答案 0 :(得分:6)

你的价值观不是等距的,所以并不容易。但它仍然可能:取你所有条件值的最大公约数(这就是50),然后制作你的表

byteout = lut [差异/ 50 + 12];

在查找表中,您只需在发布的订单中使用您的值,如果您的步进为100,则复制条目。

顺便说一下,有一个错误,你的所有负面案例都被你的第一个<=0抓住了(我的例子假设你想省略第一个案例)。

答案 1 :(得分:2)

首先,看看你想要首先检查0的位置,因为它会使你的所有负面检查毫无意义。

其次,我可能会将查找表构造为1300个元素的数组,偏移500(您的最低负值)。当您查找该数字时,每个元素都是您想要的结果。如果您正在寻找小于-500的东西,请不要检查阵列。

所以它看起来像这样:

table[0] = 0b0110; // -500 through -599
table[1] = 0b0110;
...
table[100] = 0b0101; // -400 through -499
table[101] = 0b0101;
...

查找将是:

if (value <= -600) {
    return 0b0111;
}
else {
    return table[value + 600];
}

这是一个足够小的值,数组的大小不会过高。在程序开头用循环初始化。

答案 2 :(得分:1)

二元搜索获胜。

将所有可能的值存储在数组中,并确保对它们进行排序。

从中间开始,查看difference是否小于该值。如果是这样,请移动到光标左侧的中间位置,然后重试。如果没有,请向右移动。继续前进,直到找到所需的值,然后使用它。

您的数组可以是具有最小值和相应byteout值的结构。

编辑:要清除可能存在的误解,“每个可能的值”我并不是指-1400到1400之间的每个数字,只是您在原始代码中检查的值。

答案 3 :(得分:0)

让我们看看第一位:

if (difference <= 0)
  byteout = 0b0000;
else if (difference <= -600)
  byteout = 0b0111;

假设您的值为-601。

是&lt; = 0?是的,所以byteout = 0b0000;

你永远不会到达-600。所以有效的是,所有负值都是0b0000。这可能是也可能不是设计,但如果是,你可以摆脱所有其他负面价值。

否则,我会考虑将其减少到一个公式(尽可能少的分支)或者使用@ Ebomike的预先计算查找表和二进制搜索的解决方案。