算法講解--二分查找、大O表示法

算法講解--二分查找、大O表示法


首先,祝各位大朋友和小朋友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!)   旅行商問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章