在数组中查找副本的最快方法

时间:2015-03-08 15:27:00

标签: algorithm sorting

我在接受采访时被问到,在 n 元素数组中找到副本的最短或最快方法是什么,可以是整数或浮点数。虽然在堆栈溢出中搜索,特别是python使用的解决方案,但是如果我想在某些编程语言(如C或C ++)中实现相同的,我可以使用什么算法,或者我有什么方法可以在O中执行它(N)?

2 个答案:

答案 0 :(得分:3)

虽然它可能不是最节省空间的算法,但您可以使用散列映射来存储遍历数组时遇到的每个值(键)。然后,对于数组中的每个步骤,您将在哈希表中执行O(1)查找,以查看您之前是否已看到此值。此解决方案是O(N),因为您只遍历大小为N的数组一次,并且在每一步中都执行O(1)哈希查找。

这是C ++中实现此方法的方法:

#include <map>

bool hasDupicate(int* input, int size) {
  std::map<int, int> m;
  for (int i=0; i < size; ++i) {
    if (m.find(input[i]) != m.end()) {
      return true;
    } else {
      // record the element you just saw in the map
      m.insert(std::pair<int, int>(input[i], 1));
    }
  }

  // could not find any duplicate
  return false;
}

答案 1 :(得分:1)

由于蒂姆询问有关排序的解决方案,这里是

bool hasDuplicate(std::vector<int> & input)
{
    std::sort(input.begin(), input.end());
    return std::adjacent_find(input.begin(), input.end()) != input.end();
}

int main() {
    std::vector<int> A { 2, 4, 9, 3, 8, 4, 5, 1 };
    std::cout << hasDuplicate(A) ? "has duplicates" : "no duplicates";
    return 0;
}

它具有时间复杂度O(n log n)并重新排序输入序列的元素,但不需要额外的内存分配,因此在许多实际情况下,它可能比使用散列表的渐近更快的O(n)算法更快以上是蒂姆。