我有一个数组
...
//a b
{860, -30},
{853, -29},
{846, -28},
{838, -27},
{830, -26},
{822, -25},
{814, -24},
...
使用 C 查找b
给定a
值的最快方法是什么?我想这需要一些近似值?例如,当a = 851
我想尽快找到时-29
。
我有一个数组
...
//a b
{860, -30},
{853, -29},
{846, -28},
{838, -27},
{830, -26},
{822, -25},
{814, -24},
...
使用 C 查找b
给定a
值的最快方法是什么?我想这需要一些近似值?例如,当a = 851
我想尽快找到时-29
。
最快的通用算法是二分查找。根据映射数组的大小,您可以考虑手动编码搜索;这对于 32 号来说可能是合理的,但我不会更大。在微控制器上,如果幸运的话,完全扩展的二进制搜索可能会快 50%。
但是,如果映射不是太非线性,那么还有一个不错的选择。
将范围划分a
为k
大小相等的范围,其中k
不比映射数组中的条目数大多少,以便每个范围端点的映射与下一个范围端点相同或多一个。(如果这是可能的;这正是我所说的“不太非线性”的意思)。创建另一个数组,将每个端点映射到原始数组的索引。(您只需要索引,而不需要端点,因为端点是均匀分布的。)对于每个范围,底部端点对应的索引值是a
原始数组中最小值的索引,不小于该范围的顶部端点。请注意,由于上述要求,最多可以有一个a
每个范围内的值,因此每个端点的索引将始终指向a
范围结束的值,并且范围a
开始的值将始终是相同的或前一个索引。
现在,要查找一个值,您首先要找出适当的范围索引,这是一个简单的线性计算 ( (val - minval)/k
),然后a
通过查找索引来将该值与指示值进行比较以进行比较。如果该值小于查找的值a
,则从索引中减去 1。然后b
从索引中返回值。
有关此类算法的示例,请参阅我的答案here。