【发布时间】:2013-12-10 19:29:51
【问题描述】:
关于确定 2 个算法的时间复杂度,我有 2 个问题。
问题 1
使用比较从一组 n 不同 数字中确定最小的 3 个数字。
- 这 3 个元素可以使用 O(log2n) 比较来确定。
- O(log2n) 是不够的,但是可以使用 n + O(1) 比较来确定它们。
- n + O(1) 是不够的,但是可以使用 n + O(logn) 比较来确定它们。
- n + O(logn) 是不够的,但是可以使用 O(n) 比较来确定它们。
- 以上都不是。
在这里,我想到的方式是取 3 个变量(例如:MIN1, MIN2 & MIN3 where MIN 1 是最小的,而 MIN3 是这 3 个中最大的),用列表的 1st 3 个元素初始化它们并扫描列出一次。对于列表中的每个数字 x,我们有以下 4 种情况:
- if x 1then, Min3 = Min2;最小2 = 最小1;最小值1 = x;
- else if Min12then, Min3 = Min 2;最小值2 = x;
- else if Min23then, Min3 = x ;
- else if Min3then,什么都不做
因此,基本上它需要 在最坏情况下进行 3n 次比较,在最佳情况下进行 0 次比较。
如果可以以其他更简单(时间限制更短)的方式完成,请纠正我。实际上,我对选项 3 和 4 感到困惑。
问题 2
使用比较从一组 n 不同数中确定最小和最大数。
- 这两个元素可以使用 O(log100n) 比较来确定。
- O(log100n) 是不够的,但是可以使用 n + O(logn) 比较来确定它们。
- n + O(logn) 不够,但是可以使用 3.⌈n⁄2⌉ 比较。
- 3.⌈n⁄2⌉ 是不够的,但是可以使用 2.(n-1) 比较。
- 以上都不是。
使用与之前类似的论据,我得出了答案 2(n-1)。虽然我仍然对选项 2 和 4 感到困惑。
【问题讨论】:
-
即使不遍历所有元素至少一次,如何获得最小的元素?
-
对于问题2,如果选项2是候选者,那么选项3当然也是。
标签: algorithm big-o time-complexity