【发布时间】:2017-09-24 06:18:25
【问题描述】:
我正在尝试了解算法的时间复杂度。我的教授已经把它推到了大 O 之外,并希望我们能够推导出数学函数的算法。我很难概念化这是如何完成的并且正在寻求帮助。在我的课堂笔记中,提供了一个选择排序算法(如下面的代码所示)。笔记提出了以下问题:“导出一个函数 f(n),它对应于 minIndex 或 nums 的任何位置在最坏情况下被修改的总次数。 现在笔记告诉我答案是 f(n)= 1/2n^2 + 5/2n + 3。我想知道是否有人可以解释这是怎么发生的。
我的教授告诉我们计算内循环中的操作并找出解决办法。所以我相信在最坏的情况下,在内部循环中 if 语句总是执行,这意味着我们运行循环 n-i-1 次,我通过取 n 得到这些值(for循环必须小于的边界并减去它由起始条件 (i+1)。然后我查看外部循环,我看到它从 i 开始直到它到达 n-1,所以它可以写成 (n-1)-i 或就像内部循环一样循环,n-i-1。进一步看,外部循环中有三个修改,所以我们得到 (n-i-1)+3 (我可以把它写成 (n-i+2) 吗?
内循环最坏情况下的修改次数: n-i-1
外循环在最坏情况下的修改次数: (n-i-1)+3
现在我想知道你如何计算完成的两个不同的修改并变成 f(n)= 1/2n^2 + 5/2n + 3。
public static void selectionSort(int[] nums) {
int n = nums.length;
int minIndex;
for(int i = 0; i < n-1; i++) {
//find the index of themin number.
minIndex = i;
for(int j = i+1; j < n; j++) {
if(nums[j] < nums[minIndex]) {
minIndex = j;
}
int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
}
【问题讨论】:
标签: java algorithm loops for-loop code-analysis