基礎演算法 二分(C語言版)

2021-10-07 19:33:50 字數 2769 閱讀 2656

二分法的用途

用來查詢乙個區間中滿足某種性質的邊界點,如:大於某數的最小值、小於某數的最大值

這個性質可以將區間劃分為兩段

(區間有單調性一定可以用二分查詢區間中的某個數,但可以二分不一定具有單調性)

二分思想

通過不斷折半查詢區間,縮小查詢範圍,直到找到所求值

**實現步驟:

(1)確定二分區間:確定要找的答案所在的區間,然後迴圈(2)、(3)、(4)操作

(2)找中點:找到區間中點mid

(3)選check:寫乙個check函式,判斷mid是否滿足邊界點所在性質

(4)更區間:看邊界點在mid左側區間還是右側區間,更新區間端點,保證分界點一定在新區間中

二分演算法分類:整數二分、浮點數二分

整數二分

兩個模板1

//區間[l, r]被劃分成[l, mid]和[mid+1, r]時使用:

intbsearch_1

(int l,

int r)

return l;

//最終l與r相等,所以返回l,r都可以

}//區間[l, r]被劃分成[l, mid-1]和[mid, r]時使用:

intbsearch_2

(int l,

int r)

return l;

}

應用例題:數的範圍

給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。

對於每個查詢,返回乙個元素k的起始位置和終止位置(位置從0開始計數)。

如果陣列中不存在該元素,則返回「-1 -1」。

輸入格式

第一行包含整數n和q,表示陣列長度和詢問個數。

第二行包含n個整數(均在1~10000範圍內),表示完整陣列。

接下來q行,每行包含乙個整數k,表示乙個詢問元素。

輸出格式

共q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。

如果陣列中不存在該元素,則返回「-1 -1」。

資料範圍

1≤n≤100000

1≤q≤10000

1≤k≤10000

輸入樣例:

6 31 2 2 3 3 434

5輸出樣例:

3 45 5

-1 -1

#include

#define n 100000

intmain

(void)if

(q[l]

!= x)

printf

("-1");

else

printf

("%d"

, l)

;//用第二個模板查詢右邊界

l=0, r=n-1;

//初始化查詢區間

while

(lif(q[l]

!= x)

printf

(" -1\n");

else

printf

(" %d\n"

, l);}

return0;

}

關於整數二分出現兩個模板的原因:

首先由於整數二分的區間是離散的,所以區間的邊界有兩個。

然後我們在二分時需要找到區間中點,根據中點是否在答案所在區間以及答案是哪個邊界分情況更新區間。這樣我們就要分四種情況。

而這兩個模板分別包含了兩種情況,每個模板都假定二分的中點一定在答案所在區間。

浮點數二分

模板1:

#define 1e-6

double

bsearch_3

(double l,

double r)

return l;

}

應用例題:數的三次方根

給定乙個浮點數n,求它的三次方根。

輸入格式

共一行,包含乙個浮點數n。

輸出格式

共一行,包含乙個浮點數,表示問題的解。

注意,結果保留6位小數。

資料範圍

−10000≤n≤10000

輸入樣例:

1000.00

輸出樣例:

10.000000

#include

#include

#define eps 1e-8

intmain

(void)if

(x<0)

printf

("%.6f"

,-l)

;else

printf

("%.6f"

, l)

;return0;

}

注意:二分法一定有解,即一定可以找到符合某個性質的邊界點,但所對應的題目問題可能無解,要對無解的情況進行討論。

二分模板來自www.acwing.com ↩︎↩︎

C語言版 農曆演算法

這個只是基本的農曆演算法,另外的節日查詢啊,可以自己做的。到 找乙個萬年曆,改寫成c語言的就可以了。char getdayof systemtime pst const char cdizhi const char cshuxiang const char cdayname const char c...

C語言版 農曆演算法

這個只是基本的農曆演算法,另外的節日查詢啊,可以自己做的。到 找乙個萬年曆,改寫成c語言的就可以了。char getdayof systemtime pst const char cdizhi const char cshuxiang const char cdayname const char c...

C語言基礎 二分查詢

何為二分查詢 二分查詢也稱折半查詢,它是一種效率較高的查詢演算法,如果查詢的元素包含在列表中,二分查詢返回其位置。基本思想 假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵...