计算 On) 用于 hashmap 与二进制搜索

Calculating O(n) for a hasmap vs binary search

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

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

O(n) 的解决方案是:

  1. 删除数组的第一个元素 (e0)
  2. 将其添加到哈希映射
  3. 删除数组的第一个元素 (e1)
  4. 目标是e1和x之间的差值
  5. 如果目标存在于散列映射中return 对
  6. 将 e1 添加到 hashmap
  7. 重复步骤 3-6,直到找到一对或 运行 个元素

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

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

  1. 从数组 (e1) 中删除第一个元素
  2. 目标是第一个元素与x的差值
  3. 二进制搜索数组的其余部分以获得目标
  4. 如果存在 return 对
  5. 重复步骤 1–4 直到找到一对或 运行 个元素

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

这是正确的吗?

这听起来像是您正在学习的某些课程中的家庭作业问题。我不会为你解决它——虽然很容易在网上找到解决方案——但我会告诉你,我 99% 确定你的解决方案必须花费 O(n) 时间,因为 worst-case 复杂度。 Hash-based 解决方案每次查找仅花费 O(1) 时间 平均

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

您的第一个算法也使用 O(n) space,因为 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 < begin 和其他极端情况。