演算法與資料結構(三)線性表的查詢演算法

2022-08-01 03:06:15 字數 2550 閱讀 9444

查詢表:由同一類資料元素構成的集合。(線性表、數表、雜湊表)

關鍵字:是資料元素中某個資料項的值,用它可以表示乙個資料元素。(主關鍵字:唯一地標識;次關鍵字:不唯一地標識)

查詢:根據制定的某個值,在查詢表中確定乙個其關鍵字等於給定的這個值的資料元素

動態/靜態查詢:查表的同時改表成為動態查詢,反之為靜態查詢

平均查詢長度:asl=∑pici (i=1,2,3,…,n),pi 為查詢表中第i個資料元素的概率,ci為找到第i個資料元素時已經比較過的次數。

(1)順序查詢

(2)二分查詢(折半查詢)

(3)分塊查詢

從表的一端開始,依次將記錄的關鍵字與給定的值進行比較。

順序查詢既適用於順序儲存結構(陣列),又適用於鏈式儲存結構(鍊錶),以下介紹順序儲存結構:

資料元素的型別:

1 typedef struct

elemtype

1 typedef struct

sstable;

**:

1

intlocateelem(sqlist l,elemtype e)

2

改進:把待查關鍵字key存入表頭(「哨兵」),從後向前逐個比較,可免去查詢過程中每一步都要檢測是否查詢完畢,加快速度。

1

intsearch_seq( sstable st , keytype key )

順序查詢的效能分析:空間複雜度:乙個輔助空間。

時間複雜度:

1) 查詢成功時的平均查詢長度 設表中各記錄查詢概率相等 asls(n)=(1+2+ ... +n)/n =(n+1)/2

2)查詢不成功時的平均查詢長度 aslf =n+1

例:找「21」:

若k==r[mid].key,查詢成功

若k若k>r[mid].key,則low=mid+1

**:(迭代)

1

intsearch_bin(sstable st,keytype key)

9return

0; //

表中不存在待查元素

10 }

*需要特別注意的是迴圈執行的條件是:low<=high,而不是low,因為low=high時,還要比較最後乙個元素。

**:(遞迴)

1

int search_bin (sstable st, keytype key, int low, int

high)

2

二分查詢的效能分析——判定樹

若所有結點的空指標域設定為乙個指向乙個方形結點的指標,稱方形結點為判定樹的外部結點;對應的,圓形結點為內部結點。

查詢成功時的平均查詢長度:asl=1/11*(1*1+2×2+4×3+4*4 )=33/11=3

查詢成功時比較次數:為該結點在判定樹上的層次數,不超過樹的深度 d = [log2n] + 1 查詢不成功的過程就是走了一條從根結點到外部結點的路徑d或d-1。

二分查詢的效能分析:

查詢過程:每次將待查記錄所在區間縮小一半,比順序查詢效率高,時間複雜度o(log2 n)

適用條件:採用順序儲存結構的有序表,不宜用於鏈式結構

分塊有序,即分成若干子表,要求每個子表中的數值都比後一塊中數值小(但子表內部未必有序)。 然後將各子表中的最大關鍵字構成乙個索引表,表中還要包含每個子表的起始位址(即頭指標)。

① 對索引表使用折半查詢法(因為索引表是有序表);

② 確定了待查關鍵字所在的子表後,在子表內採用順序查詢法(因為各子表內部是無序表);

查詢效率:asl=lb+lw(lb:對索引表查詢的asl;lw:對塊內查詢的asl)

分塊查詢的效能分析:

優點:插入和刪除比較容易,無需進行大量移動。

缺點:要增加乙個索引表的儲存空間並對初始索引表進行排序運算。

適用情況:如果線性表既要快速查詢又經常動態變化,則可採用分塊查詢。

資料結構與演算法 三 線性表基礎

2.1 線性表的定義和基本操作 線性表是有序且有限的 2.1.2 存在乙個唯一的被稱為 第乙個 的資料元素 2.2.2 存在乙個唯一的被稱為 最後乙個 的資料元素 2.2.3 除了第乙個元素外,每個元素均有唯一乙個直接前驅 2.2.4 除了最後乙個元素外,每個元素均有唯一乙個直接後繼。線性表 lin...

資料結構與演算法筆記(三)線性表

是乙個由n的資料元素的有限序列,最常見的是鏈式表達也叫做線性鍊錶 鍊錶。再鍊錶中儲存的資料元素叫做節點,乙個節點儲存就是一條資料記錄。每個資料節點包括2部分,第乙個是資料值,第二個是指向下乙個節點的指標。在鍊錶的最前面,通常有乙個頭指標來指向第乙個節點,對鍊錶的最後乙個節點,沒有下乙個節點,它的指標...

資料結構與演算法(三) 線性表一

線性表 list 由零個或多個資料元素組成的有限序列 資料型別 是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱 例如在c語言中按照取值不同,資料型別可以分為兩類 原子型別 不可以再分解的基本型別,例如整型,浮點型,字元型 結構型別 由若干個型別組合而成,是可以再分解的,例如整型陣列 抽象...