äºåæ¥æ¾ç®æ³ æ¯ä¸ç§å¨ æåºæ°ç» 䏿¥æ¾ç»å®å ç´ çæç´¢ç®æ³ã
ç®æ³è¿ç¨ ¶
äºåæ¥æ¾çè¿ç¨å¦ä¸å¾æç¤ºï¼

å ·ä½çæ¥æ¾è¿ç¨ï¼
- æ¥éª¤ 1 ï¼åå§åæ¥æ¾èå´ä¸ºæ´ä¸ªæåºæ°ç»ï¼å³ä½ä½ $low$ 为 $0$ , é«ä½ $high$ 为æ°ç»çå¤§å° $n$ ã
- æ¥éª¤ 2 ï¼æ¯è¾ä¸é´ä½ç½® $mid = (low + high) / 2$ çå
ç´ åç®æ å
ç´ ç大å°å
³ç³»ï¼
å¦æç®æ å ç´ è¾å°ï¼åéä½é«ä½ï¼å³ $high = mid - 1$ ã
è¿ç¼©å°äºä¸åçæ¥æ¾èå´ï¼é夿¥æ¾ï¼åå°æ¥éª¤ 2 ã
å¦æç®æ å ç´ è¾å¤§ï¼åå¢å¤§ä½ä½ï¼å³ $low = mid + 1$ ã
è¿ç¼©å°äºä¸åçæ¥æ¾èå´ï¼é夿¥æ¾ï¼åå°æ¥éª¤ 2 ã
妿æ£å¥½ç¸çï¼æ¥æ¾å®æï¼ç»ææ´ä¸ªæ¥æ¾ã
- æ¥éª¤ 3 ï¼ç´å°æ¥æ¾èå´æ æ³ç»§ç»ç¼©å°ä¸å»ï¼å³å½ $low <= high$ ä¸åæç«æ¶ï¼æªæ¥æ¾å°ã
å ·ä½çç®æ³è¿ç¨å¦ä¸å¾æç¤ºï¼å¾ä¸ççº¢è²æ¡æ¯æ¯æ¬¡çæ¥æ¾èå´ï¼ç± $low$ å¼å§ï¼å° $high$ ç»æã æ¯æ¬¡æ¥æ¾èå´é½ä¼ç¼©åä¸åã

å¤æåº¦åæ Â¶
å设æ»å ±éè¦è¿ä»£ $k$ 次æå¯ä»¥æ¾å°ç®æ ã
å ä¸ºæ¯æ¬¡æ¥æ¾ï¼èå´å³ç¼©å°ä¸ºåæ¥çä¸åï¼æç»è¦ç¼©å°ä¸º $1$ æå¯ä»¥ï¼å³ $n * (1/2) ^ k = 1$ ï¼ å¾å° $ k = \log {n}$ ã å³äºåæ¥æ¾çæ¶é´å¤æåº¦æ¯ $\log{n}$ ã
ééå½å®ç°ç空é´å¤æåº¦æ¯ $O(1)$ ã
C è¯è¨å®ç° ¶
C è¯è¨çäºåæ¥æ¾ç®æ³å®ç°
// ä»å¤§å°ä¸º n çæ°ç» a 䏿¥æ¾å
ç´ target.
// è¿å target çä½ç½®ï¼å¦ææ¾ä¸å°ï¼è¿å -1.
int BinarySearch(int a[], int n, int target) {
int low = 0;
int high = n - 1;
int mid = 0;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid] < target) {
low = mid + 1;
} else if (a[mid] > target) {
high = mid - 1;
} else {
return mid;
}
}
return -1; // æªæ¾å°
}
æ°å¦ä¸çäºåæ³ Â¶
äºåæ³å¨æ°å¦ä¸å¯ä»¥ç¨æ¥æ± åè°å½æ° çè¿ä¼¼æ ¹ï¼åè®¡ç®æºç®æ³ä¸çäºåæ³ç±»ä¼¼ï¼
- å æ¾åºè·¨é¶å¼çåºé´ $[a, b]$ ï¼ä½¿å¾ $f(a)$ å $f(b)$ å¼å·ï¼åè¿ä¸ªåºé´å å¿ ç¶å å«å½æ°çæ ¹ã
- æ±è¯¥å½æ°çä¸ç¹ $m = \frac {a+b} {2}$ ã
- 妿 $f(m)$ å $f(a)$ æ£è´å·ç¸åï¼åå $[m, b]$ 为æ°çåºé´ï¼åä¹åå $[a, m]$ ã
- éå¤ç¬¬ 2ã3 两æ¥ï¼ç´å°çæ³ç²¾åº¦ä¸ºæ¢ï¼å³ $(\frac {f(b) - f(a)} {2} < e$ æ¶ç»æ¢ï¼ $e$ æ¯çæ³è¯¯å·®ï¼ ã

延伸ï¼
ï¼å®ï¼
æ¬æåå§é¾æ¥å°åï¼ https://hit9.dev/post/algorithm-binary-search
