第七章学习小结
思维导图:
1.二叉排序树(二叉查找树):【虽然折半查找效率较高,但因为顺序表更适用于静态查找,为了实现动态查找又可以达到折半查找的效率,所以引出了二叉排序树】
2.平衡二叉树:【由于二叉树的形态不稳定会影响查找时的时间复杂度,为了能使查找的速度较快(树的高度越小,查找的速度越快)要使树的高度尽可能小,所以引出了平衡二叉树,平衡二叉树是最好的二叉查找树】
3.B-树:【上面的查找方法是内查找法,适用于数据量较小的情况;当数据量较大的时候,需要进行的内、外存交换次数较多,费时较多;所以引出了B-树,使用的是外查找法】
4.散列表:【以上方法在查找过程中只考虑各关键字之间的相对大小,记录在存储结构中的位置与其关键字无直接关系,查找时间与表的长度有关;当结点个数很多的时候,查找需要大量地比较无效的关键字,使得查找速度慢;所以引出了散列表,使得关键字与相应的记录的存储地址建立起联系,这样查找时间就与记录的总数无关】
7-1作业:
1.在机场安检处做爆炸物品检测时,召回率比准确率更重要(F)
2.在度量搜索引擎的结果集的相关度时,召回率很低意味着大多数相关的文档没有被找到。(F)
3.在度量搜索引擎的结果集的相关度时,准确率很低意味着找出的大部分文档是无关的。(T)
【召回率(Recall Rate,也叫查全率,是检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率;精度是检索出的相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率。】
Hashing:
#include <iostream> #include <cmath> using namespace std; int IsPrime(int m); int NextPrime(int m); int main() { int MSize,n,TSize,key;//MSize是用户定义的表格大小,n是输入数字的数量 cin>>MSize>>n; //确定散列表大小 if(IsPrime(MSize)) TSize=MSize; else TSize=NextPrime(MSize);//cout<<TSize<<endl; //初始化散列表 int HT[TSize]; for(int q=0;q<TSize;q++) HT[q]=-1;//cout<<HT[q]<" "; //将元素插入散列表并输出下标 for(int i=0;i<n;i++) { cin>>key; int pos=key%TSize; int temp=pos; int k=0; while(k<TSize)//k>=size后,平方探测将进入一个死循环 {//完成找位置并在散列表中写入key if(HT[pos]==-1)//该位置没有元素就写入key { HT[pos]=key; cout<<pos; break; } else// 该位置有元素,使用平方探测法(仅具有增量)解决冲突,平方探测法是把平方与原 H(key)相加后再 %TSize { k++; pos=(temp+k*k)%TSize; } } if(k==TSize) //退出循环,该元素没有找到位置 cout<<"-"; if(i!=n-1) //非最后一个元素,有空格 cout<<" "; } return 0; } int IsPrime(int m) {//判断是否为素数,是则返回1; if(m<=1) return 0;//1不是素数 for(int i=2;i<=sqrt(m);i++) { if(m%i==0)//是合数 return 0; } return 1; } int NextPrime(int m) {//寻找大于m的下一个最小素数 while(!IsPrime(m)) m++; return m; }