二分(二分查詢 解方程)

2021-10-06 01:37:02 字數 1430 閱讀 5039

如何在乙個嚴格遞增序列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 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...