数据结构:第七章学习小结

  这一章我们学习了线性表、树表、散列表的查找。下图是我对本章所学知识的大致总结。

 

这一章的知识点非常多且极易记混淆,所以对我而言还是很有难度的。

首先在学习线性表的查找时,重点就是二分查找法。其中要注意两点:1.low<=high而不是low<high;  2.high=mid-1而不是high=mid

学习散列表的查找时,重点就是处理冲突的方法。

 

作业思考:

1.在做实践一:二分查找变形时,我的思维还是受到了一定的局限,太过于依赖书上提供的代码,导致自己思考问题不够透彻,打出的代码也复杂难懂,且有多处冗余。在跟同学交流后,才学习到了更好的做法:

int Search_Bin(SSTable ST,int key)
{
    int low=0,high=ST.length-1,mid;
    if(key<ST.R[low]) return 0;//如果key小于有序表中第0位,那么0就是自左向右大于key的一个数的下标 
    if(key>ST.R[high]) return -1;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(key<=ST.R[mid]) high = mid - 1; 
        else low = mid + 1;
    }
    return low;
}

2.在作业题中,有关召回率和准确率的题目也让我感到困惑,好在找到了这篇博客 https://www.cnblogs.com/huanglifeng/p/8350395.html

召回率(Recall Rate,也叫查全率)是检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率;精度是检索出的相关文档数与检索出的文档总数的比率,衡量的是检索系统查准率。召回率(Recall)和精度(Precise)是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。

3.在代码题Hashing中,我参考了这篇博客:https://blog.csdn.net/qq_38975493/article/details/90370475?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159322718219195265942279%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159322718219195265942279&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-10-90370475.pc_search_back_js3&utm_term=7-1Hashing

虽然他的分析不是非常详细,也没有注释,但是代码非常清晰

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
 
struct Hash{
    int Size;
    int *Num;
}H;
 
int InsertHash(int X){
    int Realkey;
    int key=X%H.Size;
    int k=0;
    while(k<=H.Size){
        Realkey=(key+pow(k*1.0,2.0));
        Realkey=Realkey%H.Size;
        if(!H.Num[Realkey]){
            H.Num[Realkey]=X;
            break;
        } 
        k++;
    }
    if(k>H.Size) Realkey=-1;
    return Realkey;
}
 
int IsPrime(int M){
    int i;
    for(i=2;i<=sqrt(M);i++){
        if(M%i==0) return 0;
    }
    return 1;
}
 
int main(){
    int i;
    int M,N;
    scanf("%d%d",&M,&N);
    i=M;
    while(!IsPrime(i)) i++;
    if(i==1) i++;
    H.Size=i;
    H.Num=(int*)malloc(H.Size*sizeof(int));
    for(i=0;i<H.Size;i++) H.Num[i]=0;
    int X,Position[N];
    for(i=0;i<N;i++){
        scanf("%d",&X);
        Position[i]=InsertHash(X);
    }
//    printf("H.size=%d\n",H.Size);
    for(i=0;i<N;i++){
        if(Position[i]!=-1) printf("%d",Position[i]);
        else printf("-");
        if(i<N-1) printf(" ");
        else printf("\n");
    }
    return 0;
} 

但是我觉得在处理冲突时可以不用pow函数,毕竟k是int型变量,转换为double型变量也不是非常妥当;

题目难点在于处理冲突部分,易错点在于1不属于质数,需要特别注意。

 

学习心得:查找这一章的内容有我们熟悉的顺序查找和二分查找,也有我们闻所未闻的B-、B+树和哈希表,虽然整体是一个从简到难的学习过程,但难的部分我还是没能够掌握好,在做思维导图回顾整篇内容时,我也明显感觉到了知识点的陌生,这一点还是要怪我看书看少了,所以接下来不仅是本章内容还有全面复习,我都需要回到课本,结合以往作业,对所学知识进行汇总。

posted @ 2020-06-28 00:30  陈思宇123  阅读(176)  评论(0编辑  收藏  举报