原文地址:https://my.oschina.net/gooke/blog/684026
一下为本人笔记:)
场景:在解决计算机科学领域的问题时,经常有好多个方法都可以,想找到最优的方法,就有了时间复杂度。
时间复杂度
1.基于时间来衡量算法的效率高低。
2.时间:算法执行一个特定输入规模的函数所需要的时间。
案例!:
编写一个函数,找出数组中的最小值。
方法一:只是简单的遍历数组的每一个元素,然后用变量curMin保持当前的最小值。
int CompareSmallestNumber(int array[]) { int curMin; //把数组的第一个元素赋值给当前最小值 curMin = array[0]; /* * 遍历数组找出最小值 */ for (int x = 1; x < 10; x++) { if (array[x] < curMin) { curMin = array[x]; } } // 返回最小值 return curMin; }
方法二:让数组中的每一个元素和数组中的所有元素对比,如果某个元素小于或等于数组中所有的元素,那么这么元素就是数组中的最小元素。
int CompareToAllNumbers(int array[]) { boolean isMin; int min =0 ; /* * 遍历数组中的每一个元素 */ for (int i = 0; i < 10; i++) { isMin = true; for (int j = 0; j < 10; j++) { /* * array[i]和数组的其他元素比较 * 如果array[i]大于数组中的任何一个元素 * 就说明array[i]不是最小值 */ if (array[i] > array[j]){ isMin = false; } } //如果是最小元素,保存下该元素并结束外层循环 if (isMin){ min =array[i]; break; } } return min; }
如何计算呢
“大O”会设法表达出n个输入项被“使用”了多少次。“使用”一词在不同的算法中会有不同的意思,在一个算法中表示“输入项”和一个常量乘了多少次,而在另外一个算法中可能表示“输入项”被往数据结构中添加了多少次,等等。
先来看方法一:
n(例子中是10)个输入项,每一个输入项仅在和最小值比较的时候被使用了一次。在“大O表示法”(Big-O Notation)中,它被写作O(n),也就是我们熟知的线性时间(linear time)。线性时间意味着,算法运行所需的时间和输入规模成正比。
我们把变量curMin初始化为数组的第一个值,也就是说,“输入项”被使用了一次。所以“大O表示法”应该是O(n+1)才对。实际上,“大O表示法”关心的是当输入规模n趋于无穷大时算法的运行时间。当‘n’趋于无穷大时,常量1就变得微不足道,可以忽略了。
所以,函数CompareSmallestNumber的“大O表示法”是O(n)而不是O(n+1)。
再看方法二:
这个算法最坏的情况是怎样的?数组中的最小值是数组的最后一个元素,就是最坏的情况,因为为了找到最小值,它不得不把数组从头到尾遍历一遍。数组中的每一个元素,都要和其他元素(包括自己)比较一次,一共做了100次比较,因为我们的输入规模是10,10x10=100=10²。当输入规模是n时,输入项会被使用n²次。O(n²)。
还有一些常见的大O符号,如 O(n²),O(log n),O(n log n)。