分治演算法 折半查詢法

2021-09-25 05:55:37 字數 1858 閱讀 6458

二分查詢演算法根據邊界情況不同,一般可分為兩種情況,一中是左閉右開區間,類似於[left,right),一種是左閉右閉區間,在非遞迴二分中,必須遵守一定的區間規則,否則會造成程式錯誤,即區間不能夠重複。

思路:假設目標值在閉區間[l, r]中, 每次將區間長度縮小一半,當l = r時,我們就找到了目標值。

【題目描述】折半查詢法(half.cpp/c/pas)

大魔導師培根曾經說過:「讀史使人明智,讀詩使人聰慧,演算使人精密,哲理使人深刻,倫理學使人有修養,邏輯修辭使人善辯。」由此可見書籍的重要性是不言而喻的。而與書籍天天打交道的圖書管理員,更是奪天地之造化,吸日月之精華的「神之職業」。據史料記載,魔法世界從古至今誕生的眾多不平凡的人物中,有不少人都曾經做過「圖書管理員」,如道家學派創始人老子,威軟公司創始人比耳、少林藏經閣的掃地神僧等等。所以,作為以馬虎自負出名的楚繼光,在魔法學院的社會實踐活動中又怎麼會放過這「天將降大任於斯人也」的必經鍛鍊呢。但想成為乙個合格的圖書管理員並不容易,他必須能夠在一排(10000以內)已按編號大小排好序的圖書中,快速地按編號查詢到某本書所在的位置。

【輸入格式】

輸入檔案第一行是n,表示有n個元素,第二行是n個數,第三行是m表示要查詢的數。

【輸出格式】

乙個數,即如找到該數,則輸出位置,否則輸出-1。

【輸入樣例】

2 4 6

【輸出樣例】

#include#include#include#define max 10001

using namespace std;

int a[max],key;

int search(int bot,int top)

cin >> key;

search(1,n);

return 0;

}

二分非遞迴模板共有兩個:

2.1 [l,mid - 1] [mid,r]

當我們將區間[l, r]劃分成[l, mid - 1]和[mid, r]時,其更新操作是r = mid - 1或者l = mid;此時為了防止死迴圈,計算mid時需要加1;

#include#include#include#define max 10001

using namespace std;

int a[max],key,top,bot,mid,n;

int search(int bot,int top)

cin >> key;

if(a[search(1,n)] == key) printf("%d\n",search(1,n));

else printf("-1\n");

return 0;

}

2.2  [l, mid] [mid + 1, r]

當我們將區間[l, r]劃分成[l, mid]和[mid + 1, r]時,其更新操作是r = mid或者l = mid + 1;計算mid時不需要加1;

#include#include#include#define max 10001

using namespace std;

int a[max],key,top,bot,mid,n;

int search(int bot,int top)

cin >> key;

if(a[search(1,n)] == key) printf("%d\n",search(1,n));

else printf("-1\n");

return 0;

}

小菜鳥乙個,理解不到位請及時指正。

折半查詢 分治法

include 分治策略 設a low.high 是當前的查詢區間,首先確定該區間的中點位置mid low high 2 然後將待查的k值與 a mid key比較 1.若k a mid 則查詢成功並返回該元素的物理下標 2.若ka mid 則要查詢的k必定位於右子表a mid 1.high 中,即...

演算法 折半查詢法

輸入 檔名稱 sum123.cpp 作 者 林海雲 完成日期 2015年1月12日 版 本 號 v2.0 問題描述 給定乙個排序好的陣列,使他可以具備查詢功能 輸入描述 要查詢的數 程式輸出 查詢數的位置 總結 此演算法查詢的依據是從左往右依次查詢,用乙個while語句控制的迴圈實現,在mid的le...

分治法與折半搜尋演算法

分治法 折半搜尋演算法 int binary search int p,int q,int key 要求陣列已經排序。1 divide 取中間節點r,分成兩個陣列 p,r r,q 2 conquer 判斷 r和key的大小,若 r key 返回,若 r key,遞迴處理 p,r 否則遞迴處理 r 1...