原問題來自: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...