【问题标题】:Data structure - Check if array contain 2 integers that the first one is bigger by 2 times from the second one数据结构 - 检查数组是否包含 2 个整数,第一个整数比第二个大 2 倍
【发布时间】:2015-06-28 15:38:33
【问题描述】:

我想知道是否有办法检查数组是否包含 2 个整数(整数 > 0),第一个整数是第二个整数的 2 倍。

例如:

44 6 2 5 9 22 5 3 4 31 

2 和 4 应该返回 true。

如何在 O(n) 的时间复杂度下做到这一点?

【问题讨论】:

    标签: algorithm data-structures time-complexity


    【解决方案1】:

    散列每个整数。对于每个整数 x,检查 2*x 是否在哈希表中。散列是 O(n),每次检查是 O(1),所以总复杂度是 O(n)。

    【讨论】:

    • 感谢您的回答。但是当我检查每个 x 如果 2*x 在哈希表中时,时间复杂度是 O(n^2) no?
    • 没有。对于每个 x,检查 2*x 是否在哈希表中是一个常数时间操作。你检查 n 个数字,所以总数是 O(n)。
    • @Trying_To_Understand 您正在对数组进行两次线性传递,因此所花费的时间仍然是 O(n),尽管比单次通过数组的时间要差一些。您可以将这个答案的各个方面(使用哈希表)与 Lior 的答案的各个方面(检查 /2 和 *2)结合起来,以提出一个相当简单且高性能的单通解决方案。
    【解决方案2】:

    您可以使用 O(2^m) 内存在 O(n) 时间内完成此操作,其中 m 是每个输入元素的位数。

    假设输入元素是m位整数(它们的范围是0..(2^m)-1):

    一次性解决方案:

    • 定义大小为 2^m 位(= 2^(m-3) 字节)的数组a
    • 零数组一个
    • 对于每个源元素 e
      • 如果 e 是偶数
        • 如果 a[e/2]==1 则找到
      • 如果 e
      • 如果 a[e *2]==1 则找到
    • 设置a[e] = 1

    提高内存要求:

    • 没有必要存储任何奇数 e > 2^(m-1),因为 e/2 和 e*2 都不可行。这样可以节省 25%。
    • 两遍解决方案:在第一遍中仅存储偶数整数,在第二遍中搜索 2*e。这样可以节省 50%

    哈希表会给你 O(n) 摊销(不是最坏的情况),并且只有当输入集很小时才需要更少的内存(你需要自己存储值,使用大表以避免频繁的冲突,管理列表等)

    【讨论】:

    • 这真的是O(n)内存吗?数组的大小,以及因此使用的内存,将取决于最大数字的大小,不是吗?我想内存使用是m的一些功能。
    • 这是一个经过深思熟虑的高效答案,但也许可以做得更好。由于我们只对 2 的幂感兴趣,因此可能通过 log 以 e 的 2 为底(即数字的 2 的幂)来索引我们的缓存。然后你可以检查a[log_2(e) +1] 或a[log_2(e) - 1] 是否存在,如果找到则返回true。这将是内存中的 O(m)。
    • @Asad:为什么要将我们的兴趣限制在 2 的幂?
    • 谢谢您的回答先生。 Toda raba ;) @LiorKogan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多