查找算法:二分查找、顺序查找
生活随笔
收集整理的這篇文章主要介紹了
查找算法:二分查找、顺序查找
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
08年9月入學,12年7月畢業(yè),結束了我在軟件學院愉快豐富的大學生活。此系列是對四年專業(yè)課程學習的回顧,索引參見:http://blog.csdn.net/xiaowei_cqu/article/details/7747205
查找算法
查找算法是在存在的序列(list) 中查找特定的目標(target),要求序列中每個記錄必須與一個關鍵詞(key)關聯(lián)才能進行查找。
查找算法通常需要兩個輸入: 1、被查找的序列 2、要查找的關鍵詞 查找算法的輸出參數(shù)和返回值: 1、返回類型為?Error_code 的值用以表示是否查找成功 2、如果查找成功,返回 success, 輸出參數(shù) position 定位到目標所在位置 3、如果查找失敗,返回?not present,輸出參數(shù)可能是未定義或不同于已有位置的任何值
順序查找算法
順序查找算法的思路很簡單:從表的第一個元素開始一個一個向下查找,如果有和目標一致的元素,查找成功;如果到最后一個元素仍沒有目標元素,則查找失敗。
【實驗說明】
題目:編寫一個程序,對順序表{3,6,2,10,1,8,5,7,4,9},采用順序查找關鍵字5的過程。要求輸出:1)原順序表;2)查找到關鍵字的位置;3)進行比較的次數(shù)。
1.首先要編寫類表List。需要滿足最基本的操作插入insert(),獲取retrieve(),以及得到大小size()。
2.我們觀察題目要求,表中雖然存儲的是簡單的整數(shù),但如果我們使用List<int>對象顯然無法記錄比較次數(shù),所以我們自己寫一個類Key通過其內部int類型的數(shù)據(jù)成員來記錄存于表中的值,并模仿int基本的邏輯操作,即編寫重載邏輯運算符,同時增加一個靜態(tài)數(shù)據(jù)成員comparisons用于記錄其比較操作的次數(shù)。
3.準備工作做好之后開始編寫順序查找算法。算法的思路很簡單,也較易實現(xiàn),從表中第一個元素開始比較,發(fā)現(xiàn)目標則返回元素所在表中位置;若遍歷之后沒有目標,則查找失敗,返回-1表示表中沒有目標元素。 4.按題目要求編寫最后的輸出函數(shù)。
【相關代碼】
函數(shù)?sequential_search [cpp]?view plaincopy二分查找算法
二分查找前提是表是按遞增或遞減順序的規(guī)范表。此次實驗中我們使用的是遞增表。
二分查找從表中間開始查找目標元素。如果找到一致元素,則查找成功。如果中間元素比目標元素小,則仍用二分查找方法查找表的后半部分(表是遞增排列的),反之中間元素比目標元素大,則查找表的前半部分。
【實驗說明】
題目:編寫一個程序,對有序表{1,2,3,4,5,6,7,8,9,10},采用二分查找關鍵字9的過程。要求輸出:1)原順序表;2)查找到關鍵字的位置;3)進行比較的次數(shù)。
1.二分查找算法的前提是表必須是有序的,如題目中是遞增方式排列的表。實現(xiàn)表的有序一方面是用戶規(guī)范輸入,另一方面我們也可以編寫有序的類來方便用戶的輸入。
所以從List中派生類Oredered_list,重新編寫函數(shù)Error_code insert(int position,const Record &data),使插入的位置不滿足表的有序條件時,不能插入。
同時編寫插入的重載函數(shù) Error_code insert(const Record &data),可以直接插入到合適的位置,方便用戶輸入。
2.仍使用題目1中的Key來表示目標
3.實現(xiàn)二分查找算法。通過書中的學習,我們直接使用添加相等判斷的二分查找算法。即每次從表的中間元素開始比較,如果得到目標則返回元素所在表中位置;如果中間元素小于目標元素,則對右半部分繼續(xù)二分查找;反之對前半部分表進行二分查找。若最后都沒有目標元素,返回-1用以表示表中沒有目標元素。
4.仍使用題目1編寫的輸出函數(shù)將結果輸出。
/*注意這里因為Ordered_list是從List中派生而來,所以雖然print_out函數(shù)中第一個參數(shù)類型是List<int>,仍可以使用,而不用編寫重載函數(shù)*/
【相關代碼】
函數(shù)?binary_search [cpp]?view plaincopy【過程記錄】
實驗截圖:【結果分析】
A.實現(xiàn)順序查找算法
1.順序查找算法思路很簡單,就是一種遍歷的思想,一個個查找目標元素,實現(xiàn)也很簡單。2.對于有n個元素的表適用順序查找。比較次數(shù):不成功:比較n次。成功查找:最好的情況為1次,即第一個元素即為目標元素;最差的情況為n次;平均比較次數(shù)(n+1)/2次。
所以當表很大時,順序查找的代價是很大的。
3.順序查找算法不會有重復的比較出現(xiàn),即一旦找到即成功,但同時這種代價是當表中有重復的目標元素時(比如有多個目標元素)我們只能得到第一個元素的位置。
B.實現(xiàn)二分查找算法
1.二分查找法思路:遞增排列的表,首先從中間元素開始查找,如果元素比目標元素小,則查找后半部分表,反之查找前半部分表,并重復這一過程。這樣每次查找中我們都把表的長度減半。2.二分查找在實現(xiàn)中有量bottom和top,每次減半的過程體現(xiàn)在bottom和top的改變上,在代碼的實現(xiàn)上可以使用單純的循環(huán)或者用函數(shù)遞歸的思想。
遞歸思想更容易理解,但編寫之后我們發(fā)現(xiàn)函數(shù)是尾遞歸,尾遞歸通常可以用簡單的循環(huán)實現(xiàn),循環(huán)在操作來說沒有了函數(shù)調用的過程,更節(jié)省時間和空間。
3.編碼中小小地方的改動可能對程序有很大的改觀。
如上述兩種二分查找binary_search_1(不比較等于的情況)binary_search_2(添加等于情況)
實驗代碼下載:http://download.csdn.net/detail/xiaowei_cqu/4437702
(轉載請注明作者和出處:http://blog.csdn.net/xiaowei_cqu?未經(jīng)允許請勿用于商業(yè)用途)
總結
以上是生活随笔為你收集整理的查找算法:二分查找、顺序查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小游戏“终结者”程序的设计与实现
- 下一篇: 迭代最近点算法 Iterative Cl