日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分块查找(完整案例与C语言完整代码实现)

發(fā)布時(shí)間:2024/10/14 编程问答 81 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分块查找(完整案例与C语言完整代码实现) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫在前面:博主是一位普普通通的19屆雙非軟工在讀生,平時(shí)最大的愛(ài)好就是聽(tīng)聽(tīng)歌,逛逛B站。博主很喜歡的一句話花開(kāi)堪折直須折,莫待無(wú)花空折枝:博主的理解是頭一次為人,就應(yīng)該做自己想做的事,做自己不后悔的事,做自己以后不會(huì)留有遺憾的事,做自己覺(jué)得有意義的事,不浪費(fèi)這大好的青春年華。博主寫博客目的是記錄所學(xué)到的知識(shí)并方便自己復(fù)習(xí),在記錄知識(shí)的同時(shí)獲得部分瀏覽量,得到更多人的認(rèn)可,滿足小小的成就感,同時(shí)在寫博客的途中結(jié)交更多志同道合的朋友,讓自己在技術(shù)的路上并不孤單。

目錄:
1.分塊查找簡(jiǎn)介
2.分塊查找具體實(shí)現(xiàn)
3.分塊查找代碼(C語(yǔ)言完整代碼)

1.分塊查找簡(jiǎn)介

分塊查找,也叫索引順序查找,算法實(shí)現(xiàn)除了需要查找表本身之外,還需要根據(jù)查找表建立一個(gè)索引表。

例如下圖,給定一個(gè)查找表,其對(duì)應(yīng)的索引表如圖所示:

查找表中共 18 個(gè)查找關(guān)鍵字,將其平均分為 3 個(gè)子表,對(duì)每個(gè)子表建立一個(gè)索引,索引中包含中兩部分內(nèi)容:該 子表部分中最大的關(guān)鍵字 以及 第一個(gè)關(guān)鍵字在總表中的位置,即該子表的起始位置

建立的索引表要求按照關(guān)鍵字進(jìn)行升序排序,查找表要么整體有序,要么分塊有序。 分塊有序指的是第二個(gè)子表中所有關(guān)鍵字都要大于第一個(gè)子表中的最大關(guān)鍵字,第三個(gè)子表的所有關(guān)鍵字都要大于第二個(gè)子表中 的最大關(guān)鍵字,依次類推。

塊(子表)中各關(guān)鍵字的具體順序,根據(jù)各自可能會(huì)被查找到的概率而定。如果各關(guān)鍵字被查找到的概率是相等的,那么可以隨 機(jī)存放;否則可按照被查找概率進(jìn)行降序排序,以提高算法運(yùn)行效率。

2.分塊查找具體實(shí)現(xiàn)

所有前期準(zhǔn)備工作完成后,開(kāi)始在此基礎(chǔ)上進(jìn)行分塊查找。分塊查找的過(guò)程分為兩步進(jìn)行:

  • 確定要查找的關(guān)鍵字可能存在的具體塊(子表);
  • 在具體的塊中進(jìn)行順序查找。


以上圖中的查找表為例,假設(shè)要查找關(guān)鍵字 38 的具體位置。首先將 38 依次和索引表中各最大關(guān)鍵字進(jìn)行比較,因?yàn)?22 < 38 < 48,所以可以確定 38 如果存在,肯定在第二個(gè)子表中。 由于索引表中顯示第二子表的起始位置在查找表的第 7 的位置上,所以從該位置開(kāi)始進(jìn)行順序查找,一直查找到該子表最后一 個(gè)關(guān)鍵字(一般將查找表進(jìn)行等分,具體子表個(gè)數(shù)根據(jù)實(shí)際情況而定)。結(jié)果在第 10 的位置上確定該關(guān)鍵字即為所找

3.分塊查找代碼(C語(yǔ)言完整代碼)

#include <stdio.h> #include <stdlib.h> struct index { //定義塊的結(jié)構(gòu)int key;int start; } newIndex[3]; //定義結(jié)構(gòu)體數(shù)組 int search(int key, int a[]); int cmp(const void *a,const void* b){return (*(struct index*)a).key>(*(struct index*)b).key?1:-1; } int main(){int i, j=-1, k, key;int a[] = {33,42,44,38,24,48, 22,12,13,8,9,20, 60,58,74,49,86,53};//確認(rèn)模塊的起始值和最大值 for (i=0; i<3; i++) { newIndex[i].start = j+1; //確定每個(gè)塊范圍的起始值j += 6;for (int k=newIndex[i].start; k<=j; k++) {if (newIndex[i].key<a[k]) { newIndex[i].key=a[k];}}} //對(duì)結(jié)構(gòu)體按照 key 值進(jìn)行排序qsort(newIndex,3, sizeof(newIndex[0]), cmp); //輸入要查詢的數(shù),并調(diào)用函數(shù)進(jìn)行查找printf("請(qǐng)輸入您想要查找的數(shù):\n");scanf("%d", &key);k = search(key, a); //輸出查找的結(jié)果if (k>0) {printf("查找成功!您要找的數(shù)在數(shù)組中的位置是:%d\n",k+1);}else{printf("查找失敗!您要找的數(shù)不在數(shù)組中。\n");}return 0;} int search(int key, int a[]){int i, startValue;i = 0;while (i<3 && key>newIndex[i].key) { //確定在哪個(gè)塊中,遍歷每個(gè)塊,確定 key 在哪個(gè)塊中i++;}if (i>=3) { //大于分得的塊數(shù),則返回 0return -1;}startValue = newIndex[i].start; //startValue 等于塊范圍的起始值while (startValue <= startValue+5 && a[startValue]!=key){startValue++;}if (startValue>startValue+5) { //如果大于塊范圍的結(jié)束值,則說(shuō)明沒(méi)有要查找的數(shù)return -1;}return startValue; } //運(yùn)行結(jié)果: 請(qǐng)輸入您想要查找的數(shù): 22 查找成功!您要找的數(shù)在數(shù)組中的位置是:7

4.分塊查找小結(jié)

分塊查找算法的運(yùn)行效率受兩部分影響:查找塊的操作和塊內(nèi)查找的操作。查找塊的操作可以采用順序查找,也可以采用折半查 找(更優(yōu));塊內(nèi)查找的操作采用順序查找的方式。相比于折半查找,分塊查找時(shí)間效率上更低一些;相比于順序查找,由于在 子表中進(jìn)行,比較的子表個(gè)數(shù)會(huì)不同程度的減少,所有分塊查找算法會(huì)更優(yōu)。 總體來(lái)說(shuō),分塊查找算法的效率介于順序查找和折半查找之間

本篇博客轉(zhuǎn)載C語(yǔ)言中文網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的分块查找(完整案例与C语言完整代码实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。