2015-04-03 258 views
2

我正在尋找一種漂亮的方式在數組中搜索兩個最接近的值並返回它們之間的差異。C++:在數組中找到最接近的值

例如: 如果我給這些號碼: 10,1,43,59,78,46,63,12

他已經找到10/12,43/45和返回2.

我發現很多方法可以找到給定數字的最接近的值,但從來沒有找到一種方法來找到沒有給定數字的兩個最接近的數字。

我嘗試使用更有效,但它沒有爲我工作,是否有人有一個想法?

我的代碼是,對於時刻:

set<int> numbers; 
//imagine i set many values in numbers here 
int diff = 100000000; 
for (set<int>::iterator it=numbers.begin(); it!=numbers.end();) 
{ 
    int first = *it; 
    int second = *(++it); 
    diff = min(abs(second-first), diff_min); 
} 
cout << diff << endl; 

THX。

+3

對數字進行排序,然後進行通過,檢查連續位置的數字。 – 2015-04-03 08:18:12

+0

@LuchianGrigore它確實很優雅,但效率明顯,它仍然是'O(n lg n)',就像OP的代碼一樣。另外,將它們放在'std :: set'中並使用迭代器訪問它們已經使其充當「已排序數組」。這就是OP在做什麼, – shauryachats 2015-04-03 08:19:16

+0

對數組進行排序,並遍歷排序的數組,檢查數字對。 – 2015-04-03 08:19:22

回答

0

可以使用哈希表,但會增加空間複雜度。

0

如果您對它的可擴展性感興趣,您的任務有一個O(N)方法(或更接近於)...它基於binning數字,然後搜索最短距離只考慮關閉垃圾箱。

如果感興趣,我將在稍後詳細闡述。

+0

概念上,這必須與使用基數排序(即O(N))加上比較相似;可能除外,基數排序是分層次的,因此更有效率。 – Walter 2015-04-03 09:51:56