2015-04-03 260 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