【问题标题】:Calculating O(n) for a hasmap vs binary search计算哈希图与二进制搜索的 O(n)
【发布时间】:2017-07-09 18:28:38
【问题描述】:

我试图澄清如何为以下情况计算 O(n):

给定一个排序数组,你如何在 O(n) 中找到两个和等于给定数 x 的数?

O(n) 解决方案是:

  1. 删除数组的第一个元素 (e0)
  2. 将此添加到哈希映射中
  3. 删除数组的第一个元素 (e1)
  4. 目标是e1和x之间的差异
  5. 如果目标存在于哈希映射中,则返回该对
  6. 将 e1 添加到哈希映射中
  7. 重复步骤 3-6,直到找到一对或用完元素

这将是最坏的情况 O(n),因为您只需要对数组进行一次传递。

一个 O(n * log n) 的解决方案是:

  1. 从数组中删除第一个元素 (e1)
  2. 目标是第一个元素和x之间的差异
  3. 对目标数组的其余部分进行二进制搜索
  4. 如果存在则返回该对
  5. 重复步骤 1-4,直到找到一对或用完元素

这是 O(n log n),因为您需要在最坏的情况下运行 n/2 次二进制搜索 (log n),给出 O(n/2 * log n),在大 O 中是 O(n * log n)

这是正确的吗?

【问题讨论】:

  • 从数组中删除一个元素可能是 O(N),具体取决于您使用的语言/库,因此最好将元素保留在数组中,否则您的运行时间将乘以O(N)。
  • 嗯,指针肯定会更好,谢谢建议

标签: algorithm hashmap complexity-theory binary-search computation-theory


【解决方案1】:

是的,对于这两种算法,您的分析都是正确的。

您的第一个算法也使用 O(n) 空间,因为 hashmap。你可以避免这种情况。

Algo : 
1. Consider begin = 0, and end = last_index
2. Consider data[begin] and data[end]
3. If data[begin] + data[end] > req_sum:
        end=end - 1  // u need to decrease ur total sum
   elif data[begin] + data[end] < req_sum:
        begin = begin + 1  // u need to increase ur total sum
   elif data[begin] + data[end] == req_sum:
          print("found")
4. Continue from Step 2.

显然避免end &lt; begin 和其他极端情况的情况。

【讨论】:

  • 我只是建议他解决这个问题的其他算法。他的任务是证明问题中提到的算法的时间复杂度,而我没有。 :)
  • 其实我是一个自学成才的程序员,所以这更多是出于兴趣。一直在做一些有竞争力的编程和算法优化,所以我试图通过阅读维基百科和观看 YouTube 来解决时间复杂度问题。很高兴得到一些反馈,因为我没有答题卡:-)
【解决方案2】:

这听起来像是您正在学习的某些课程中的家庭作业问题。我不会为你解决这个问题——尽管在网上找到解决方案很容易——但我会告诉你,我 99% 确信你的解决方案必须花费 O(n) 时间作为最坏情况的复杂性。基于散列的解决方案平均而言每次查找仅需 O(1) 时间。

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 2013-10-22
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2010-12-06
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多