演算法簡介

weixin_34007020發表於2018-05-22

程式和演算法的時間複雜度

1.一個程式或演算法的時間效率,也稱“時間複雜度”,有時簡稱“複雜度”
2.複雜度常用大寫字母O和小寫字母n來表示,比如O(n),O(n²)等,n代表問題的規模
3.時間複雜度是用演算法執行過程中,某種時間固定的操作需要被執行的次數和n的關係來度量的,在無序數列中查詢某個數,複雜度是O(n)
4.計算複雜度的時候,只統計執行次數最多的(n足夠大時)那種固定操作的次數,比如某個演算法需要執行加法n²次,除法n次,那麼就記其複雜度是O(n²)
5.複雜度有“平均複雜度”和“最壞複雜度”兩種,兩者可能一致,也可能不一致

例如:順序查詢,平均複雜度為n/2,最壞複雜度為n,複雜度都為O(n),注意這裡不計係數
快速排序,平均複雜度n*log n,最壞複雜度為n²

6.如果複雜度是多個n函式的和,只關心隨n增長增長速度最快的那個函式
7.常見的大O執行時間

O(log n),對數級,包括二分查詢
O(n),線性級,包括簡單查詢即順序查詢
O(n*log n),線性對數級,快速排序
O(n²),平方級,選擇排序,氣泡排序,插入排序
O(nª),多項式級,基於n的a層迴圈
O(n!),階乘級,旅行商問題

二分查詢

例:
A有一個1~100的數,B來猜,可以提問,A只能回答對和錯,要以最少次數猜到這個數字

1.是1嗎?是2嗎?。。。是99嗎?平均要問50次
2.大於50嗎?大於75嗎?。。。每次縮小範圍到一半,7次以內就能猜到

此時二分查詢的簡單程度顯而易見
簡單查詢時間複雜度為O(n),二分查詢時間複雜度為O(log n)
但請注意,二分查詢前提條件是查詢的數列必須是有序的
下面來寫一個程式描述上述過程:

11103252-480e8e5f6ce267cd.png
最後提一下旅行商問題

大概就是一個旅行商需要前往5個城市,同時要確保旅程最短
為此,可以考慮前往這些城市的各種可能性
對於每種順序,他都計算總旅程,再挑選出旅程最短的線路
顯然,5個城市有5!=120種不同的排列方式
推而廣之,n個城市需要執行n!次操作才能計算出結果
因此執行時間為O(n!),這種演算法時間複雜度非常糟糕

相關文章