1. 程式人生 > >資料結構之查詢總結

資料結構之查詢總結

查詢演算法 

一、查詢的基本概念

查詢,也可稱檢索,是在大量的資料元素中找到某個特定的資料元素而進行的工作。查詢是一種操作。

二、順序查詢

針對無序序列的一種最簡單的查詢方式。

時間複雜度為O(n)。

靜態查詢表建立

template<class T,class KeyType>
struct StaticTable
{
    T *m_data;
    int m_size;
};

無哨崗的形式

template<class T,class KeyType>
int SeqSearch(StaticTable<T,KeyType>&R,const KeyType key)
{
    int i=0;
    while(i<R.m_size&&R.m_data[i]!=key)
         i++;
    if(i<R.m_size)
         return i;
    return -1;
}

有哨崗的形式

目的,為了減少比較次數,不用判斷是否越界,所以增設哨崗

template<class T,class KeyType>
int SeqSearchWithMonitor(StaticTable <T,KeyType>&R,const KeyType key)
{
     int i=0;
     R.m_data[m_size]=key;//將關鍵字設為最後一個元素這樣就可以減少越界比較
     while(R.m_data[i]!=key)
          i++;
     if(i<R.m_size)
          return i;//輸出關鍵字所在位置
     return  -1;//如果哨崗之前的元素均不符合,則說明該靜態表中沒有所查詢關鍵字
}

三、分塊查詢

特點:塊間有序,塊內無序

(1)折半查詢(二分查詢)是分塊查詢的一種特殊情況,適用於順序儲存,並且關鍵字有序,最多查詢次數(logN+1)時間複雜度O(logN)

template<class T,class KeyType>  
int BinaryTree(StaticTable<T,KeyType>&R,const KeyType key)  
{  
     int low=0,high=R.m_size-1;  
     while(low<=high)//迴圈條件  
     {  
        int mid=(lolw+high)/2;//下取整  
        if(R.m_data[mid]==key) return mid;  
       else if(R.m_data[mid]>key)  
             high=mid-1;//如果關鍵字小於中間數,則改變高位的值  
       else    
             low=mid+1;//如果關鍵字大於中間值,改變低位  
     }       
     return -1;//查詢失敗
 } 
由此衍生出折半查詢判定樹

四、B樹

B樹又稱二叉排序樹(Binary Sort Tree)。

1、概念:

   它或者是一棵空樹;或者是具有下列性質的二叉樹:

  (1)若左子樹不空,則左子樹上所有結點的值均小於左子樹所在樹的根結點的值;

  (2)若右子樹不空,則右子樹上所有結點的值均大於右子樹所在樹的根結點的值;

  (3)左、右子樹也分別為二叉排序樹;

2、B樹的查詢:

時間複雜度與樹的深度的有關。

  步驟:若根結點的關鍵字值等於查詢的關鍵字,成功。

  否則:若小於根結點的關鍵字值,遞迴查左子樹。

  若大於根結點的關鍵字值,遞迴查右子樹。

  若子樹為空,查詢不成功。

3、B樹的插入:

首先執行查詢演算法,找出被插結點的父親結點。

  判斷被插結點是其父親結點的左兒子還是右兒子。將被插結點作為葉子結點插入。

  若二叉樹為空。則首先單獨生成根結點。

  注意:新插入的結點總是葉子結點,所以演算法複雜度是O(h)。

4、B樹的刪除:

  如果刪除的結點沒有孩子,則刪除後演算法結束;

  如果刪除的結點只有一個孩子,則刪除後該孩子取代被刪除結點的位置;

  如果刪除的結點有兩個孩子,則選擇該結點的後繼結點(該結點右孩子為根的樹中的左子樹中的值最小的點)作為新的根,同時在該後繼結點開始,執行前兩種刪除演算法,刪除演算法結束。

5、B+樹

一棵m階的B+樹滿足下列條件:

(1)每個結點最多m個孩子。

(2)除根結點和葉子結點外,其它每個結點至少有ém/2ù個孩子。

(3)根結點至少有兩個孩子。

(4)所有的葉子結點在同一層,且包含了所有關鍵字資訊。

(5)有k個孩子的分支結點包含k個關鍵字。

例如:

五、雜湊(hash)表(雜湊表)

關鍵字:雜湊函式、裝填因子、衝突、同義詞;

關鍵字和和儲存的地址建立一個對應的關係:

Add = Hash(key);

解決衝突方法:

開放定址法 – 探測方式:線性探測、二次探測。

再雜湊法(二次雜湊法)

分離連結法 – 利用連結串列的方式。

查詢找效率不依賴於資料長度n,查詢效率非常快,很多能達到O(1),查詢的效率是a(裝填因子)的函式,而不是n的函式。因此不管n多大都可以找到一個合適的裝填因子以便將平均查詢長度限定在一個範圍內。

相關推薦

資料結構查詢總結

查詢演算法 一、查詢的基本概念查詢,也可稱檢索,是在大量的資料元素中找到某個特定的資料元素而進行的工作。查詢是一種操作。二、順序查詢針對無序序列的一種最簡單的查詢方式。時間複雜度為O(n)。靜態查詢表建立template<class T,class KeyType

資料結構查詢

查詢就是根據給定的某個值,在查詢表中確定一個其關鍵字等於給定值的資料元素。 順序表查詢 順序表查詢(sequential search)又叫線性查詢,是最基本的查詢技術,它的查詢過程是:從表中第一個記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢

資料結構查詢-雜湊查詢

目錄 雜湊法(計算式查詢) 雜湊函式的構造方法 處理衝突的方法 雜湊表的查詢過程 雜湊法(計算式查詢) 雜湊法又稱雜湊法、雜湊發、關鍵字地址計演算法,相應的表成為雜湊表、散列表等。 雜湊法的基本思想:首先在元素的關鍵字k和元素的儲存位置p之間建立一個對應

資料結構查詢-基於樹的查詢

目錄 基於樹的查詢法 二叉排序樹 二叉排序樹的定義與描述 二叉排序樹的插入與建立 平衡二叉排序樹 失衡二叉樹分類及調整方法 基於樹的查詢法 基於樹的查詢法是將待查表組織成特定樹的形式並

資料結構查詢-基於線性表的查詢

基於線性表的查詢法 順序查詢 演算法思想 用所給的元素與列表的中的各個元素進行比較,若相等返回索引,否則返回錯誤資訊。 假設列表長度為$n$那麼查詢第$i$個元素時需進行$n-i+1$次比較,即$C_i=n-i+1$,又假設查詢每個資料元素的概率相等,即$P_i =1/n$,則順序查詢成功的平均查詢長

資料結構查詢(下):雜湊表

雜湊(雜湊)技術既是一種儲存方法,也是一種查詢方法。然而它與線性表、樹、圖等結構不同的是,前面幾種結構,資料元素之間都存在某種邏輯關係,可以用連線圖示表示出來,而雜湊技術的記錄之間不存在什麼邏輯關係,它只與關鍵字有關聯。因此,雜湊主要是面向查詢的儲存結構。雜湊技術

資料結構查詢演算法

一、 實驗目的 1. 掌握查詢的不同方法,並能用高階語言實現查詢演算法; 2. 熟練掌握二分查詢法的構造和查詢方法。 3. 熟練掌握雜湊表查詢方法。 二、 實驗內容 1. 編寫一個程式,輸出在順序表中採用二分查詢法查詢給定關鍵字的過程。 2. 編寫一個程式,輸出在順序表

資料結構快慢指標查詢連結串列中間結點

       單鏈表是一種十分常見和應用廣泛的資料結構,也是面試題經常會問到的一個。近期複習單鏈表,就將這個單鏈表常見的考點順便複習了一遍。       面試題:如何最快的獲取單鏈表的中間節點的位置?   &nb

java資料結構折半查詢

折半查詢,也稱二分法查詢、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法,這裡強調有序表明這種演算法的特定使用場景; 搜素過程為,從陣列中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束; 如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中

資料結構與演算法總結——二叉查詢樹及其相關操作

我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分

Python3&資料結構二分查詢

#實現一個二分查詢 #輸入:一個順序表list和要找的元素 #輸出:待查詢的元素的位置 def binary_search(list,item): low = 0 high = len(list) - 1 while low <= high: mid

資料結構排序篇——插入排序 //無序查詢有序位置,邊比較邊移動,有哨兵

      typedef int DataType; void insert(DataType *a, int n) {     for (int i = 1; i < n; i++) {   

資料結構二叉查詢樹Java實現原始碼及註釋

二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。以下是樓主用jav

資料結構排序篇——插入排序 //無序查詢有序位置,邊比較邊移動,有哨兵

      typedef int DataType; void insert(DataType *a, int n) {     for (int i = 1; i < n; i++) {         //把選擇的元素放在臨時變數中         Da

資料結構基本查詢與樹表查詢(上)

只要你開啟電腦,就會涉及到查詢技術。如炒股軟體中查股票資訊、硬碟檔案中找照片、在光碟中搜DVD,甚至玩遊戲時在記憶體中查詢攻擊力、魅力值等資料修改用來作弊等,都要涉及到查詢。當然,在網際網路上查詢資訊就更加是家常便飯。查詢是計算機應用中最常用的操作之一,也是許多程

資料結構重要樹總結(紅黑樹、B/B+樹等)

眾所周知,二叉樹在資料結構中的分量舉足輕重。之所以分量如此重,是因為在實際中有很多情況用此資料結構會產生很多好處。本文主要對二叉搜尋樹、平衡二叉樹、紅黑樹、B(B+、B*)樹進行總結,因為這幾種樹的概

資料結構 二叉查詢樹(C語言實現)

資料結構之 二叉查詢樹 1. 二叉查詢樹的定義 二叉查詢樹(binary search tree)是一棵二叉樹,或稱為二叉搜尋樹,可能為空;一棵非空的二叉查詢樹滿足一下特徵: 每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此,所有的關鍵字都是唯

資料結構--七大查詢演算法總結

  查詢成功時的平均查詢長度為:(假設每個資料元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;   當查詢不成功時,需要n+1次比較,時間複雜度為O(n);   所以,順序查詢的時間複雜度為O(n)。   C++實現原始碼: int SequenceSearch(in

資料結構線性表總結

前言: 這幾天在學習資料結構,引用書中的一句話:資料結構 = 程式 + 演算法;本篇部落格作為一個知識的總結,希望給大家帶來幫助. 核心 : 線性表定義 從字面意義來看,呈線性,所以說

資料結構線性表學習總結

   鑑於自己的資料結構知識較為薄弱,並且自己常常學完沒幾天又忘了,每次用起來都要去查閱,所以現在開個部落格來記錄自己在學資料結構過程中自己的一些學習總結,也可以加深自己的理解。 第一篇要總結的是線性表。 線性表:零個或多個相同特性的資料元素的有限序列。首先它是一個序列