计算hasmap与二进制搜索的O(n)

时间:2017-02-20 12:57:22

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

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

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

O(n)解决方案将是:

  1. 删除数组的第一个元素(e0)
  2. 将其添加到hashmap
  3. 删除数组的第一个元素(e1)
  4. 目标是e1和x
  5. 之间的差异
  6. 如果目标存在于哈希映射中,则返回该对
  7. 将e1添加到hashmap
  8. 重复步骤3-6,直到找到一对或用完元素
  9. 这是最糟糕的情况O(n),因为你只需要对数组进行一次传递。

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

    1. 从数组中删除第一个元素(e1)
    2. 目标是第一个元素和x
    3. 之间的差异
    4. 二进制搜索数组的其余部分以获取目标
    5. 如果存在则返回该对
    6. 重复步骤1-4,直到找到一对或用完元素
    7. 这是O(n log n)因为您需要在最坏的n / 2次运行二进制搜索(log n),给出O(n / 2 * log n),其中大O是O(n * log) n)的

      这是对的吗?

2 个答案:

答案 0 :(得分:2)

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

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

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 < begin和其他角落案件的情况。

答案 1 :(得分:1)

在某些课程中,这听起来像是家庭作业的问题。我不会为你解决这个问题 - 虽然很容易在网上找到解决方案 - 但我会告诉你我99%肯定你的解决方案必须花费O(n)时间作为最坏情况的复杂性即可。基于散列的解决方案每次查找只需要O(1)时间平均