前言:
今天是第一篇 以后盡量每天寫 看具體時間安排吧 目前一邊學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表示法表示
