一,算法是什麼?
算法就是計算或解決問題的步驟,例如:菜譜, 是一種對按步驟解決問題的實現方式的描述,不同的是算法是嚴密的,而且算法的步驟都是用數據方式來描述,十分的明確。
二,如何選擇算法
最重要的是算法的運行時間,即從輸入數據到輸出結果這個過程所花費的時間。當然計算器內存的大小也是考量之一。
三,初識算法
1,實現一個有50個不同數字組成的數列中從小到大排列
1),全排列算法
全排列算法的一個重要思路,就是將數列中的元素的排列,與某種順序建立一一映射的關係,按照這種順序,將集合的所有排列全部輸出。這種順序需要保證,既可以輸出全部的排列,又不能重複輸出某種排列,或者循環輸出一部分排列。
假設數列爲 :321
321, 312,231, 213, 132, 123 6種方式
如果是:12345 那麼將有 120
1。。。10 那麼將有 3628800
。
。
1。。。50 大概有10^40種
2),實現思路
① 生成一個由n個數字構成的數列(不和前面生成的數列重複);
②如果①中生成的數列按從小到大的順序排列就將其輸出,否則回到步驟①。.
3),引入階乘概念
運氣好一次就行,假設運氣不好,最後一次實現,n個數字就有n!中不同的排列方式(n! = 1*2*3...(n-2)(n-1)n)。
n! = 1*2*3...(n-2)(n-1)n
階乘:自然數n的階乘寫作n!。
一個正整數的階乘是所有小於及等於該數的正整數的積,並且有0的階乘爲1。
2,那麼我們換一種方式,選擇排序算法
1)選擇排序算法
選擇排序法是一種不穩定的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的數據元素排完。
2)實現思路
①從數列種尋找最小值
②將最小值和數列的最左邊的數字進行交換,排序結束。回到①
首先,爲了在第一輪找到最小的數字,需要從左往右確認數列數字,只要查詢n個數字即可。在接下;來的第2輪中,需要從n-個數字中尋找最小值,所以這個步驟進行到第n輪的時候,需要查詢的次數如下。
n+(n-1)+(n-2)+...3+2+1=n(n+1)/2 <= n^2
n=50的時候 ,最多2500。假設一個數需要一秒,那顯然選擇排序比全排列算法效率要高的多。
四,計算運行時間的方法
單單考慮不同算法在運行時間上的區別,還要了解根據數據量的大小,算法的運行時間具體會產生多大的變化。
如果是一個兩位數的數列呢?那顯然全排列算法的2步要比選擇排序算法的3步更省時間。
1,如何求得運行時間
如果我們使用“步數”來描述運行時間,“1步”就是計算的基本單位。通過計算“計算從開始到結束總共執行了多少步”來算出運行時間。
①從數列種尋找最小值
②將最小值和數列的最左邊的數字進行交換,排序結束。回到①
如果數列種有n個數字,那麼①種“尋找最小值”的不走只需要確認n個數字即可,將“確認1個數字的大小”作爲操作的基本單位,需要的時間設爲T1 ,那麼步驟①的運行時間就是 : n * T1
接下來,把“對連個數字進行交換”也作爲操作的基本單位,需要的時間設爲T2。那麼①和②總共重複n次,每經過“1輪”,需要查找的數字就減少1個,因此總的運行時間如下
(n*T1 + T2)+( (n-1)*T1 +T2)+...(2*T1 +T2)+(T1+T2)
= 1/2 T!n(n+1) + T2n
= 1/2 T1*n^2 + (1/2T1 +T2)n
我們已經得到了運行時間,但這個結果並不直觀,還可以簡化。T1,T2都是基本單位,與輸入無關。會根據輸入變化而變化的只有數列的長度n,所以接下來考慮n變大的情況。n越大,n^2也就越大,其他部分相對變小.所以說對結果影響最大的是n^2
1/2 T1*n^2 + (1/2T1 +T2)n = O(n^2)
o 這個符號表示忽略重要項目以外的內容,O(n^2)的含義就是:算法的運行時間最長也就是n^2的常數倍。
比如,當我們知道選擇排序的時間複雜度爲O(n^2),快速排序的時間複雜度爲O(nlogn)時,很快就能判斷出快速排序的運算更爲告訴,二者的運行時間根基輸入的n產生的變化程度也一目瞭然。
快速排序的時間複雜度