1. 程式人生 > 實用技巧 >第七章學習小結

第七章學習小結

一、主要內容

1、這一章節主要學習查詢的演算法,主要分為:

  1)靜態查詢(順序查詢、二分查詢、插值查詢、索引查詢等)和動態查詢(二叉排序樹、平衡二叉樹、B樹、散列表);

  2)無序查詢和有序查詢。

2、個人感覺比較難的是與樹相關的查詢:

  二叉樹表:二叉樹表特點是該節點左子樹的值小於該節點的值,右子樹的值大於該節點的值。

  AVL樹:又名平衡樹,將每個節點的左子樹高與右子樹高的差值取絕對值,所有節點的絕對值的值小於等於1。

  B樹:平衡的多叉樹,一個節點有多於兩個(不能小於)結點的平衡多叉樹。

  B+樹:B+樹是對B樹的一種變形樹,利用指標和二分法進行查詢。

3、二分查詢的遞迴與非遞迴演算法

int Search(SSTable ST, KeyType key, int low, int high) 
{
    if(low >high) return 0;//找不到則return 0;
    mid = (low+high) / 2;
    if(key == ST.R[mid].key) 
              return mid;//找到則return所在表中的下標 
    else if(key < ST.R[mid].key)
              return Search(ST,key,low,mid-1);//遞迴查詢左段
    else 
             return
Search(ST,key,mid+1,high);//遞迴查詢右段 }
二分遞迴
int Search(SSTable ST, KeyType key) 
{
    int low = 1, high = ST.length;//初始化 
    while(low <= high) 
    { 
        mid = (low+high) / 2; 
        if(key == ST.R[mid].key) 
            return mid;//找到則函返回在表中的位置下標
        else if(key < ST.R[mid].key) 
            high 
= mid-1; //左段查詢 else low = mid + 1; //右段查詢 } return 0; //表中不存在待查元素,返回0 }
二分非遞迴

二、學習心得

1、實踐1:二分查詢變形

  我一直卡在“若不存在這樣的數,輸出-1”這個地方,前前後後在while裡面改了好幾遍,經歷了部分正確到段錯誤,從16分到0分,我都快被自己繞暈了…後來去洗澡放空自己的時候終於想起了“a[0:n-1]是按非降序排列的陣列”,要“查詢自左向右第一個大於等於x的值”,那不存在的話就說明x大於數組裡所有元素,直接在while外面加一句“if(x>a[high]) return -1”就正確了,修修改改程式碼面目全非,沒想到最後還是回到最初的程式碼,事實證明要認真審題,想不通時不要太倔,重新審題換個思路想想。

2、作業: Hashing

  首先要是要寫好判斷素數、讀入表長不為素數時要找大於他的最小素數的函式;然後是要用二次(平方)探測法處理衝突。思路其實蠻清晰的,但最後一個測試點一直過不去,令人頭禿。

3、作業客觀題:

  召回率:Recall,又稱“查全率”,是檢索出的相關文件數和文件庫中所有的相關文件數的比率,衡量的是檢索系統的查全率;

  準確率:Precision,又稱“精度”、“正確率”,是檢索出的相關文件數與檢索出的文件總數的比率,衡量的是檢索系統的查準率。

三、下階段目標

  學好最後一章,好好複習前面快要忘記的知識點,爭取期末考個好成績!