【问题标题】:Find index of value in Vector, nearest to the input在 Vector 中查找值的索引,最接近输入
【发布时间】:2013-03-29 02:02:52
【问题描述】:

有没有一种有效的方法可以找到向量中最接近参考值的值的索引?

【问题讨论】:

  • 效率如何?有std::find。不过,我不确定你的最后几句话是不是像 std::upper/lower_bound 这样的意思。
  • 在随机未排序数据的向量中,它将是 O(n)。您可以编写自己的循环或使用标准算法之一。
  • 我无法确定您所说的高效是什么意思。 jrok 是对的,传统上任何算法对未排序数据的效率都不会超过 O(n),但有时人们使用 efficienct 来表示完全不同的东西,比如“使用尽可能少的代码”,或者“不会让我尴尬”我提交我的作业”。所以我会更准确地定义你的意思。

标签: c++ search vector c++11 std


【解决方案1】:

在计算上,如果向量没有排序,你不能期望任何小于 O(n) 的值,这可能会也可能不会满足你的期望。如果没有,您应该更改数据结构。如果是这样,您可以使用std::min_element,这样:

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    int refElem = 42;
    std::vector<int> v{1, 5, 36, 50};
    auto i = min_element(begin(v), end(v), [=] (int x, int y)
    {
        return abs(x - refElem) < abs(y - refElem);
    });

    std::cout << std::distance(begin(v), i); // Prints 2
}

另一方面,如果向量已排序,则可以使用具有对数复杂度的std::lower_bound()std::upper_bound()

如果您认为复杂性是性能问题,请在决定更改数据结构之前进行一些测量。由于向量将它们的元素存储在内存的连续区域中,因此导致高速缓存命中率的线性搜索通常会优于计算效率更高的数据结构算法,该算法在内存中到处分配其元素,从而导致频繁的缓存未命中。

【讨论】:

    【解决方案2】:
    1. 看起来线性搜索是您的选择(至少对于未排序的向量。看起来排序向量只是为了搜索没有意义。

    2. 一般来说,一切都取决于你在“最近”下的意思。这个“最接近的”可能应该作为一元谓词来实现。如果元素相等,谓词应该返回类似 0 的值,并且某个值越大,元素与引用的距离越小。

    3. 1234563 .
    4. 您可能会从检查元素是否相等中获得一些好处,如果相等,则打破循环。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2014-12-11
      • 2012-02-13
      • 1970-01-01
      • 2011-02-21
      相关资源
      最近更新 更多