二分搜索binary search和貪婪算法

二分搜索binary search


定義:二分搜索也稱折半搜索,是一種在有序數組中查找某一特定元素的搜索算法。

運用前提:必須是排好序的。
輸入並不一定是數組,也可能是給定一個區間和終止的位置。

優點:、

  • 二分搜索也叫對數搜索,其時間複雜度爲O(log n),是一種非常高效的搜索。

缺點:

  • 要求待查找的數組或者區間是排好序的
  • 如果要求對數組進行動態刪除和插入操作,並完成查找,平均複雜度會變爲O(n)
  1. 採取自平衡二叉查找樹
  2. 可在O(nlogn)的時間內用給定的數據構建出一顆二叉查找樹。
  3. 可在O(logn)的時間內對數據進行搜索
  4. 可在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就是正中間那個

核心思想:

  1. 確定搜索的範圍和區間
  2. 取中間的數判斷是否滿足條件
  3. 如果不滿住,判斷應該往那個半邊繼續進行搜索。
 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
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章