C++:查找数组中最接近的值
Posted
技术标签:
【中文标题】C++:查找数组中最接近的值【英文标题】:C++ : Find the closest values in an array 【发布时间】:2015-04-03 08:15:58 【问题描述】:我正在寻找一种漂亮的方法来在数组中搜索两个最接近的值并返回它们之间的差异。
例如: 如果我给出这些数字: 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;
谢谢。
【问题讨论】:
对数字进行排序,然后通过,检查连续位置的数字。 @LuchianGrigore 确实很优雅,但在效率方面,它仍然是O(n lg n)
,与 OP 的代码相同。此外,将它们放在std::set
中并使用迭代器访问它们已经使其充当“排序数组”。这就是 OP 正在做的事情,
对数组进行排序,并遍历排序后的数组,检查数字对。
您的代码不正确。当它指向数字中的最后一个元素时,++it
addresses 没有元素,*(++it)
是未定义的行为。
我不认为 O(n log n) 在这里是蛮力。在 O(n^2) 时间内检查所有对将是蛮力的。另外,@Lingxi 是对的——您的代码有错误。最后,您不需要调用abs()
,因为std::set
总是以非递减顺序返回元素。
【参考方案1】:
可以使用哈希表,但会增加空间复杂度。
【讨论】:
【参考方案2】:如果您对它的可扩展性感兴趣,您的任务有一个 O(N) 方法(或者更接近)...它基于 binning 数字,然后搜索仅考虑近距离垃圾箱的最短距离。
如果有兴趣,我稍后会详细说明。
【讨论】:
从概念上讲,这必须类似于使用基数排序(即 O(N))加比较;除了,也许,基数排序是分层的,因此更有效。以上是关于C++:查找数组中最接近的值的主要内容,如果未能解决你的问题,请参考以下文章
在排序数组列表中查找2个最接近的先前值和2个最接近的下一个值