二分搜索binary search
定義:二分搜索也稱折半搜索,是一種在有序數組中查找某一特定元素的搜索算法。
運用前提:必須是排好序的。
輸入並不一定是數組,也可能是給定一個區間和終止的位置。
優點:、
- 二分搜索也叫對數搜索,其時間複雜度爲O(log n),是一種非常高效的搜索。
缺點:
- 要求待查找的數組或者區間是排好序的
- 如果要求對數組進行動態刪除和插入操作,並完成查找,平均複雜度會變爲O(n)
- 採取自平衡二叉查找樹
- 可在O(nlogn)的時間內用給定的數據構建出一顆二叉查找樹。
- 可在O(logn)的時間內對數據進行搜索
- 可在O(logn)的時間內完成插入和刪除的操作
當:輸入的數組或區間是有序的,且不會常變動,要求從中找出一個滿足條件的元素->二分搜索binary
基本結題模板
遞歸:
優點是簡潔
缺點是執行消耗大
int binary_search(int nums[],int target,int low,int high)
{
if(low>high) return -1;
int middle = (low+high)/2;
if(nums[middle]== target)
return middle;
if(nums[middle]> target)
{
return binary_search(nums,target,low,middle-1);
}else
{
return binary_search(nums,target,middle+1,high);
}
}
三個關鍵點
- 計算middle下標時,不能簡單地用(low+high)/2 這樣可能會導致溢出
- 取左半邊[low,middle-1]
- 取右半邊[middle+1,high]
- 我們確定了middle點是不是我們要找的點,
- 因此沒有必要再把它加入左右半邊了
- 對於一個長度爲奇數的數組,按照low+(high-low)/2來計算的話,middle就是正中間的那位。
- 對於偶數個的數組,middle就是正中間那個
核心思想:
- 確定搜索的範圍和區間
- 取中間的數判斷是否滿足條件
- 如果不滿住,判斷應該往那個半邊繼續進行搜索。
int binary_search(int nums[],int target,int low,int high)
{
while(low<=high)
{
int middle = low+(high-low)/2;
if(nums[middle]== target)
return middle;
if(nums[middle]>target)
{
high = middle-1;
}else
{
low = middle+1;
}
}
return -1;
}
找確定的邊界
貪婪算法:
Greedy 總是做出在當前看來最好的選擇
不從整體的角度去考慮,僅對局部的最優解感興趣
什麼問題適用貪婪算法?
只有當哪些局部最優策略能產生全局最優策略的時候。
揹包問題:
有三種不同的貪婪策略
1、選取價值最大的物品
2、選取重量最小的物品
3、選取價值/重量比最大的物品
貪婪物品有 A B C
重量分別是: 25,10,10
價值分別是:100,80,80