使用查找表优化

我为一个程序制作了一些c代码,它对声音数据做了一些心理声学。 有一段代码运行得非常慢。 我认为最好使用查找表。如何实施呢? 任何指针或帮助将不胜感激! :)     
已邀请:
你的价值观不是等距的,所以并不容易。但它仍然可能:取你所有条件值的最大公约数(这就是50),然后制作你的表 byteout = lut [差异/ 50 + 12]; 在查找表中,您可以在发布的订单中使用您的值,如果您的步进为100,则复制条目。 顺便说一下,有一个错误,你所有的负面情况都被你的第一个
<=0
(我的例子假设你想要省略第一个案例)。     
首先,看看你想要首先检查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];
}
这是一个足够小的值,数组的大小不会过高。在程序开头用循环初始化。     
二进制搜索获胜。 将所有可能的值存储在数组中,并确保对它们进行排序。 从中间开始,查看
difference
是否小于该值。如果是这样,请移动到光标左侧的中间位置,然后重试。如果没有,请向右移动。继续前进,直到找到所需的值,然后使用它。 您的数组可以是具有最小值和相应的
byteout
值的结构。 编辑:要清除可能的误解,“每个可能的值”我并不是指-1400到1400之间的每个数字,只是您在原始代码中检查的值。     
让我们看看第一位:
if (difference <= 0)
  byteout = 0b0000;
else if (difference <= -600)
  byteout = 0b0111;
假设您的值为-601。 是&lt; = 0?是的,所以
byteout =  0b0000;
你永远不会到达-600。如此有效,所有负值都是
0b0000
。这可能是也可能不是设计,但如果是,你可以摆脱所有其他负面价值。 否则,我会考虑将其减少到一个公式(尽可能少的分支)或者使用@ Ebomike的预计算查找表和二进制搜索的解决方案。     

要回复问题请先登录注册