二分作為一種方法,或者說是一種思想,是很常用的,也是很好用的,所以介於我的二分能裡比較弱,今天我就來總結整理一些知識,供大家分享。
說明:本文章參考於——
一.可能出現的一些問題
1.邊界錯誤造成的問題
二分查詢演算法的邊界,一般來說分兩種情況,一種是左閉右開區間,類似於[left, right),一種是左閉右閉區間,類似於[left, right].需要注意的是, 迴圈體外的初始化條件,與迴圈體內的迭代步驟, 都必須遵守一致的區間規則,也就是說,如果迴圈體初始化時,是以左閉右開區間為邊界的,那麼迴圈體內部的迭代也應該如此.如果兩者不一致,會造成程式的錯誤。如果兩者同時都寫錯的話,可能會造成死迴圈。
2.溢位
假如,left與right之和超過了所在型別的表示範圍的話,那麼middle就不會得到正確的值.
二.**實現
#include #include #include using namespace std;
int a[10];
int lowserach(int b,int x,int y,int v)//注意求比其小的一項應減 1
return x;
}int upserach(int b,int x,int y,int v)
}int bi_search(int a,int n,int b)//返回等於b的第乙個
else if(a[mid]>b)
high = mid -1;
else
low = mid +1;
} return last;
}int bi_search1(int a,int n,int b)//大於b的第乙個數
else if (a[mid]<=b)
}return last;
}int bi_search2(int a,int n,int b)//小於b的第乙個數
} return last;
}int main()
{ freopen("1.txt","r",stdin);//1 3 5 5 5 8 8 9
for(int i=1;i<=8;i++)
cin>>a[i];
int pos1,pos2;
pos1=upper_bound(a+1,a+9,7)-a;
pos2=lower_bound(a+1,a+9,7)-a;//注意求比其小的一項應減 1
cout<
當然我們也可以用algori
thm庫中的二分函式:
pos=upper_bound(a,a+n,pos)-a;
pos=lower_bound(a,a+n,pos)-a;//注意求比其小的一項應減 1
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...
二分(二分答案 二分搜尋)與單調性
經典二分搜尋是二分空間範圍。二分答案又叫二分猜值,是二分解的值空間。其實可以統一,普通的二分搜尋也是二分答案值域 下標空間,也是猜值。二分必須滿足單調性,最直觀的,二分搜尋只能在有序陣列上進行。單調性體現在,下標和元素值是單調的,也就是 if j i 有 a j a i 一般二分答案解決的問題是最優...
二分 整數二分和浮點數二分
一定是單調的才可以二分。找中間點 判斷是否滿足check函式 此函式需要自己根據題意調整,假設紅色區域為滿足check函式,說明mid在紅色區域內,此時要在mid到r之間找,l mid,否則r mid 1。由於此時l mid 所以中間點應為 l r 1 2 中間點mid l r 2 mid l r ...