如何估算LUT指数?

时间:2012-12-21 16:23:55

标签: c algorithm approximation

我有一个数组

...
//a      b
{860,   -30},
{853,   -29},
{846,   -28},
{838,   -27},
{830,   -26},
{822,   -25},
{814,   -24},
...

使用C查找具有给定b值的查找a的最快方法是什么?我想这需要一些近似值?例如,a = 851我希望尽快找到-29

1 个答案:

答案 0 :(得分:1)

最快的通用算法是二进制搜索。根据映射数组的大小,您可以考虑手动编码搜索;对于32码来说这可能是合理的,但我不会变得更大。在微控制器上,如果你很幸运的话,完全扩展的二进制搜索可能会快50%。

但如果映射不是非线性的,那么还有一个不错的选择。

a的范围除以k相等大小的范​​围,其中k并不比映射数组中的条目数大很多,以便每个范围的映射endpoint与下一个范围端点相同或者一个以上。 (如果这是可能的;这正是我所说的“不太非线性”)。创建另一个数组,将每个端点映射到原始数组的索引中。 (您只需要索引,而不是端点,因为端点均匀分布。)对于每个范围,底部端点的对应索引值是原始数组中最小a值的索引,不小于范围的最高端点。请注意,由于上面提到的要求,每个范围中最多只能有一个a值,因此每个端点的索引始终指向范围结束的a值,并且范围开头的a值将始终为相同或前一个索引。

现在,要查找一个值,首先要找出合适的范围索引,这是一个简单的线性计算((val - minval)/k),然后通过查找将该值与指示的a值进行比较比较的指数。如果该值小于查找的a,则从索引中减去1。然后从索引返回b值。

有关此类算法的示例,请参阅我的回答here