ps:昨天偷懶了o(╥﹏╥)o,不能再這樣了!
這一章比較簡單,就只簡單記錄一下關鍵點。
對於查詢問題,有難有易。可能只是直接的對某個數字的查詢,也可能涉及搜尋等相對難度更大的演算法。
常用的查詢方法:二分查詢——建立在查詢元素排列有序的前提上。關於「查詢」,有幾個關鍵的概念:
查詢空間。
也常被稱為解空間。所謂查詢,就是在該查詢空間中找尋符合我們要求的解的過程。在例2.9中,整個陣列包含的整數集就是查詢空間。
查詢目標。
我們需要乙個目標來判斷查詢空間中的各個元素是否符合我們的要求,以便判斷查詢活動是否已經成功。在例2.9中,即陣列中的數字與目標數字是否相同。
查詢方法。
即利用某種特定的策略在查詢空間中查詢各個元素。不同的策略對查詢的效率和結果有不同的影響,所以對於某個特定的問題,我們要選擇切實可行的策略來查詢解空間,以期事半功倍。在例2.9中,查詢方法即線性地遍歷陣列。
以在有序表查詢3為例,二分查詢過程為:
將查詢開始點設為第乙個陣列元素(1),結束點設為最後乙個陣列元素(10),即查詢子集為整個搜尋空間。
然後將起始點和結束點正中間的數與查詢目標進行比較,若該中間數字等於目標數字則查詢成功,查詢結束;若大於查詢目標,則說明查詢目標只可能存在於查詢子集中以該中間數字為界的較小的一半中,則移動查詢結束點為該中間數字的前乙個數字,即新的查詢子集為舊的查詢子集中以中間數字為界的較小的一半;若小於查詢目標,則相應的得到新的查詢子集為舊查詢子集中以中間數字為界的較大的一半。在該例中,即目標數字3小於中間數字5,移動查詢結束點至中間點(5)的前乙個元素(4),新的查詢子集為,然後繼續步驟2。
若在查詢過程**現查詢起始點大於查詢結束點的情況,則說明查詢子集已經為空集,查詢失敗。否則繼續步驟2的查詢過程。
用二分查詢查詢長度為l的有序陣列,時間複雜度可由原本線性查詢的o(l)降低到o(logl)。
具體例子參見p39頁例2.10。
在乙個公升序有序的陣列中,確定乙個下標點,使在這個下標點之前(包括該下標點)的數字均小於等於目標數字(該目標數字一定大於等於陣列中最小的數字),而陣列的其餘部分均大於目標數字。
//
// created by pm on 2020/2/4 21:47
////存在乙個公升序有序的陣列buf,其大小為size,目標數字為target
int base = 0 , top = size; //初始情況與二分查詢一致
while (base <= top)
//最後,top即為我們要求的數字陣列下標,buf[top]為該數字本身
int ans = top;
王道機試 第二章 暴力求解 2 1 列舉
例2.1 abc abcab c 清華大學複試上機題 include using namespace std intmain return0 例2.2 反序數 清華大學複試上機題 include include using namespace std intmain return0 例2.3 對稱平...
《TCP IP入門經典》第二章總結
tcp ip協議模型是四層 非絕對,只是常見tcp ip模型是四層 應用層 傳輸層 網際層 網路訪問層 osi模型是iso 國際標準化組織 為了標準化網路協議系統所作的規範,七層 應用層 表示層 會話層 傳輸層 網路層 資料鏈路層 物理層 資料報 資料傳送都是從應用到網路,中間每層都把頭資料 實際資...
演算法競賽入門經典第二章
123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 3233 3435 3637 3839 4041 4243 4445 4647 4849 5051 5253 5455 5657 5859 6061 6263 6465...