用于查找相同数字的高效算法

时间:2014-06-15 18:41:33

标签: algorithm

数组中有1002个数字,两个数字相同。你如何有效地在这个数组中找到相同的数字,或者是否有一个有效的算法?

这是我的算法:

for i in range(0, 1002):
    for j in range(i+1, 1002):
        if(a[i]==a[j]):
           return a[i]

4 个答案:

答案 0 :(得分:2)

这应该有效!

#include<stdio.h>
#define RANGE 1000000001
int main()
{
  int arr[1002];//your all numbers;
  short int hash[RANGE];//Your range of numbers 
  long long int i;
  for(i = 0; i < RANGE; i++)
    hash[i] = 0;
  for(i = 0; i < 1002; i++)
    {
      if(hash[arr[i]] != 0)
    {
      printf("Duplicate number is:%d\n",arr[i]);
      break;
    }
      else
    hash[arr[i]]++;
    }
  return 0;
}

答案 1 :(得分:1)

我认为最有效的解决方案是使用哈希集:

from sets import Set
s=Set()
for x in [1,2,3,4,5,2,3,1]:
  if x in s:
    print x
    break
  s.add(x)

答案 2 :(得分:0)

如果您的值是数字,则可以使用radix sort填充缓冲区并检查出现两次的元素。

答案 3 :(得分:0)

你的algortihm一点都不差!在最坏的情况下,你循环n *(n-1)/ 2,意味着O(n²)的复杂性。

最有利的条件是排序数组。你可以通过循环比较每个元素与它的前身。最糟糕的是n-1比较,其他人说O(n)的复杂性。

但是,我假设数组没有排序。对它进行排序意味着排序的成本。 Quiksort算法在这里非常好,有一个最坏的O(n²)。因此,排序+遍历的成本与您的算法相当。

使用散列......好吧,如果内存不是问题,那么它是最优的(参见@Nullpointer的优秀解决方案。算法成本是简单的遍历,即O(n)。

但是在现实生活中,您可能会遇到内存限制,这意味着更短的哈希表和具有冒号风险的哈希函数(例如表的模数)。因此,您需要为每个哈希值存储匹配值列表。在这种情况下,最坏的情况是所有数字都具有相同的散列H.在这种情况下,您将计算每个散列(简单的O(n)遍历),但是当插入散列时,您需要循环切换名单。快速计算表明,你再次进行n *(n-1)/ 2比较,再次得到强制性O(n²),与原始提案相同。