本章內容:
目錄
分而治之
快速排序
再談大o表示法
分而治之並非可用於解決問題的演算法,而是一種解決思路。
使用分而治之策略解決問題的過程包括兩個步驟:
找出基線條件,這種條件必須盡可能簡單。不斷將問題分解(或者說是減小規模),直到符合基線條件
例項一:
比如編寫求解乙個數字陣列之和的函式
第一步,找到基線條件。最簡單的陣列應該是不包含元素或者是只包含乙個元素,這個就是基線條件。
第二步,縮小規模。如何將乙個陣列縮小規模,可以每一次都從陣列中提取乙個數字,然後將這個數字和剩下的陣列進行求和,這樣陣列的規模便可以縮小。採用遞迴的手段,因此每一次呼叫,都會離基線條件更近一步。
def sum(arr):
if arr == :
#基線條件
return 0
else:
number = arr.pop()
newarr = arr
return number+sum(newarr)
print(sum([1,2,3,4]))
例項二:
比如有一塊土地,你要將這塊地均勻分成方塊,且分出來的方塊盡可能的大
第一步,找到基線條件。最容易的處理情況是,一邊的長度是第二條邊的整數倍
第二步,縮小規模。比如現在是一大塊方地(1680*640)那麼可以將其劃分為兩個(640*640)的正方形以及乙個(640*400)的矩形,那麼那塊(640*400)的便是縮小規模後的土地,依次類推。
(歐幾里得演算法:適用這小塊地的最大方塊,也是適用於整塊地的最大方塊。哈哈哈記住這個便可以了。對於這乙個過程最好還是畫一下圖,對每一步的過程都畫一畫)
def find_min_squre(a,b):
#假設現在那塊地其中一邊長a,另外一邊長b
x = max(a,b)
y = min(a,b)
#找出兩條邊中較長邊和短邊
if x == 2*y:
return y
#要是符合基線條件那麼直接輸出最小邊,即為可切最大正方形的邊長
else:
return find_min_squre(x%y,y)
#這個x%y的意思是求出原來的長方形切去若干個正方形後剩下的長度
print(find_min_squre(1680,640))
輸出結果是80
快速排序是一種常用的排序演算法,比選擇排序快很多。例如,c語言中標準庫中的函式qsort實現的就是快速排序。快速排序也是使用的是分而治之的方法。下面使用快速排序對陣列進行排序。
基線條件:
陣列為空或者是只包含乙個元素。在這種情況下,只需返回原陣列——根本不需要排序。
縮小規模:
需要將陣列進行分解,直至達到基線條件。要是有多個元素,首先從陣列中選擇乙個元素,這個元素稱之為基準值(pivot)。接下來,找出比這個基準值小的元素以及比這個基準值大的元素,這個被稱為分割槽(pratitioning)。
此時則會有:
基準值乙個由所有小於基準值的元素構成的乙個子陣列
乙個由所有大於基準值的元素構成的乙個子陣列
這個裡面的子陣列是無序的。
若是這兩個字陣列都是有序的,那麼是不是
原來的陣列排序 = 其中乙個有序的子陣列 + 基準值 + 另外乙個有序的子陣列
其實,很容易就可以想到了,這兩個無序的子陣列變成有序的子陣列也是採用相同的方法,即取出基準值然後分成兩個子陣列,分而治之。比如找個例子,有個陣列 [4,5,2,7,1,3] 要採用這個方法進行排序。
這裡用從大到小的方式排列,也就是把大的陣列放在左邊
[4,5,2,7,1,3]
[5,7] + 4 + [2,1,3]
( [7] + 5 + [ ] )+ 4 +( [3] + 1 + [1] )
def quicksort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
smaller = [i for i in arr[1:] if i <= pivot]
bigger = [i for i in arr[1:] if i > pivot]
return quicksort(smaller) + [pivot] + quicksort(bigger)
print(quicksort([4,5,2,7,1,3]))
輸出結果為 [1, 2, 3, 4, 5, 7]
快速排序的獨特之處在於選擇的基準值,快速排序的平均時間為 o(n*log n)。一般情況下,直接隨機取基準值就好。
常見的大o運算時間
演算法二分查詢
簡單查詢
快速排序
選擇排序
旅行商問題演算法
快 --> 慢
o(log n)
o(n)
o(n*log n)
o(log n*n)
o(log n!)
筆記 第四章 04
數學期望 期望 均值 離散型 連續型 隨機變數的分布函式 理解為符合函式求期望值 方差 e,記做d x var x 其開放稱作標準差 均方差,其在資料上的表現為d x 越小,則資料越集中 方差和期望的關係 e e x 2 e x 2 切比雪夫不等式 通過已知的e x 和d x 估計某一區間的時間的概...
第四章,排序檢索資料
order by 列名 select prod name from products order by prod name輸出以prod name字母順序排列的資料 order by 排序參照列也可以是非選擇的列 order by 列名1,列名2先按照列1排序,在列1相同時,再按照列2排序 desc...
第四章 繼承
一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...