二分搜尋法
1 | 2 | 3 | 5 | 6 |
---|
20 | 30 | 87 | 99 | 256 |
---|
序列 \(\{a_i\}\) 就是一個有序資料
有數列\(a_1,a_2,a_3,\cdots,a_n\),想要做一些事
int a[5] = {55, 60, 70, 75, 99};
int x = 100;
int index = -1;
for(int i=0; i<5; ++i)
{
if( a[i] == x )
index = i;
}
printf("data at %d", index);
好像有點浪費時間?如果資料有神奇的特性呢?
小於x | 等於x | 大於x |
---|
\(<_+\)
\(<_+\)
\(<_+\)
\(<_+\)
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
小於6
大於6
\(<_+\)
\(<_+\)
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
小於6
大於6
\(<_+\)
\(<_+\)
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
小於6
大於6
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
1 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 |
---|
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
}
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
}
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
}
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
}
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
else { index = M; break; } //找到答案!
}
int a[100], x;
int L = 0; // 資料的最左邊
int R = N-1; // 資料的最右邊
int index = -1; // 找到的位置
while( L<=R ) // 在範圍有東西的狀況下
{
int M = (L+R)/2; //中間點
if( a[M] < x ) L=M+1; //戳到左邊,比 M 小的都不是答案
else if( x < a[M] ) R=M-1; //戳到右邊,比 M 大的都不是答案
else { index = M; break; } //找到答案!
}
AC
WA / TLE
這份 Code 有一個 bug (while迴圈內)
int M = (L+R)/2;
L = 2147483646, R = 2147483647
可改寫為
int M = L+(R-L)/2;