如何在乙個嚴格遞增序列a中找出給定的數x。比依次掃瞄更好的辦法是使用二分查詢。二分查詢是基於有序序列的查詢演算法,該演算法一開始令[left,right]為整個序列的下標區間,然後每次測試當前[left,right]的中間位置mid = (left+right)/2,判斷a[mid]與欲查詢元素x的大小:
如果a[mid] == x,則說明查詢成功,退出查詢。
如果a[mid] < x,則說明元素x在mid的右邊,因此left = mid+1,在區間[mid+1,right]中繼續查詢。
如果a[mid] > x,則說明元素x在mid的左邊,因此right = mid-1,在區間[left,mid-1]中繼續查詢。
#include
using
namespace std;
//a[n]為嚴格遞增的序列,left為二分下界,right為二分上界,x為欲查詢的數
//二分區間為左閉右閉的[left,right]
intbinarysearch
(int a,
int left,
int right,
int x)
else
if(a[mid]
else
}return-1
;//查詢失敗
}int
main()
;printf
("%d\n"
,binarysearch
(a,0
,n-1,6
));return0;
}
給定乙個定義在[l,r]上的單調函式f(x),求函式f(x)的根。
假設精度要求為eps = 10-5,函式在區間上遞增,並令left,right的初值為l,r,然後就可以根據left與right的中點mid的函式值f(mid)與0的大小關係來判斷應該往哪個子區間裡繼續逼近f(x)=0的根:
如果f(mid)>0,說明f(x)=0的根在mid的左側,應該往左子區間[left,mid]繼續逼近,令right=mid。
如果f(mid)<0,說明f(x)=0的根在mid的右側,應該往右子區間[mid,right]繼續逼近,令left=mid。
上面的步驟,當right-left <10-5是表明達到精度要求,結束演算法,所返回的當前mid的值為fx=0的根。
const
double eps =
1e-5
;//精度為10^-5
doublef(
double x)
double
solve
(double l,
double r)
else
}return mid;
//所返回的當前mid即為fx=0的根
}
解方程 二分搜尋
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 對於方程 2018 x 4 21 x 5 x 3 5 x 2 14 y,告訴你y的值,你能找出方程在0 100之間的解嗎?第一行輸入乙個正整數t 表示樣例個數 接下來t...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...