【问题标题】:determine if an array has the numbers a to b each once [duplicate]确定一个数组是否每个都有数字 a 到 b [重复]
【发布时间】:2014-02-17 01:06:03
【问题描述】:

给定一个大小为 n 的数组 A,以及 b-a+1=n 的两个数字 a 和 b,我需要确定 A 是否包含 a 和 b 之间的每个数字(恰好一次)。

例如,如果 n=4 且 a=1,b=4,那么我正在查看 A 是否是 [1,2,3,4] 的重排。

实际上,我需要使用 O(1) 空间(无哈希表)来执行此操作。

我的第一个想法是对 A 进行排序,但我必须在不重新排列 A 的情况下这样做,所以就这样了。

我的第二个想法是遍历 A 一次,将条目相加并检查它们是否在正确的范围内。最后,我必须得到正确的总和(对于 a=1,b=n,这是 n(n+1)/2),但这并不总能捕获所有内容,例如[1,1,4,4,5] 通过了 n=5,a=1,b=5 的测试,但不应该。

我唯一可行的想法是遍历数组 n 次,确保每个数字只看到一次。有更快的解决方案吗?

【问题讨论】:

  • n 有多大?为什么需要 O(1) 空间?
  • 听起来像是面试题。
  • 不是面试问题或作业。对于大小,n 可以达到 10^9 或更多。我的解决方案有效,但必须有更好的解决方案。
  • O((b-a) * n)(最坏情况)的执行顺序是否符合您的期望?
  • 另见:mathoverflow

标签: c algorithm permutation


【解决方案1】:

您只需对您已经提到的n(n+1)/2 方法进行少量修改,只需通过数组即可完成此操作。

为此,遍历数组,忽略 a..b 范围之外的元素。对于正确范围内的数字,您需要跟踪三个值:数字的总和、数字的平方和以及数字的计数。

您可以预先计算出数字总和和平方和(以及计数)的正确值。

然后将您的结果与预期结果进行比较。例如,假设您正在搜索 1、2、3、4。如果您只使用数字的总和,那么 [1, 1, 4, 4] 将产生正确的结果(1+2+3 +4 = 10, 1+1+4+4 = 10),但如果你还加上平方和,问题就很明显了:1+4+9+16 = 30 但 1+1+16+16 = 34.

这本质上是对问题应用(至少非常相似的)布隆过滤器。给定一个足够大的组和一对固定的函数,会有一些不正确的输入会产生正确的输出。您可以通过增加应用的过滤器数量将这种可能性降低到任意低的值。或者,您可能可以设计一个不会被愚弄的自适应算法 - 即兴发挥,如果您的输入范围是 N,那么将每个数字提高到 N+1 次方可能会确保您只能得到正确的结果与完全正确的输入(但我承认,我不能绝对确定这是正确的)。

【讨论】:

  • 这对于较小的 N 是个好主意,但将数字提高到 10^9 并不容易。
  • @Daniel:视情况而定。有一些方法(例如广泛用于 RSA 密码学)可以有效地将数字提升到大幂次。
  • 简单示例:两个集合 6,5,1 和 7,3,2 具有相等的计数、总和和平方和。
【解决方案2】:

这是一个 O(1) 空间和 O(n) 解决方案,可能会有所帮助:-

  1. 在 (a,b) 范围内查找 meanstandard deviation
  2. 扫描阵列并找出均值和标准差。
  3. 如果有任何数字在 (a,b) 之外,则返回 false
  4. if(mean1!=mean2 || sd1!=sd2) return false else true.

注意:我可能不是 100% 准确。

【讨论】:

  • 这对于 n 大(甚至 100)来说根本不是很准确。
  • @Daniel 我不认为这取决于 n 的大小,而是更多地取决于数字的分布
【解决方案3】:

这是一个因哈希冲突概率而失败的解决方案。

取一个出色的(例如加密的)哈希函数 H。

Compute: xor(H(x) for x in a...b)
Compute: xor(H(A[i]) for i in 1...n)

如果两者不同,那么您肯定没有排列。如果两者相同,那么您几乎可以肯定得到一个排列。您可以通过将随机种子包含到哈希中来使其免受被挑选以产生哈希冲突的输入。

这显然是 O(b-a) 的运行时间,需要 O(1) 的外部存储,而且实现起来很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2021-02-07
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多