二分法
原文:https://github.com/googege/AMAC/tree/master/basic/8
主要是原文里有不少的代碼,看字不如看代碼
二分法是針對的有序的序列,我們將要找的數(shù)字跟這個區(qū)間內(nèi)的中位數(shù)進行比較乌助,然后確定是做區(qū)間還是右區(qū)間罕偎,這點倒是很像分治的思想很澄,例如快排中選擇一個基點然后左右排列,遞歸颜及,所以二分法很像分治的思想甩苛。
二分查找的不可用的地方
數(shù)據(jù)太少,直接遍歷即可
無序 如果是無序應(yīng)該先排序再查找
頻繁進行io 這樣的話就需要經(jīng)常的排序俏站,
數(shù)據(jù)必須是順序表不能是鏈表
數(shù)據(jù)量太大也不行 因為 這么大的數(shù)組內(nèi)存放不下啊讯蒲。
時間復雜度
很明顯每次都是對折如果我們反過來看從1開始每次都是2倍自己那么我們可以得到的是2^k = n
很明顯是指數(shù),所以當我們從n然后推出k的時候
也很明顯了肄扎,就是用的指數(shù)的對邊 --- 對數(shù) 所以它的時間復雜度就是 log2n 我們可以簡稱為 logn 而且沒有任何的其它項墨林,所以說,這就是為什么
二分法比某些O(1)還要快的原因 --- O(1)有可能常數(shù)項是100000 但是 log2n就比這個數(shù)字小的多.
二分法的變形算法
查找第一個值等于給定值的元素
查找最后一個值等于給定值的元素
查找第一個大于等于給定值的元素
查找最后一個小于等于給定值的元素