1. 程式人生 > 其它 >【資料結構】先排序後查詢的查詢

【資料結構】先排序後查詢的查詢

2021-11-30 14:46:14 星期二

序言

查詢,顧名思義,就是從某一集體中找出一個或一種元素。又稱檢索。
其中,在計算機語言學習中,怎麼利用機器對資料進行簡便查詢更是一項重要的工程。
根據對查詢表操作不同,查詢又分靜態查詢和動態查詢。
根據查詢表的特點,我們可以利用不同的方法進行找到我們所需的那個唯一關鍵字。

對於靜態表的查詢方法,這裡我們主要介紹
一、順序查詢(線性查詢)
二、折半查詢(二分或對分查詢)
三、靜態樹表的查詢
四、分塊查詢(索引順序查詢)

對於動態表,我們主要介紹:
典型的動態表—— 二叉排序樹

既然有方法了,那麼怎麼能判斷方法的優劣呢?
這樣就需要一個工具,來簡單的判斷該方法的優劣,它就是ASL(平均查詢長度)

基本概念

查詢表:——————由同一型別的資料元素(或記錄)構成的集合
查 找:——————查詢(Searching)特定元素是否在表中。
查詢成功:——————若表中存在特定元素,稱查詢成功,應輸出該記錄或位置;
查詢不成功:————(與查詢成功對立)否則,稱查詢不成功(也應輸出失敗標誌或失敗位置)
靜態查詢表:————只查詢,不改變集合內的資料元素。
動態查詢表:——既查詢,又改變(增減)集合內的資料元素。
關鍵字:——記錄中某個資料項的值,可用來識別一個記錄
主關鍵字:——可以唯一標識一個記錄的關鍵字
次關鍵字:——識別若干記錄的關鍵字

工具:ASL

如何評估查詢方法的優劣?
明確:查詢的過程就是將給定的K值與檔案中各記錄的關鍵字項進行比較的過程。所以用比較次數的平均值來評估演算法的優劣。稱為平均查詢長度(ASL:average search length)。

其中:
n是記錄個數;
Pi是查詢第i個記錄的查詢概率(通常取等概率,即Pi =1/n);
Ci是找到第i個記錄時所經歷的比較次數。

物理意義:假設每一元素被查詢的概率相同,則查詢每一元素所需的比較次數之總和再取平均,即為ASL。
顯然,ASL值越小,時間效率越高。


例如:
給定一個集合:1 3 7 4 9 0,順序查詢的方法,查詢成功的ASL是多少?
解:對於每一個元素的查詢成功的概率相同,都是1/6 既pi = 1/6,然後每個元素被查詢成功的比較次數分別為(1,2,3,4,5,6)
ASL = (1+2+3+4+5+6)/6 = 21/6

靜態查詢表

抽象資料型別的靜態查詢表的定義為:

ADT StaticSearchTable
{資料物件D:D是具有相同特性的資料元素的集合。每個資料元素均含有型別相同、可唯一標識資料元素的關鍵字。
 資料關係R:資料元素同屬一個集合。
 基本操作P: 
    Create(ST,n);   操作結果:構造一個含n個數據元素的靜態查詢表ST。
    Destroy(ST);    操作結果:銷燬表ST。
    Search(ST,key); 操作結果:若ST中存在其關鍵字等於key的資料元素,則函式值為該元素的值或者在表中的位置,否則為空。
    Traverse(ST,Visit()); 操作結果:按照某種次序對ST的每個元素呼叫函式VIsit()一次且僅一次,一旦visit()失敗,則操作失敗
    
}

(1)順序表的機記憶體儲結構:

typedef  ElemType{
    keyType  key;
    anyType  otherItems;
} ElemType
typedef struct {
          ElemType   *elem; //表基址,0號單元留空。表容量為全部元素
          int               length;     //表長,即表中資料元素個數
}SSTable;

儲存圖例:

順序查詢

利用上圖
如果我們要找出其中的元素四,
首先,要找到其關鍵字(這裡是注關鍵字)------陣列序號也就是長度
然後,選取方法。
這裡我們採用第一種方法,也就是順序查詢

Linear search,又稱線性查詢,即用逐一比較的辦法順序查詢關鍵字,這顯然是最直接的辦法。
(2)演算法的實現:
技巧:把待查關鍵字key存入表頭或表尾(俗稱“哨兵”),
若將待查詢的key存入順序表的首部(如0號單元),則順序查詢的實現方案為:從後向前逐個比較!