转自 : http://blog.csdn.net/hackerain/article/details/6093165
#include<iostream> using namespace std; typedef struct { int r[100]; int length; }SSTable; int Search_Seq(SSTable &ST, int k) { int i; ST.r[0]=k; i=ST.length; while (ST.r[i]!=k) i--; return i; } int Search_Bin(SSTable &ST, int k) { int low,high,mid; low=1; high=ST.length; while (low<=high) { mid=(low+high)/2; if (k==ST.r[mid]) return mid; else if (k<ST.r[mid]) high=mid-1; else low=mid+1; } if (low>high) return 0; } typedef struct { int key; int stadr; }IndexItem; typedef struct { IndexItem elem[51]; int length; }IndexTable; int Search_Index(SSTable &ST,IndexTable &ID, int k) { int low,high,mid; int p; int s,t; low=0; high=ID.length-1; while (low<=high && p<0) { mid=(low+high)/2; if (k>ID.elem[mid-1].key && k<ID.elem[mid].key) p=mid; else { if (k<ID.elem[mid].key) high=mid-1; else if (k>ID.elem[mid].key) low=mid+1; else p=mid; } } s=ID.elem[p].stadr; if (p==ID.length-1) t=ST.length; else t=ID.elem[p+1].stadr-1; while (k!=ST.r[s]&&s<=t) s++; if (s>t) return 0; else return s; } void CreateTable(SSTable &ST,IndexTable &ID, int n, int m) { int i; cin>>ST.length; for (i=1;i<=n;i++) cin>>ST.r[i]; cin>>ID.length; for (i=0;i<m;i++) cin>>ID.elem[i].key>>ID.elem[i].stadr; } void main() { freopen("in.txt" , "r" ,stdin); int i,j,k; SSTable ST; IndexTable ID; CreateTable(ST,ID,34,7); i=Search_Index(ST,ID,80); cout<<ST.r[i]<<endl; /*cin>>ST.length; for (i=1;i<=10;i++) cin>>ST.r[i]; j=Search_Bin(ST,30); cout<<ST.r[j]<<endl;*/ k=Search_Seq(ST,120); cout<<ST.r[k]<<endl; }
静态查找本身不是很难,要说难的话,难点就在于分块查找。分块查找是先构建一个索引,该索引是有序的,如果在索引里用对半查找的话,肯定要能节省一些时间,而在每个块中的元素是无序的,所以只能用顺序查找,但是我在用对半查找方法写索引时,遇到点问题,对索引表的对半查找,不像单纯的对半查找一样,需要考虑比较多的情况,一开始我看书上的没看懂,又去网上搜一下,可是搜到的全都是用顺序查找方法查找的索引,我想既然索引表是有序的,如果不利用它这个特性,岂不是浪费?所以我就硬着头皮,去考虑对半查找的方法查找索引表的情况,程序中是我自己想出来的一个方法。书上的方法,虽然简单可行,但是让人理解起来可是非常不容易的。我觉得写程序追求的就是简单并且具有很好的可理解性,如果程序能符合我们大脑的正常思维过程,那是最好的了,易理解但执行起来又很快,但是个别除外(像一些特殊的算法)。不管怎么样,今天又写程序了,又克服了一个小难题,挺开心的!等你写程序,真正的深入到它以后,发现就会越来越喜欢它了,写程序也是一件蛮有意思的一件事情。
平均查找长度:
设关键字个数为n,在各关键字等概率查找的前提下, 1、顺序查找的平均查找长度ASL=(n+1)/2, 2、在n趋于无穷大时,折半查找的ASL=((n+1)log2(n+1))/n - 1,当n大于50时,ASL约等于log2(n+1)-1 3、设分块查找中将长为 n 的表分成均等的 b 个块,每块 s 个元素,则 b = (n / s)上取整,如果索引表中采用顺序查找,则ASL=(b+1)/2+(s+1)/2;如果索引表中采用折半查找,则ASL=(s+1)/2+log2(b+1)-1
追问:
144个记录的文件,分块查找法,折半查找确定块,每块长度8,则平均查找长度是多少 帮做一下,我算的结果和答案不一样
追答:
差别不会很大吧,因为那个ASL=(s+1)/2+log2(b+1)-1中的折半查找用的是理论值 144条记录,每块8条,则索引项为144/8=18项,块内查找是(8+1)/2= 4.5,索引中用折半查找18项的ASL准确值是(1*1+2*2+4*3+8*4+3*5)/18 = 64/18约等于3.5 所以ASL约为3.5+4.5 = 8
追问:
答案不是那个啊 答案是14难道是答案错了
追答:
答案是14,那就是这个索引表中采用顺序查找而不是折半查找,则ASL=(b+1)/2+(s+1)/2=(8+1)/2+(18+1)/2=14 如果确实题目是如此:分块查找法,折半查找确定块,那就是答案弄错了