[英]How to approximate LUT index?
我有一個陣列
...
//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
值。
有關此類算法的示例,請參閱此處的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.