数组中有1002个数字,两个数字相同。你如何有效地在这个数组中找到相同的数字,或者是否有一个有效的算法?
这是我的算法:
for i in range(0, 1002):
for j in range(i+1, 1002):
if(a[i]==a[j]):
return a[i]
答案 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²),与原始提案相同。