導航:首頁 > 源碼編譯 > 數據結構索引表的查找演算法

數據結構索引表的查找演算法

發布時間:2023-09-18 21:53:43

1. 計算機考研:數據結構常用演算法解析(8)

第九章 查找
查找分成靜態查找和動態查找,靜態查找只是找,返回查找位置。而動態查找則不同,若查找成功,返回位置,若查找不成功,則要返回新記錄的插入位置。也就是說,靜態查找不改變查找表,而動態查找則會有插入操作,會改變查找表的。
不同的查找所採用的存儲結構也不同,靜態查找採用順序表,而動碼遲態查找由於經常變動,所以用二叉排序樹,二叉平衡樹、B-和B+。
靜態查找有,順序查找,折半查找,分塊查找(索引順序查找)
順序查找(Sequential Search)是最簡單的一種查找方法。
演算法思路
設給定值為k,在表(R1 R2……Rn)中,從Rn即最後一個元素開始,查找key=k的記錄。若存在一個記錄Ri(l≤i≤n)的key為k,則查找成功,返回記錄序號i;否則,查找失敗,返回0。
演算法描述
int sqsearch(sqlist r,keytype k) //對表r順序查找的演算法//
{ int i;
r.data[0].key=k; //k存入監視哨//
i=r.len; //取表長//
while(r.data[i].key!=k)
i--; //順序查找//
return(i);
}
演算法用了一點技巧:先將k存入監視哨,若對某個i(≠0)有r.data[i].key=k,則查找成功,返回i;若i從n遞減到1都無記錄的key為k,i再減1為0時,必有r.data[0].key=k,說明查找失敗,返回i=0。
平均查找成功長度ASL= ,而查找失敗時,查找次數等於n+l。
折半查找演算法及分析
當記錄的key按關系≤或≥有序時,不管是遞增的還是遞減的,只要有序且採用順序存儲。
演算法描述
int Binsearch(sqlist r,keytype k) //對有序表r折半查找的演算法//
{ int low,high,mid;
low=1;high=r.len; //上下界初值//
while(low<=high) //表空間存在時//
{ mid=(low+high)/2; //求當前mid//
if (k==r.data[mid].key)
return(mid); //查找成功,返回mid//
if (k
high=mid-1; //調整上界,向左部查找//
else
low=mid+1; //調整下界,向右部查找//
}
return(0); //low>high,查找失敗//
}
判定樹:用來描述二分查找過程的二叉樹。n個結點的判定樹的深度和n個結點的完全二叉樹深度相同= 。但判斷樹不一定是完全二叉樹,但他的葉子結點所在層次之差不超過1。所以,折半查找在查找成功時和給定值進行比笑困較的關鍵字個數至多為
ASL=
分塊查找演算法及分析
分塊查找(Blocking Search),又稱索引順序查找(Indexed Sequential Search),是順序查找方法的一種改進,目的也是為了提高查找效率。
1.分塊
設記錄表長為n,將表的n個記錄分成b= 個塊,每塊s個記錄(最後一塊記錄數可以少於s個),即:
且表分塊有序,即第i(1≤i≤b-1)塊所有記錄的key小於第i+1塊中記錄的key,但塊內記錄可以無序。
2.建立索引
每塊對應一索引項:
KeymaxLink
其中Keymax為該塊內記錄的最大key;link為該塊第一記錄的序號(或指針)。
3.演算法思路 分塊索碰模念引查找分兩步進行:
(1)由索引表確定待查找記錄所在的塊;(可以折半查找也可順序因為索引表有序)
(2)在塊內順序查找。(只能用順序查找,塊內是無序的)

考研有疑問、不知道如何總結考研考點內容、不清楚考研報名當地政策,點擊底部咨詢官網,免費領取復習資料:https://www.87dh.com/xl/

2. 數據結構中有哪些查找演算法

和二分查找性能接近的:既然可以二分查找,那麼關鍵字肯定可以滿足全序關系。那麼可以用二叉查找樹,一般的就是平攤O(logn),最壞O(n)。如果用平衡樹,如AVL,Treap,Splay等等,可以做到保持O(logn)的界。
比二分查找性能更優的:大概只有Hash了吧。如果Hash函數設計的好,基本可以認為是O(1)的。這個你最好系統學習一下,尤其是字元串的Hash函數。

3. 數據結構中關於數據查詢的演算法有哪些

數據查詢分靜態查找和動態查找:
靜態查找有:順序查找、有順序表的折半查找、分塊查
動態查找主要用二叉排序數查找。
哈希表 常用的哈希函數有;直接定址法,除留余數法,數字分析法,平方取中法,折疊法。

一般情況下這些就夠用了

4. 數據結構 順序查找演算法和折半查找演算法

//順序查找
int findKey(int array[], int length, int key)
{
for (int i = 0; i < length; i++)
if (array[i] == key)
return i;
return -1;
}
//折半查找
int findKeybyBinary(int array[], int low, int high, int key)
{
if (low > high)
return -1;
int mid = (low + high)/2;
if (array[mid] == key)
return mid;
else if (array[mid] < key)
return findbyBinary(array,mid + 1,high, key);
else
return findbyBinary(array,low,mid - 1, key);
}

查找key=41的演算法: 比較次數:3次
void main ()
{
int array[] = {8,15,19,26,33,41,47,52,64,90};
printf("the pos of 41 is %d \n", findKeybyBinary(array, 0, 9, 41));
}
查找key=35的演算法: 比較次數:6次

void main ()
{
int array[] = {12,76,29,15,62,35,33,89,48,20};
printf("the pos of 41 is %d \n", findKey(array, 10, 35));
}

5. 數據結構與演算法順序查找和折半查找

1.順序查找
又稱線性查找,主要用於在線性表中進行查找。

一般線性表的順序查找:
從線性表的一端開始,逐個檢查關鍵字滿足給定條件。若查找到某個元素的關鍵字滿足給定條件則查找成功,返回該元素在線性表中的位置。若已經查找到表的另一端,但還沒有查找到符合給定條件的元素,則返回查找失敗的信息。

有序表的順序查找:
假設表L是按關鍵字從小到大排列的,查找的順序是從前往後,待查找元素的關鍵字為key。當查找到第i個元素時,發現第i個元素對應的關鍵字小於key,但第i+1個元素對應的關鍵字大於key,這時就可以返回查找失敗的信息。

2.折半查找
又稱二分查找,它僅適用於有序的順序表

首先將給定值key與表中間位置的元素比較,若相等,則查找成功,返回該元素的存儲位置。若不等,則所需查找的元素只能在中間元素以外的前半部分或後半部分。然後在縮小的范圍內繼續進行同樣的查找,如此重復,直到找到為止。或確定表中沒有所需要查找的元素,則查找不成功,返回查找失敗的信息。

3.分塊查找
又稱按索引順序查找,它吸取了順序查找和折半查找各自的優點,既有動態結構,又適於快速查找

將查找表分為若乾子塊。塊內的元素可以無序,但塊之間是有序的,第一個塊中的最大關鍵字小於第二個塊中的所有記錄的關鍵字,以此類推。再建立一個索引表,索引表中的每個元素含有各塊的最大關鍵字和各塊中的第一個元素的地址,索引表按關鍵字有序排列

閱讀全文

與數據結構索引表的查找演算法相關的資料

熱點內容
Python有中文嗎 瀏覽:736
麥塊的伺服器為什麼都進不去 瀏覽:474
新買的伺服器如何打開 瀏覽:35
安卓軟體游戲怎麼開發 瀏覽:319
用撲克擺愛心解壓神器怎麼擺 瀏覽:70
松下製冷壓縮機 瀏覽:275
pdf里怎麼修改文字 瀏覽:686
已保存文檔加密如何設置 瀏覽:413
怎樣判斷加密貨幣是牛是熊 瀏覽:948
初二多項式乘法速演算法 瀏覽:455
android多個布局文件 瀏覽:629
奔跑程序員 瀏覽:468
伺服器如何搭建類似github 瀏覽:292
明日之後安卓太卡怎麼辦 瀏覽:502
如何使用命令方塊找到村莊 瀏覽:767
泛函壓縮映像原理 瀏覽:521
win10清除文件夾瀏覽記錄 瀏覽:966
如何查看伺服器域中所有服務 瀏覽:384
學mastercam91編程要多久 瀏覽:1000
如何查伺服器地址和埠 瀏覽:912