算法
今天給大家帶來一篇關於算法排序的分類,算法的時間復雜度,空間復雜度,還有怎么去優化算法的文章,喜歡的話,可以關注,有什么問題,可以評論區提問,可以與我私信,有什么好的意見,歡迎提出.
前言: 算法的復雜度分為時間復雜度與空間復雜度,時間復雜度指執行算法需要需要的計算工作量,空間復雜度值執行算法需要的內存量,可能在運行一些小數據的時候,大家體會不到算法的時間與空間帶來的體驗. 優化算法就是將算法的時間優化到最快,將空間優化到最小,假如你寫的mod能夠將百度游覽器的搜索時間提升0.5秒,那都是特別厲害的成績.
本章內容: 1,算法有哪些 2,時間復雜度,空間復雜度 3,優化算法 4,算法實例
一,算法有哪些
常見的算法有冒泡排序,快排,歸並,希爾,插入,二分法,選擇排序,廣度優先搜索,貪婪算法,這些都是新手入門必須要了解的,你可以不會,但是你必須要知道他是怎么做到的,原理是什么,今天就給大家講一講我們常用的冒泡排序,選擇排序,這兩個排序算法,
1,冒泡排序(Bubble Sort), 為什么叫他冒泡排序呢? 因為他就像是從海底往海面升起的氣泡一樣,從小到大,將要排序的數從小到大排序,
冒泡的原理: 他會一次比較兩個數字,如果他們的順序錯誤,就將其調換位置,如果排序正確的話,就比較下一個,然后重復的進行,直到比較完畢,
這個算法的名字也是這樣由來的,越大的數字,就會慢慢的'浮'到最頂端. 好了該上代碼了,下面就是冒泡排序的代碼,冒泡相對於其他的排序算法來說,比較的簡單,比較好理解,運算起來也是比較迅速的,比較穩定,在工作中也會經常用到,推薦使用
# 冒泡排序 def bubble_sort(alist): n = len(alist) # 循環遍歷,找到當前列表中最大的數值 for i in range(n-1): # 遍歷無序序列 for j in range(n-1-i): # 判斷當前節點是否大於后續節點,如果大於后續節點則對調 if alist[j] > alist[j+1]: alist[j], alist[j+1] = alist[j+1], alist[j] if __name__ == '__main__': alist = [12,34,21,56,78,90,87,65,43,21] bubble_sort(alist) print(alist) # 最壞時間復雜度: O(n^2) # 最優時間復雜度: O(n) # # 算法穩定性:穩定
2,選擇排序(selection sort)
選擇排序(selection sort)是一種簡單直觀的排序方法, 他的原理是在要排序的數列中找到最 大 或者最 小 的 元素,放在列表的起始位置,然后從其他里找到第二大,然后第三大,依次排序,
依次類,直到排完,
選擇排序的優點是數據移動, 在排序中,每個元素交換時,至少有一個元素移動,因此N個元素進行排序,就會移動 1--N 次,在所有依靠移動元素來排序的算法中,選擇排序是比較優秀的一種
選擇排序時間復雜度與穩定性:
最優時間復雜度: O(n2)
最壞時間復雜度:O(n2)
算法穩定性 :不穩定(考慮每次升序選擇最大的時候)
# if alist[j] < alist[min_index]: # min_index = j # # # 判斷min_index索引是否相同,不相同,做數值交換 # if i != min_index: # alist[i],alist[min_index] = alist[min_index],alist[i] # # # if __name__ == '__main__': # alist = [12,34,56,78,90,87,65,43,21] # # alist = [1,2,3,4,5,6,7,8,9] # select_sort(alist) # print(alist) # O(n^2) # 不穩定 def select_sort(alist): """選擇排序""" n = len(alist) for i in range(n - 1): min_index = i # 最小值位置索引、下標 for j in range(i+1, n): if alist[j] < alist[min_index]: min_index = j # 判斷min_index ,如果和初始值不相同,作數值交換 if min_index != i: alist[i], alist[min_index] = alist[min_index],alist[i] if __name__ == '__main__': alist = [8,10,15,30,25,90,66,2,999] select_sort(alist) print(alist)
這是一些算法的時間復雜度與穩定性
時間復雜度,空間復雜度
接下來就要來說說時間復雜度與空間復雜度: 時間復雜度就是假如你 泡茶,從開始泡,到你喝完茶,一共用了多長時間,你中間要執行很多步驟,取茶葉,燒水,上廁所,接電話,這些都是要花時間的,
在算法中,時間復雜度分為 O(1)最快 , O(nn)最慢,
O(1) < O(logn) <O(n)<O(n2)<O(n3)<O(2n) <O(nn) 一般游覽器的速度都在O(n),做我們這一行,要注意客戶體驗,如果你程序的運行特別慢,估計別人來一次,以后再也不會來了
下面給大家找了張如何計算 時間復雜度的圖片:
空間復雜度(space complexity) ,執行時所需要占的儲存空間,記做 s(n)=O(f(n)),其中n是為算法的大小, 空間復雜度 絕對是效率的殺手,曾經看過一遍用插入算法的代碼,來解釋空間復雜度的,
覺得特別厲害,我就比較low了,只能給大家簡單的總結一下我遇到的空間復雜度了,
一般來說,算法的空間復雜度值得是輔助空間,比如:一組數字,時間復雜度O(n),二維數組a[n][m] :那么他的空間復雜度就是O(n*m) ,因為變量的內存是自動分配的,第一個的定義是循環里面的,所以是n*O(1) ,如果第二個循環在外邊,那么就是1*O(1) ,這里也只是一個了解性的東西,如果你的工作中很少用到,那么沒有必要深究,因為用的真的很少
優化算法
這邊帶來了代碼,你們在復制下來了python上運行一下,看一下用的時間與不同, 自然就懂了,
這是未優化的算法
'' 已知有a,b,c三個數,都是0-1000之內的數, 且: a+b+c=1000 而且 a**2+b**2=c**2 ,求a,b,c一共有多少種組合 ''' # 在這里加一個時間模塊,待會好計算出結果 import time # 記錄開頭時間 start_time=time.time() # 把a,b,c循環出來 for a in range(1001): for b in range(1001): for c in range(100): # 判斷他 主公式 第一次,並未優化 if a+b+c==1000 and a**2 + b**2 == c**2 : # 打印 print("a=" ,a) print("b=" ,b) print("c=" ,c) else: pass stop_time = time.time() print('一共耗時: %f'%(stop_time-start_time)) # 一共耗時 156.875001秒
這是第一次優化
import time # 記錄開頭時間 start_time=time.time() # 把a,b,c循環出來 for a in range(1001): # 這里改成1001-a之后,他就不用再循環b了 for b in range(1001-a): for c in range(100): # 判斷他 主公式 第二次,優化了b, if a+b+c==1000 and a**2 + b**2 == c**2 : print("a=" ,a) print("b=" ,b) print("c=" ,c) else: pass stop_time = time.time() print('一共耗時: %f'%(stop_time-start_time)) # 一共耗時 50.557070秒
最后一次優化
import time # 記錄開頭時間 start_time=time.time() # 把a,b,c循環出來 for a in range(1001): for b in range(1001-a): c=1000 - a - b # 判斷他 主公式 第三次,優化了b和c if a+b+c==1000 and a**2 + b**2 == c**2 : print("a=" ,a) print("b=" ,b) print("c=" ,c) else: pass stop_time = time.time() print('一共耗時: %f'%(stop_time-start_time)) # 一共耗時 2.551449秒
從156秒優化到l2秒, 基本運算總數 * 基本運算耗時 = 運算時間 這之間的耗時和你的機器有着很大的關系
今天是12月30日,明天就要跨年了,祝大家2019年事業有成,工資直線上升,早日脫單,