二分查詢的核心思想

2021-10-02 18:45:25 字數 1323 閱讀 6475

以題目為例,說明的更透徹一些

看到題目我們的第一反應:使用dfs或者是搜尋進行查詢,因為洛谷新手村中的這一道題 選數 p1036,但是需要注意時間,n2的複雜度再加上輸入的時間會超時,洛谷中的題用搜尋寫的,時間複雜度太高,所以我們轉而使用二分進行查詢,其實是看了郭煒老師的課程才想到二分

我們用一層迴圈實現查詢兩個數的第乙個數,然後用自帶函式binary_search來查詢第二個數,同時我們可以可以使用不降原則來進行演算法的優化,不降原則是指我們對這部分資料進行了不停的向後查詢,在一定程度上可以進行優化,總的複雜度為n * log n其中log的底數為2,到10000才需要大概10幾,**如下

/* 輸入n個整數,找出其中兩個數,他們之和等於整數m

所有整數都可以使用int表示

輸出這兩個整數

*/#include

using

namespace std;

const

int n =

100005

;int a[n]

;bool

cmp(

int a,

int b)

intmain()

sort

(a,a + n,cmp)

;for

(int i =

0;i < n;i++)}

cout

}

就是兩個像指標一樣的東西,分別指向陣列的首尾,然後比較相加的和是否大於這個值,如果大於,那麼尾部指標向前移動,如果小於,頭部指標向後移動,最後就能找到他的值,或者是兩個指標指向了同乙個數,其實運用了一種貪心的思想,我永遠都在找當前最利於我的情況,該方法複雜度為n,但是由於快排函式的複雜度為n * log n,總複雜度為n log n 那麼下面證明其正確性

疑問在於,假如說剛好錯過了怎麼辦,比如,只有頭部指標的前乙個數與尾部指標相加才正好,而此時偏大,我們只會將尾部指標繼續向前移動,而不會向後移動,那麼永遠都找不到這個答案

但是為什麼頭部指標會指向正確的較小數的後乙個數呢,把鏡頭轉向移動到較小數的那一次,從那一次就會自動退出!!!

int

main()

sort

(a,a + n,cmp)

;int l =

0,r = n -1;

while

(l != r)

if(a[l]

+ a[r]

>m)

r--;else

if(a[l]

+ a[r]

< m)

l++;}

return0;

}

二分查詢思想

二分查詢思想應用於對有序的陣列進行查詢操作。時間複雜度 二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性演算法時間複雜度為o logn mid計算 有兩種計算中值mid的方式 l h可能出現加法溢位,也就是說加法的結果大於整形能夠表示的範圍。但是l和h都為正數,因此h l不會出現加法溢位...

二分查詢的思想

先看看leetcode兩道相關的題目,都是二分思想的應用。leetcode 35 leetcode 34 二分思想用一句話概況就是 一看就懂,一寫就廢 花了很長時間都沒有弄得懂,每個人都是不同的寫法,新手很難從中發現規律。其實二分查詢最重要的一句話就是 查詢範圍 如何確定查詢範圍?只要確定了查詢範圍...

ERP的核心思想

erp enterprise resource planning,企業資源計畫系統 的概念,是美國gartner group公司於1990年提出的,其確切定義是 mrp 企業製造資源計畫 下一代的製造業系統和資源計畫軟體。除了mrp 已有的生產資源計畫,製造 財務 銷售 採購等功能外,還有質量管理,...