Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:查找数组中最接近的值_C++_Algorithm - Fatal编程技术网

C++ C++;:查找数组中最接近的值

C++ C++;:查找数组中最接近的值,c++,algorithm,C++,Algorithm,我正在寻找一种在数组中搜索两个最接近的值并返回它们之间的差的漂亮方法 例: 如果我给出这些数字: 10,1,43,59,78,46,63,12 他必须找到10/12,43/45,然后返回2 我找到了很多方法来找到与给定数字最接近的值,但从来没有找到一种方法只找到两个没有给定数字的最接近的数字 我试着用它来提高效率,但并不是每次都对我有效,有人有想法吗 我的代码是目前: set<int> numbers; //imagine i set many values in numbers h

我正在寻找一种在数组中搜索两个最接近的值并返回它们之间的差的漂亮方法

例: 如果我给出这些数字: 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;
设置编号;
//假设我在这里设置了许多数字值
int-diff=100000000;
for(set::iterator it=numbers.begin();it!=numbers.end();)
{
int first=*it;
int second=*(++it);
差动=最小值(abs(第二个第一个),差动最小值);
}

cout可以使用哈希表,但它会增加空间复杂性。

如果您对其可伸缩性感兴趣,有一种O(N)方法(或者更接近于)用于您的任务。。。它的基础是将数字装箱,然后只考虑较近的箱子,搜索最短的距离


如果有兴趣的话,我将在后面进一步阐述。

对数字进行排序,然后进行传递,检查连续位置的数字。@LuchianGrigore它确实很优雅,但效率方面,它仍然是
O(n lg n)
,与OP的代码相同。此外,将它们放在
std::set
中并使用迭代器访问它们已经使其充当“排序数组”。OP就是这么做的,对数组进行排序,然后遍历排序后的数组,检查数字对。您的代码不正确。当它指向数字中的最后一个元素时,<代码> ++IT >代码>地址没有元素,而<代码> *(++)>代码>是未定义的行为。我不认为O(n log n)在这里是蛮力的。在O(n^2)时间内检查所有对将是一种蛮力。另外,@Lingxi是对的——您的代码有一个bug。最后,您不需要调用
abs()
,因为
std::set
总是以非减量顺序返回元素;也许,除了基数排序是分层的,因此更有效。