【问题标题】:Does array have a unique element?数组是否具有唯一元素?
【发布时间】:2011-02-20 16:58:29
【问题描述】:

我正在寻找最有效的算法来检查数组中是否包含唯一元素。结果不必是唯一元素,只是相应的真或假。我知道我可以使用哈希表或类似的方法达到 O(n) 效率,但我仍在寻找在空间方面也更有效的结果。

e- 数组未排序,包含整数。

【问题讨论】:

  • 嗨,数组包含整数。
  • 是的,我忘记添加了。这是一个未排序的数组,谢谢。
  • 不,两者都不正确。我想知道数组 /has/ 是否有唯一元素;它可以有几个独特的元素,但我只想知道它是否有一个。也就是说,该算法对于 {3,4,4,5} 或 {1,2,2} 等数组是正确的,但对于 {2,4,2,4} 是错误的。 (编辑:看起来我回复的评论被删除了......)
  • 这些整数的范围是多少?如果你能保证整数可以有的不同值的数量是 k,那么我可以给你一个简单的 O(n)-time, O(k)-space 算法。

标签: arrays algorithm performance


【解决方案1】:

如果可能值的数量很小并且事先已知,则可以使用位数组(时间上为 O(n),空间上为 O(n),并且比哈希表需要更少的空间) .

如果可能值的数量很大,并且您需要它是确定性的,那么您可以使用哈希表(如果您有良好的哈希函数并且不需要的话,则为 O(n)增长哈希表)或就地排序列表(这是 O(n*lg(n) 排序,加上 O(n) 搜索第一个唯一元素)

如果可能值的数量很大,则不需要确定性,如果要查看特定元素是否在集合中,也可以使用Bloom Filter。 Bloom Filter 比 hash map 更节省空间,但存在误报的可能性(数据结构认为元素在集合中,但实际上不在集合中)

【讨论】:

  • 我还没有听说过布隆过滤器,它听起来确实很有趣。谢谢。
【解决方案2】:

我不确定 O(n) 但使用 O(n^2) 你可以获取一个元素并保持它与其他元素异或

【讨论】:

  • XOR 会给你唯一的元素,如果有偶数个非唯一元素
  • 如果您对 O(n^2) 算法感到满意,您不妨将每个元素与其他元素进行比较。不过,我猜是 O(1) 空间。 :-)
【解决方案3】:

php中有array_keys()这个函数

array array_keys ( array $input [, mixed $search_value [, bool $strict = false ]] )

如果设置了可选参数 $search_value,该函数将只返回找到的值的键。如果返回的只有 on 数组键,那么值必须是唯一的。

我想我的回答有点针对(语言)特定的,我不知道这个函数的大 O。你必须自己测试它。 :)

[更新]:我发现 this article 描述了 array_keys() 是 O(n)。

【讨论】:

    【解决方案4】:

    三种不同的方法具有不同的空间和时间复杂度:

    1) 两个循环:时间 O(n^2),空间 O(1)。

    2a) 排序然后线性检查:对于一般情况,时间 O(nlogn),空间:O(1)。 2b)非比较排序(基数,计数,...)然后检查:时间O(n),空间O(n)

    3) 存储成员的哈希表或数组:时间 O(n),空间 O(n)。

    所以基本上,你应该选择 2a(空间限制)或 3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2012-08-20
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多