【发布时间】:2015-08-29 00:26:55
【问题描述】:
我遇到了作业问题:
对于在任意大小为
n的整数数组中找到最大元素的最优算法的最佳情况运行时间,其中哪一个是一个渐近严格的上限
- O(log n)
- O(n2)
- O(n)
- O(1)
- O(n log n)
根据我的理解,它是 O(n),因为即使它是我们仍然需要的最好情况 扫描 arr 以获得结果。请纠正我
【问题讨论】:
标签: algorithm big-o time-complexity lower-bound
我遇到了作业问题:
对于在任意大小为
n的整数数组中找到最大元素的最优算法的最佳情况运行时间,其中哪一个是一个渐近严格的上限
- O(log n)
- O(n2)
- O(n)
- O(1)
- O(n log n)
根据我的理解,它是 O(n),因为即使它是我们仍然需要的最好情况 扫描 arr 以获得结果。请纠正我
【问题讨论】:
标签: algorithm big-o time-complexity lower-bound
是的,没错。看到这一点的一种方法是通过对抗性参数。假设您有一个算法据称可以在数组中找到最大值,但不会至少检查每个数组元素一次。
假设我在某个数组 A1 上运行您的算法,该数组仅由数字 0 组成。由于您的算法不会查看数组中的所有位置,因此有些位置它没有看着;称该位置为 k。现在,将 A2 定义为与数组 A1 相同的数组,只是定义了 A2 中位置 k 的元素为 1。
现在,如果我在 A2 上运行您的算法会发生什么?由于您的算法从未查看过 A1 中的位置 k,并且 A2 与 A2 相同,但位置 k 除外,因此您的算法不能区分 A1 和 A2。因此,它对 A1 所说的任何内容都必须与它对 A2 所说的相同。
不过,这是个问题。如果你的算法说最大值是 0,那么 A2 是错误的,它的最大值是 1。如果你的算法说最大值是 1,那么 A1 是错误的,其最大值为0。因此,该算法至少在一种情况下是错误的,因此它不可能是找到最大值的正确算法。
这个参数表明,任何总是在数组中找到最大值的确定性算法都必须查看该数组中的所有位置,因此运行时间必须是 Ω(n) 才能正确。
希望这会有所帮助!
【讨论】:
O(n) 是运行时间。在你的情况下是真的。 “任意大小为 n 的整数数组”意味着它可以是任意整数数组。
当数组被排序时,O(1) 是可能的。 如果我们首先使用快速排序对数组进行排序,然后选择最大的项目,则 O(nlog n) 是可能的。 如果我们首先使用冒泡排序对数组进行排序,然后只选择最大的项目,则 O(n^2) 是可能的。
【讨论】: