[輝哥帶我學數據結構] 第九章 查找

第九章 查找

9.1 靜態查找表

查找表:

由同一類型的數據元素構成的集合,可利用任意數據結構實現。鬆散的關係。

關鍵字:

可以標識列表中的一個或一組數據元素,若只能標識唯一的關鍵字則稱爲主關鍵字,反之稱爲次關鍵字

查找:

  • 查找對象
  • 查找範圍
  • 查找位置

查找的操作:

1.查找數據元素是否存在

2.檢索數據元素的屬性

3.在查找表中插入一個數據元素

4.刪除一個數據元素

查找的方法:

  • 比較式查找法
  • 計算式查找法

平均查找長度:

9.1.1順序表的查找

typedef struct student{
    KeyType key;
}ElemType;

typedef struct{
    ElemType *elem;
    int length;
}ST;
//查找過程
//在順序表ST中順序查找其關鍵字等於key的元素,若找到,則函數值爲該元素在表中的位置,否則爲0
//EQ(a,b)函數是比較兩個元素是否相等
int Search_Seq(SSTable ST, KeyType key){
    ST.elem[0].key = key;
    int i;
    for(i = ST.length; !EQ(ST.elem[i].key, key); --i);
    return i;
}

性能分析:

9.1.2有序表的查找

//二分查找
int Search_Bin(SSTable ST, KeyType key){
    int low = 1, high = ST.length;
    while(low<=high){
        mid = (low+high)/2;
        if(ST.elem[mid].key==key){
            return mid;
        }else if(ST.elem[mid].key>key){
            high = mid - 1;
        }else{
            low = mid + 1;
        }
    }
    return 0;
}

9.1.4索引順序表的查找

塊內無序,塊間有序

分塊查找基本過程

  • 找到塊
  • 順序查找法

9.2 動態查找表

9.2.1二叉排序樹和平衡二叉樹

二叉排序樹或者是一顆空樹,或者是具有如下性質的二叉樹:

  • 若它的左子樹非空,則左子樹上所有結點的值均小於根節點的值

  • 若它的右子樹非空,則右子樹上所有結點的值均大於根節點的值

  • 他的左右子樹也分別爲二叉排序樹

    ps:二叉排序樹又稱二叉查找樹

1.二叉排序樹的插入與生成:

  • 先與根節點進行比較,比根節點小的往左子樹比較,反之往右子樹比較
  • 在與子樹的根節點進行比較,反覆這個過程
  • 發現當前根節點的左子樹或者右子樹爲空,則插入到對應位置

2.二叉排序樹元素的刪除:

方法一:

  • 刪除操作首先要查找該節點是否存在,在哪個位置
  • 若p爲葉子節點,則可以直接刪除
  • 若p節點只有左子樹,或只有右子樹,則可將p的左子樹或右子樹直接改爲其雙親結點f的左子樹
  • 若p節點既有左子樹又有右子樹,此時有兩種處理方法:
    • 首先找到p節點在中序遍歷序列中的直接前驅s節點(s節點肯定沒有右子樹)
    • 然後將p的左子樹改爲f的左子樹,而將p的右子樹改爲s的右子樹

123

方法二:

  • 找到p節點在中序序列中的直接前驅s節點
  • 用s節點的值替代p節點的值
  • 將s節點刪除
  • 原s節點的左子樹改爲s的雙親節點q的右子樹

3.二叉排序樹的查找

就是二分查找

4.二叉排序樹的查找性能

平衡二叉排序樹

  • 左子樹與右子樹的高度之差的絕對值小於等於1(平衡因子絕對值小於等於1)
  • 左子樹和右子樹也是平衡二叉排序樹

12

若插入元素到右子樹上,那麼應該逆時針轉

9.3 哈希表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章