【问题标题】:How to approximate LUT index?如何近似 LUT 索引?
【发布时间】:2012-12-21 16:23:55
【问题描述】:

我有一个数组

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

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

【问题讨论】:

  • 数组是否按a排序?
  • 是的,我可以按a排序
  • bsearch 或二进制搜索的一些变体。
  • 我看到一个元素之间的差距是 7,7,8,8,8,...这是完全随机的还是有规律的?
  • @Ramy Al Zuhouri:它是非线性的并且可以变化。阵列实际上很大,我在微控制器上。速度优化是关键部分。

标签: c algorithm approximation


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2020-11-27
    • 1970-01-01
    • 2021-12-29
    • 2012-10-25
    相关资源
    最近更新 更多