乙個二分查詢程式

2021-05-03 21:16:48 字數 2074 閱讀 6647

原問題來自:http://topic.csdn.net/u/20090826/18/c08b69e8-ce22-4427-8687-ffb53e380437.html

問題如下:

有一連串字母,由且必由若干個 a,b,c,d,e 組成,順序是:

若干個 a,若干個 b,若干個 c,若干個 d,若干個 e

即: a,a,...,a,b,b,...,b,c,c,...,c,d,d,...,d,e,e,...,e

現在已知的是所有字母一共是 1000 個,連續儲存

如何找到第乙個b,第乙個c,第乙個d,第乙個e 出現的位置,

要求比較的次數最少

要解這個問題,最簡單的是線性的查詢,不過二分法也不錯。

我寫的源程式如下:

#include

#include

#include

void find(char *str,int *numstr);

int _tmain(int argc, _tchar* argv)

find(str,numstr);

for(i=0;i<5;i++)

printf("%c =%d/n",i+'a',numstr[i]);

return 0;

}void find(char *str,int *numstr)

first[0]=0;

for(number=1;number<5;number++)

end=mid-1;

relate=str[mid]-'a'+1;

if(first[relate]>mid)

first[relate]=mid;}}

for(i=4;i>number;i--){

if(first[i+1]寫程式最要緊的是抓住思路,有了思路怎麼都寫的出,沒有則只會越寫越混亂。

在這個程式中,最基本的思想是二分,begin,end,mid,三個變。

最簡單的,begin=0,end=strlen(str),四次均如此查詢,絕對正確。

再聰明點,begin每次用上一次的結束點+1。

都這樣了,在用點力,採用陣列記錄資訊,使每次的begin,end都盡量小些,不是更快。

這個資訊太多不好,太少也不好。這裡是用first來記錄每乙個的前位置,即

first[i]<=numstr[i]這樣我們每次都有限定了。

但first總得有個初始的值,我們初始為strlen(str)-1.

所以first[number]之前用於限定numstr[number-1]的上限,這裡沒問題,因為first[number]初始為

strlen(str)-1,然後在輪到number時,變為numstr[number]的下限

但怎麼區分有效的first[number]和無效的呢?

如果first[number]==first[number+1],表明first[number]的值是下乙個更新得到的,而不是

乙個可用於下限的值,應用first[number-1]+1代替

而且在一次numstr值確定後,更新一次first值

基本的思路就是這樣

在實際測試時,遇到兩個問題:

1. first[relate]值的更新

if(first[relate]>mid)

first[relate]=mid;

這裡first[relate]的值總是趨於最小,這裡或許first[relate]跟他的目標值相差較遠,應該為

if(first[relate]>mid&&first[relate]==first[relate+1])

first[relate]=mid;

可實際上,在本程式的例子中,用前者的效率可能更好一些。因為在輪到relate的確定時,

下限偏小,上限偏大,一平均也接近目標值。對於不同例子,可能兩者效率比較也不同,所以

可變可不變。

2. 在main中

使用了memset(str,'/0',sizeof(str));

由於str在這裡定義 char str[200];所以sizeof(str)可以正確求值,換用200也是可以的。

而str是乙個未定義的字元陣列,所以不能用strlen(str)。

手寫乙個二分查詢

二分查詢演算法思想 又叫折半查詢,要求待查詢的序列有序。每次取中間位置的值與待查關鍵字比較,如果中間位置的值比待查關鍵字大,則在前半部分迴圈這個查詢的過程,如果中間位置的值比待查關鍵字小,則在後半部分迴圈這個查詢的過程。直到查詢到了為止,否則序列中沒有待查的關鍵字。class erfenfa sor...

python實現乙個二分查詢

二分查詢 二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列 查詢過程 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表...

二分查詢(一)

在演算法題目中,很重要的乙個就是邊界條件的設定,需要我們去明確,變數代表的含義,在迴圈的過程中一直保證此變數的含義不發生變化。含義不發生變化,而非變數值。class binaryclass system.out.println binarysearch2 arr,arr.length,4 publi...