• 数据结构第七章总结


    第七章的学习主要内容是查找。

    一、查找的基本概念有(1)查找表(2)关键字(3)查找(4)动态查找表和静态查找表(5)平均查找长度

    二、线性表的查找

      1、顺序查找

        (1)从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败

        (2)时间复杂度O(n)

        (3)优点:算法简单,对表结构无要求,无论记录是否按关键字有序均可应用

        (4)缺点:平均查找长度较大,查找效率较低

      2、折半查找

        (1)满足有序、顺序存储可用

        (2)T(n)=O(log2(n)),S(n)=O(1)  

        (3)无序顺序存储:T(n)=O(nlog(n))+O(log2(n))=O(nlog2(n))

        (4)关于链式存储:可以应用二分查找,但不能在log2(n)时间复杂度内,因为无法随机存取

        (5)二分查找应用场景局限性(适用于静态查找):

          ①顺序存储

          ②针对有序数据

          ③数据量小且比较操作不耗时,不需要二分

          ④数据量不可太大(超出内存可用连续空间)

      三、树表的查找

      1、二叉排序树

        (1)条件:

          ①左子树小于根节点,右子树大于根节点

          ②左子树是二叉排序树

          ③右子树是二叉排序树

        (2)过程:

          ①查找

          ②插入

          ③创建

          ④删除

      2、不同插入次序生成结果不同

        (1)最好:O(log2n)

        (2)最坏:O(n)

      四、散列表的查找

      1、主要研究问题

        (1)如何构造散列函数

        (2)如何处理冲突

      2、好的散列函数的规则

        (1)函数计算要简单,每一关键字只能由一个散列地址与之对应

        (2)函数的值域须在表长的范围内,计算出的散列地址的分布应均匀,尽可能减少冲突

    本章PTA的题目分享是实践的一道题:

    7-1 QQ帐户的申请与登陆 (30 分)
     

    实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

    输入格式:

    输入首先给出一个正整数N(≤),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

    输出格式:

    针对每条指令,给出相应的信息:

    1)若新申请帐户成功,则输出“New: OK”;
    2)若新申请的号码已经存在,则输出“ERROR: Exist”;
    3)若老帐户登陆成功,则输出“Login: OK”;
    4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
    5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

    输入样例:

    5
    L 1234567890 myQQ@qq.com
    N 1234567890 myQQ@qq.com
    N 1234567890 myQQ@qq.com
    L 1234567890 myQQ@qq
    L 1234567890 myQQ@qq.com
    

    输出样例:

    ERROR: Not Exist
    New: OK
    ERROR: Exist
    ERROR: Wrong PW
    Login: OK


    代码如下:
    #include <iostream>
    #include <map>
    using namespace std;
     
    typedef struct
    {
        string name;
        string secret;
    }QQ;    //定义一个结构体包含账号与密码
     
    QQ a[100005];   //为结构体开辟最大空间
     
    int main()
    {
        int n;  //定义参数
        cin>>n;   //输入指令个数
         
        map<string,string> search;    //创建一个map容器 方便账号与密码的匹配
         
        int i,j;    //定义参数
         
        char demand;    //定义字符参数判断'L'与'N'
         
        for(i=0;i<n;i++)
        {
            cin>>demand;  //输入指令类型
             
            if(demand=='N') //若为新账号
            {
                cin>>a[i].name>>a[i].secret;    //输入账号密码
                 
                if( search.find(a[i].name)==search.end() )  //若该账号未存在
                {
                    search[a[i].name]=a[i].secret;  //往map容器中插入账号与对应的密码
                     
                    cout<<"New: OK"<<endl;  //输出语句
                }
                else    //若该账号已存在
                {
                    cout<<"ERROR: Exist"<<endl; //输出语句
                }
            }
             
            else if(demand=='L')    //若为老账号
            {
                cin>>a[i].name>>a[i].secret;    //输入账号密码
                 
                if( search.find(a[i].name)==search.end() )cout<<"ERROR: Not Exist"<<endl;   //若该账号未存在,输出语句
                 
                else    //若该账号存在
                {
                    if(search[a[i].name]==a[i].secret)cout<<"Login: OK"<<endl;  //输入密码正确,输出语句
                    else cout<<"ERROR: Wrong PW"<<endl; //输入密码错误,输出语句
                }
            }
        }
         
        return 0;
    }

    题目难度并不难,程序复杂程度也不大,最重要还是要分好类,逻辑要比较清晰,做起来就比较简单了。

    学习心得:查找的话在以后的开发中运用的会比较多,我觉得随处可见要用到查找的,感觉是很实用也很重要的一项东西。

    而查找的算法我掌握得还不是特别好,下阶段应该要加强对其算法的理解。

    学习资料推荐:

    1.关于B-树介绍的大牛博客:https://blog.csdn.net/u013411246/article/details/81088914

    2.关于处理冲突的方法:https://www.cnblogs.com/ch122633/p/9062827.html

  • 相关阅读:
    Linux运维之监控CPU和内存的日志工具
    Linux磁盘缓存的有趣实验
    Linux运维之内存分析2
    Linux运维之内存分析
    使用kubectl create 和 kubectl apply创建资源对象的区别
    Docker学习:Image的本地存储结构
    Docker 空间使用分析与清理
    HeidiSQL、Navicat、mysql命令和source命令导入sql脚本的速度比较
    Centos 7.2天兔(Lepus 3.8)数据库监控系统部署
    MegaCli 监控raid状态
  • 原文地址:https://www.cnblogs.com/fengwanthousand/p/10963111.html
Copyright © 2020-2023  润新知