C 如何近似LUT索引?
我有一个数组C 如何近似LUT索引?,c,algorithm,approximation,C,Algorithm,Approximation,我有一个数组 ... //a b {860, -30}, {853, -29}, {846, -28}, {838, -27}, {830, -26}, {822, -25}, {814, -24}, ... 使用C查找具有给定a值的b的最快方法是什么?我想这需要一些近似值?例如,当a=851时,我希望尽快找到-29。最快的通用算法是二进制搜索。根据映射数组的大小,可以考虑手工编码搜索;这对于32号可能是合理的,但我不会再大了。如果幸运的话,在微控制器上,
...
//a b
{860, -30},
{853, -29},
{846, -28},
{838, -27},
{830, -26},
{822, -25},
{814, -24},
...
使用C查找具有给定
a
值的b
的最快方法是什么?我想这需要一些近似值?例如,当a=851
时,我希望尽快找到-29
。最快的通用算法是二进制搜索。根据映射数组的大小,可以考虑手工编码搜索;这对于32号可能是合理的,但我不会再大了。如果幸运的话,在微控制器上,完全扩展的二进制搜索可能会快50%
但是如果映射不是太非线性,那么有一个很好的选择
将a
的范围划分为k
大小相等的范围,其中k
不大于映射数组中的条目数,这样每个范围端点的映射要么与下一个范围端点相同,要么比下一个范围端点多一个。(如果这是可能的,那正是我所说的“不太非线性”的意思)。创建另一个数组,将每个端点映射到原始数组的索引中。(您只需要索引,而不需要端点,因为端点是均匀分布的。)对于每个范围,底部端点的对应索引值是原始数组中最小a
值的索引,该值不小于范围的顶部端点。请注意,由于上述要求,每个范围中最多可以有一个a
值,因此每个端点的索引将始终指向范围结束时的a
值,而范围开始时的a
值将始终是相同的或先前的索引
现在,要查找一个值,首先计算出适当的范围索引,这是一个简单的线性计算((val-minval)/k
),然后通过查找索引进行比较,将该值与指示的a
值进行比较。如果该值小于查找的a
,则从索引中减去一。然后从索引返回b
值
有关这种算法的示例,请参见我的答案。数组是否按
a
排序?是的,我可以按a
或二进制搜索的某个变体排序。我看到a元素之间的间隔是7,7,8,8,8。。。这完全是随机的还是有规律的?@Ramy Al-Zuhouri:这是非线性的,可以变化。这个阵列实际上很大,我用的是微控制器。速度优化是一个关键部分。