常用演算法 二分法

2021-09-11 11:18:22 字數 2387 閱讀 3126

1.二分法

最簡單版本:

第乙個,最基本的二分查詢演算法

因為我們初始化 right = nums.length - 1

所以決定了我們的「搜尋區間」是 [left, right]

所以決定了 while (left <= right)

同時也決定了 left = mid+1 和 right = mid-1

因為我們只需找到乙個 target 的索引即可

所以當 nums[mid] == target 時可以立即返回

第二個,尋找左側邊界的二分查詢

left_bound( nums, target)  else if (nums[mid] > target)  else if (nums[mid] == target) 

}// 檢查出界情況

if (left >= nums.length || nums[left] != target)

return -1;

return left;

}

第三個,尋找右側邊界的二分查詢

int right_bound(int nums, int target)  else if (nums[mid] > target)  else if (nums[mid] == target) 

}// 最後要檢查 right 越界的情況

if (right < 0 || nums[right] != target)

return -1;

return right;

}

def search(nums,target):

if target in nums:

left,right=0,len(nums) #[left ,right)

if lefttarget:

right=mid # [left,mid)

elif nums[mid]i) 求下界,用左閉右開搜尋區間[first, last).

// 在python中正是求下界限,這種寫法不會造成溢位

原理:

不管怎麼寫,只要遵循乙個原則,就是l是符合條件的的,r是不符合的(反過來也一樣)。這個不變數將貫穿整個二分的過程。

什麼意思呢?舉個栗子,你需要在[l,r]區間中找到符合條件的最大的x,按照上面的原則,你的初始條件就應該是l=l, r=r+1, 注意這裡的r是不符合條件的,因為它超出了邊界,所以它不可能是答案。這時候,你的mid如果合法,就說明答案大於等於mid,所以應該更新l,如果mid不合法,直接把r設成mid。至於如何判斷合法(是大於等於還是大於),該不該加一減一,按照這個原則都可以很容易想出來。

這樣在整個二分的過程中,你會發現,r在任何時候都不可能是答案,那麼這個迴圈的停止條件也很容易判斷了,就是l+1=r,這時候說明l已經是符合條件的最大值了,因為再加一就是非法值。

特點 : 

1、左閉右開 (所以右邊應該 right+1 ,防止取空)

2、left 3、基於左閉右開(右邊界,mid = right 可以取到,因此中間值等於目標值時,應該右邊界)

左邊界 ,mid= left+1 ,由於不能重複取left得值

int left_bound(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)

}if left==len(nums): #此時 left==right ,跳出迴圈 ,可能會出現mid=right的情況(越界)

return -1

return left if nums[left]==target else -1;

}

int right_bound(int nums, int target)  else if (nums[mid] < target)  else if (nums[mid] > target) 

}return left - 1; // 注意 #因為我們對 left 的更新必須是 left = mid + 1,就是說 while 迴圈結束時,nums[left] 一定不等於 target 了,而 nums[left-1] 可能是 target,所以需要left/right -1

二分法 演算法

查詢演算法中的 二分法 是這樣定義的 給定n個從小到大排好序的整數序列list,以及某待查詢整數x,我們的目標是找到x在list中的下標。即若有list i x,則返回i 否則返回 1表示沒有找到。二分法是先找到序列的中點list m 與x進行比較,若相等則返回中點下標 否則,若list m x,則...

演算法 二分法

二分法可以歸為兩大類 二分查詢演算法 二分排序演算法 二分合併演算法 演算法中經常用到二分查詢演算法,比如最常規的應用就是在乙個有序陣列中找特定的數,但是如何寫出乙個完整準確的二分法呢,邊界條件如何判斷,到底是等於還是不等?可能會困惱大家,比如說查詢第乙個等於5的數,那又在如何查詢呢?查詢最後乙個等...

二分法 演算法

二分法查詢,這個演算法要求資料要是有序的。比如有這樣的問題 找出乙個陣列中,兩個數的和小於等於15,然後輸出他們,否則就單獨輸出較大的數。binarysearch.cpp include using namespace std void binarysearch int array,int leng...