我在确定2种算法的时间复杂度方面存在2个问题。
使用比较确定一组 n 不同数字中最小的3个数字。
在这里,我想到的方式是采取3个变量(例如:MIN 1 ,MIN 2 & MIN 3 其中MIN 1 是最小的& MIN 3 是这3个中最大的一个),用列表的1 st 3元素初始化它们,扫描列表一次。对于列表中的每个数字x,我们有以下4种情况:
- 如果 x<最小 1 然后,Min 3 = Min 2 ; Min 2 = Min 1 ;最小 1 = x;
- 否则,如果最小 1 < x<最小 2 然后,Min 3 = Min 2 ; Min 2 = x;
- 否则,如果 Min 2 < x<最小 3 然后,最小 3 = x;
- 否则,如果 Min 3 < x 然后,什么都不做
醇>所以,基本上在最坏的情况下需要 3n比较,在最好的情况下需要 0比较。
如果可以以更简单(更少时间限制)的方式完成,请纠正我。实际上我对选项 3 和 4 感到困惑。
使用比较确定一组 n 不同数字中的最小数字和最大数字。
像以前一样使用类似的参数我得出答案 2(n-1)。虽然我仍然对选项 2 和 4 感到困惑。
答案 0 :(得分:3)
问题1: 您可以通过首先与MIN2进行比较,将算法改进为2n比较。这仍然是O(n)。 要查看n + O(1)是不够的,请注意有n *(n-1)*(n-2)种可能性,其中MIN1,MIN2和MIN3位于其中。 以对数为基数2得到所需比较数的下限。
问题2: 这可以通过比较两个连续的元素,然后将较小的与当前的最小值进行比较,将较大的值与当前的最大值进行比较,在3 * ceil(n / 2)中完成。