大話資料結構 順序表 有序表 線性索引查詢

2021-07-03 04:46:13 字數 3732 閱讀 5181

查詢

根據給定的某個值,在查詢表中確定乙個其關鍵字(唯一的標識乙個記錄)等於給定值的資料元素或資料記錄。

靜態查詢:只查詢,不修改元素[線性表、順序查詢、二分查詢]

動態查詢:查詢時,插入或者刪除元素[二叉排序樹]

順序表查詢

順序查詢(針對靜態查詢表),也叫線性查詢o(n),從頭開始遍歷,直到最後乙個記錄。

優化:新增哨兵

//有哨兵的順序查詢

int foo(int *a,int n,int key)

return i;

}

有序表查詢1.二分查詢o(logn):

前提元素有序,原因具有n個節點的完全二叉樹的深度為[logn]+1(取下)。儘管不是完全二叉樹,但是同樣的推導,最壞找到最後一層。

不適合動態查詢。

2.插值查詢o(logn)

根據要查詢的關鍵字key與查詢表中最大最小記錄的關鍵字比較後的查詢方法。

二分基礎上修改,low+1/2(high-low)中1/2–>(key-a[low])/(a[high]-a[low])(插值公式)

3.斐波那契查詢o(logn)

**分割原理。

斐波那契數列

//斐波那契查詢

int foo(int *a,int n,int key)

else

if(key>a[mid])

else

}return

0;}

斐波那契查詢演算法的核心:

當key=a[mid],成功;

當key< a[mid],新範圍是第low個到第mid-1個,此時範圍個數為f[k-1]-1個;

當key> a[mid],新範圍是第m+1個到第high個,此時範圍個數為f[k-2]-1個。

平均效能優於二分查詢。

有序表查詢的三種方法中,二分進行加法與除法運算,插值查詢進行複雜的四則運算,而斐波那契查詢只是進行最簡單加減法運算,在海量資料的查詢過程中,這種細微的差別可能會影響最終的查詢效率。

三種查詢的本質是分隔點的選擇不同。

線性索引查詢

將索引項集合組織為線性結構,即索引表。

1.稠密索引:每個記錄對應乙個索引項,索引項按照關鍵碼有序,適合少量資料。

查詢時,可用二分,插值等從索引表中查詢關鍵碼。

資料量大,意味著索引也得同樣的資料集長度規模,不適用。

2.分塊索引:塊內無序(二分等),塊間有序(順序查詢)。每塊對應乙個索引,

類似圖書館藏書原理。

n個記錄的資料集被平均分為m塊,每個塊中有t條記錄。n=mxt。

lb為查詢索引表的平均查詢長度。lb=(m+1)/2,

lw為塊中查詢記錄的平均查詢長度。lw=(t+1)/2。

分塊索引查詢的平均查詢長度為:

公式依賴n、t兩個變數。

最好情況m=t,此時

比順序查詢o(n)快,比二分o(logn)慢。

3.倒排索引

由屬性(字段、關鍵字)的值確定記錄的位置。

這種索引表中的每一項都包括乙個屬性值和具有該屬性值的各記錄的位址。

由於不是有記錄來確定屬性值,而是有屬性值來確定記錄的位置,因而叫倒排索引。

優點:查詢記錄快

缺點:記錄號不定長。

附加原始碼:

#include "stdio.h"    

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 100 /* 儲存空間初始分配量 */

typedef

int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

int f[100]; /* 斐波那契數列 */

/* 無哨兵順序查詢,a為陣列,n為要查詢的陣列個數,key為要查詢的關鍵字 */

int sequential_search(int *a,int n,int key)

return0;}

/* 有哨兵順序查詢 */

int sequential_search2(int *a,int n,int key)

return i;

}/* 折半查詢 */

int binary_search(int *a,int n,int key)

}return0;}

/* 插值查詢 */

int interpolation_search(int *a,int n,int key)

return0;}

/* 斐波那契查詢 */

int fibonacci_search(int *a,int n,int key)

else

if (key>a[mid])

else

}return0;}

int main(void)

; for(i=0;i<=maxsize;i++)

result=sequential_search(a,maxsize,maxsize);

printf("sequential_search:%d \n",result);

result=sequential_search2(a,maxsize,1);

printf("sequential_search2:%d \n",result);

result=binary_search(arr,10,62);

printf("binary_search:%d \n",result);

result=interpolation_search(arr,10,62);

printf("interpolation_search:%d \n",result);

f[0]=0;

f[1]=1;

for(i = 2;i < 100;i++)

result=fibonacci_search(arr,10,62);

printf("fibonacci_search:%d \n",result);

return

0;}

大話資料結構 順序表

線性表就是0個或多個資料元素的有限序列 元素之間存在順序,除開頭結尾之外,每個元素有且僅有乙個前驅元素,後繼元素。線性表的順序儲存叫做順序表,簡單的說就是對陣列進行封裝,使得更好的滿足需求。1.線性表的順序儲存結構 線性表的順序儲存結構指的是用一段位址連續的記憶體依次儲存線性表的資料元素 2.線性表...

《大話資料結構》 線性表

created by pengxiangzhou on 2021 1 24.include ifndef c ds linear list h define c ds linear list h endif c ds linear list h 線性表 順序儲存結構 順序儲存結構的三個屬性 陣列da...

大話資料結構 線性表

線性表是零個或多個資料元素的有限序列。線性表的抽象資料型別定義如下 adt 線性表 list data 線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的...