【问题标题】:Efficient algorithm for finding the same number [duplicate]查找相同数字的有效算法[重复]
【发布时间】:2014-08-05 15:22:27
【问题描述】:

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

这是我的算法:

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

【问题讨论】:

  • 数字的取值范围是多少?使用散列!它会在 O(n) 时间内工作!
  • 这取决于数组元素的允许范围。
  • 数字范围未指定为1到1002之间。
  • 仍然会有一些范围!那是什么范围?您对内存高效算法的要求是什么?还是高效的算法?
  • 如果没有定义“效率”,这是一个没有真正答案的模棱两可的问题。如果我作为面试官问这个问题,我会在我关心答案之前让候选人问我的意思。

标签: algorithm


【解决方案1】:

这应该可行!

#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;
}

【讨论】:

  • 我不会把身份函数称为哈希函数,所以这个名字有点误导 :) 你真的应该使用RANGE = 1003
  • 注意,这个方案至少需要1000000001次操作才能清零hash,大约是原来1000*10001的1000倍左右,无法应对大于1000000001的数字。
  • @NiklasB。如果我使用 RANGE = 1003,那么我将不得不将我的值范围限制为 1003,但 OP 说没有定义这样的值范围,这就是我使用 RANGE = 1000000001 的原因。是的,哈希函数有点误导! :p
  • 那么在这种情况下,您必须使用哈希表;)
【解决方案2】:

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

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)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您的算法一点也不差!在最坏的情况下,您循环 n*(n-1)/2,这意味着复杂度为 O(n²)。

      最有利的条件是排序数组。然后,您可以循环遍历它,将每个元素与其前身进行比较。最糟糕的是 n-1 比较,否则说复杂度为 O(n)。

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

      使用哈希...好吧,如果内存不是问题,这是最佳的(请参阅@Nullpointer 的出色解决方案。算法成本是简单的遍历,即 O(n)。

      但是在现实生活中,您可能会遇到内存限制,这意味着更短的哈希表和具有冲突风险的哈希函数(例如表的模大小)。出于这个原因,您需要为每个哈希值存储匹配值的列表。在这种情况下,最坏的情况是所有数字都具有相同的哈希 H。在这种情况下,您将计算每个哈希(简单的 O(n) 遍历),但是在插入哈希时,您需要循环遍历 colsion列表。快速计算表明,您将再次进行 n*(n-1)/2 比较,并且再次进行复杂度 O(n²),与您的原始提案相同。

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 2014-12-09
        • 2020-01-03
        • 2021-08-31
        • 2011-04-06
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多