Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何近似LUT索引?_C_Algorithm_Approximation - Fatal编程技术网

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:这是非线性的,可以变化。这个阵列实际上很大,我用的是微控制器。速度优化是一个关键部分。