【发布时间】:2017-07-09 18:28:38
【问题描述】:
我试图澄清如何为以下情况计算 O(n):
给定一个排序数组,你如何在 O(n) 中找到两个和等于给定数 x 的数?
O(n) 解决方案是:
- 删除数组的第一个元素 (e0)
- 将此添加到哈希映射中
- 删除数组的第一个元素 (e1)
- 目标是e1和x之间的差异
- 如果目标存在于哈希映射中,则返回该对
- 将 e1 添加到哈希映射中
- 重复步骤 3-6,直到找到一对或用完元素
这将是最坏的情况 O(n),因为您只需要对数组进行一次传递。
一个 O(n * log n) 的解决方案是:
- 从数组中删除第一个元素 (e1)
- 目标是第一个元素和x之间的差异
- 对目标数组的其余部分进行二进制搜索
- 如果存在则返回该对
- 重复步骤 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