我为一个程序制作了一些c代码,它对声音数据做了一些心理声学。
有一段代码运行得很慢。
我认为最好使用查找表。如何实施呢?
任何指针或帮助将不胜感激! :)
答案 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的预先计算查找表和二进制搜索的解决方案。