首先,祝各位大朋友和小朋友6。1 快樂哈,happy~
從今天起會陸續更新算法相關的筆記,記錄一下自己學習《算法圖解》的筆記,歡迎多多指教。
二分查找
二分查找是一種算法,其輸入是一個有序的元素列表(必須有序,稍後會做解釋)if 查找的元素包含在列表中,二分查找返回其位置,else return null;
exp: 你從電話簿中找姓q的人,可以從頭開始找,傻呀你,爲啥不從中間開始呢???因爲你知道q位於電話簿中間位置。
exp: 從1~100中猜一個數字,目標最少的次數猜到該數字。 最佳方式從50開始猜。這樣就排除了一半。看到這裏,二分查找的精髓就展現了,沒錯,那就是每次都將餘下的數字排除一半哈。
爲啥要有序的列表呢?
because 僅當列表有序時,二分查找纔有用。
exp: 電話簿的名字是按照字母排序的 ABCDEFG…,因此可以使用二分查找來查找名字。if not 按照順序排列。結果就如何呢,xixi
大O表示法
大O表示法是一種特殊的表示法,指出了算法的速度有多快。
exp:假設列表包含n個元素,簡單查找需要檢查每個元素,因此需要執行n 詞操作。此時,使用大O表示法,這個運行時間爲O(n)。-------大O表示法指的並非以秒爲單位的速度。大O表示法讓你能夠比較操作數,它指出了算法運行時間的增速哈。
exp:爲檢查長度爲n的列表,二分查找需要執行log n 次操作,使用大O表示法,這個運行時間爲O(log n)
注意哈:大O表示法指出了最糟糕情況下的運行時間
exp: 電話簿找人最佳情況下1次就找到了,最早情況下n次才能找到。對應運行時間O(n)
二分查找核心代碼
function binary_search(list,number){
low =0; //下標
high=list.length-1;
while (low <high) {
mid = (low+high)/2;
guss=list[mid];
if(guess == number) {
return mid;
}
if(guess > number) {
high =mid -1;
}else {
low=mid+1;
}
}
return None;
}
小結
1、二分查找速度比簡單查找快
2、O(logn)比O(n) 快,需要搜索的元素越多,前者比後者就快的越多。
3、算法運行時間不以秒爲單位
4、算法運行時間以用O表示法表示。
5、算法運行時間以增速角度度量的。
擴展
O(log n) 也叫對數時間 exp 二分查找
O(n) 也叫線性時間 exp 簡單查找 for(int i=0;i<n;i++)
O(n*log n) exp 快速排序 [每一層排序n 一共logn層 後續會講解]
O(n2) exp 選擇排序----一種較慢的排序算法
O(n!) 旅行商問題