算法圖解(二分查找)


前言:

今天是第一篇 以后盡量每天寫 看具體時間安排吧 目前一邊學Python、Java、Go還有算法 所以寫的比較少

主要是Python一天差不多16小時吧 Java、go看時間安排 這次算法全是用Python演示的 不懂Python的也沒關系

或者可以看一下我前面的帖子

算法是什么:

算法是一只組完成任務的指令  要么速度快、要么能解決問題

應該說是為實現某些目的的邏輯 以及 思想 的代碼

 

二分查找

 

假設你要查找電話本里k開頭的人 里可能會直接滑動到中間 因為你知道k在中間位置

因為電話本是abcdef排序的嘛

定義:

 二分查找就指從中間開始查找的邏輯做法

注:

# 二分查找必須是有序序列  返回其位置

# 無序無法進行二分查找   返回null

例如:

二分查找:

  利用二分查找每次取中間數 有小數可以向上或向下取整數

  100以內的數字   最多7次可以找出來   

普通查找:

  而普通查找則是從頭到位遍歷最好的情況是1 一次找出

      最差是100次

 

二分查找隨着元素的增加並不會改變太大

普通查找則會隨元素的增加而增加

比如說一個字典內有240000個單詞

普通查找最差情況:240000次 出結果

二分查找最差情況:17次出結果

這就很明顯的突出了二分算法的優勢

####這里我用()括號里的數字代表log的下標

用二分查找最多需要log(2)n步

其實就是利用對數運算:

對數運算:

      定義: 冪運算的逆運算

例如:

      10**2 = 100      log(10)100 = 2

      10**3 = 1000    log(10)1000=3

      2**5 = 32          log(2)32 = 5

如果有8個元素 你最多需要查找3次   因為long8 = 3(2**3=8)

1024個元素  最多需要 檢查10個元素  因為 1024 = 10(2**10=1024)

def binary(lst, item):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = round((low + high) / 2)
        guess = lst[mid]
        if guess == item:   # 猜對了
            return mid
        if guess > item:
            high = mid - 1  # 猜大了
        else:
            low = mid + 1   # 猜小了
    return None


my_list = [1, 3, 5, 7, 9]
print(binary(my_list, 3))    # 1 返回的元素下標  索引是0開始的
print(binary(my_list, -1))   # None   因為不存在-1元素

 

運行時間:

  線性時間(linear time)

        100個數字最多猜100次  40億猜40億次  最多猜的次數等於列表的長度

  對數時間(或log時間)

    100個數字最多猜7次  40億猜32次  

大O表示法:

     簡單查找每個元素 需要n次 運行時間為O(n)

   二分查找 運行時間為O(log(n))

        大O表示法計算的是操作數

  O(log n) 對數時間  包括二分查找

  O(n)  線性時間

  O(n * log n)快速排序算法

  O(n**2)速度較慢排序法算法

  O(n!)非常慢的算法

 

小結:

     二分查找比簡單查找快的多

     O(log n)比O(n)快,需要搜索的元素越多,前者比后者就快的越多

  算法運行時間並不以秒為單位

  算法運行時間是從其增速的角度度量的

  算法的運行時間用大O表示法表示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM