这是我的作业问题: 用示例快速排序,合并排序和堆排序来解释。 通过每种排序方法进一步计算操作次数。
我不明白在“计算操作次数”的背景下我到底要回答的是什么?
我在第2章的coremen书中找到了一些东西,他们解释了插入通过计算每个语句的运行时间来排序算法的运行时间....
我必须以类似的方式做吗?
答案 0 :(得分:1)
计算操作次数也称为analyze the algorithm complexity
。我们的想法是大致了解在大小为N的输入上执行算法所需的最坏情况下有多少操作,这为您提供了该算法所需的计算资源的上限。并且由于每个操作本身(例如乘法或比较)是有限操作并且需要确定性时间(即使它在不同的机器上可能是不同的),以便了解算法的好坏,特别是与其他算法,你需要知道的是大量的操作。
以下是冒泡排序的示例。假设您有两个数字的数组。要对它进行排序,您需要比较两个数字并进行交换。由于比较和交换是单个操作,因此执行它们的确切时间是最小的并且本身并不重要。因此,可以说N = 2时,操作次数为O(N)= 1。但是对于三个数字,在最坏的情况下你需要三个操作 - 比较第一个和第二个操作并可能交换它们,然后比较第二个和第三个并交换它们,然后再比较第一个和第二个。当你继续推广冒泡排序时,你会发现有可能对N个数字进行排序,你需要对第一个数字进行N次操作,对第二个数字进行N-1,依此类推。换句话说,O(N)= N +(N-1)+ ... + 2 + 1 = N *(N-1)/ 2,足够大的N可以简化为O(N)= N ^ 2
当然,你可以欺骗并在网上找到三种排序算法中每种算法的O(N)数字,但我会建议你花点时间尝试自己想出这个数字。 。即使你弄错了,比较你的估计以及你如何用实际的方法来估计它们的复杂性将有助于你更好地理解分析你将来编写的特定软件的复杂性的过程。
答案 1 :(得分:0)
这称为big O notation。
这个page向您展示了最常见的排序算法及其通过大O表示的比较。
计算复杂性(最差, 平均和最佳比较数 对于几个典型的测试用例,请参阅 下面)。通常,平均数很好 比较/操作是O(n log n)和坏是O(n ^ 2)
答案 2 :(得分:0)
我认为这项任务是为了让您了解如何计算算法的复杂性。例如,冒泡排序算法的复杂度为O(n ^ 2)。
// Bubble sort method.
// ref: [http://www.metalshell.com/source_code/105/Bubble_Sort.html][1]
for(x = 0; x < ARRAY_SIZE; x++)
for(y = 0; y < ARRAY_SIZE-1; y++)
if(iarray[y] > iarray[y+1]) {
holder = iarray[y+1];
iarray[y+1] = iarray[y];
iarray[y] = holder;
}
如上所述,两个循环用于对数组进行排序。设ARRAY_SIZE为n。然后操作次数为n *(n-1)。这使得n ^ 2-n由O(N ^ 2)表示。这是一个很大的符号。我们只取n具有最大指数,最高增长率的n。如果它是2n ^ 2 + 2n,那么它仍然是O(N ^ 2),因为在计算复杂度时也省略了常数。关于Big O Notation的维基百科文章非常有用(正如Leniel在帖子中提到的那样)。
这是你的功课,所以我没有详细介绍你提到的算法。但你需要像这样做数学。但我认为你被问到的是实际的操作次数。因此,对于上面的示例,如果ARRAY_SIZE为10,则答案为10 * 9 = 90。要查看差异,您需要在示例代码中使用相同的数组。