第七章学习小结

时间:2022-07-12 16:31:59

1、线性表的查找

  1.1、顺序查找

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

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

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

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

  1.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)二分查找应用场景局限性(适用于静态查找):

      ①顺序存储

      ②针对有序数据

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

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

  2、树表的查找

  2.1、二叉排序树

    (1)条件:

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

      ②左子树是二叉排序树

      ③右子树是二叉排序树

    (2)过程:

      ①查找

      ②插入

      ③创建

      ④删除

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

    (1)最好:O(log2n)

    (2)最坏:O(n)

  3、散列表的查找

  3.1、主要研究问题

    (1)如何构造散列函数

    (2)如何处理冲突

  3.2、好的散列函数的规则

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

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

以下是本章实践的代码,有两种方法(一种自作,一种是网上的思路)

第一种

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
map<string,string>m;
int main()
{
    int n;
    char c;
    string s1,s2;
    cin>>n;
    while(n--)
    {
        cin>>c>>s1>>s2;
        if(c=='L')
        {
            if(m[s1].empty())
                cout<<"ERROR: Not Exist"<<endl;
            else
            {
                if(m[s1]!=s2)
                    cout<<"ERROR: Wrong PW"<<endl;
                    else
                    cout<<"Login: OK"<<endl;
            }
        }
        else
        {
            if(m[s1].empty())
            {
                m[s1]=s2;
                cout<<"New: OK"<<endl;
            }
            else
                cout<<"ERROR: Exist"<<endl;
        }
    }
    return 0;
}

第二种

#include <iostream>
#include <map>
using namespace std;
map<string,string> Map;
map<string,string>::iterator it;

int main()
{
    int N;
    string select, number, password;
    cin >> N;
    while( N-- ){
        cin >> select;
        if( select == "N" ){//注册 
            cin >> number >> password;
            if( Map.find(number) == Map.end() ){//如果不存在,就存入注册 
                Map[number]=password;
                cout << "New: OK" << endl;
            }
            else//存在则报错已存在 
                cout << "ERROR: Exist" << endl;
        }
        else{//登陆 
            cin >> number >> password;
            if( Map.find(number) != Map.end() ){//已注册 
                if( Map[number] == password )//密码正确 
                    cout << "Login: OK" << endl;
                else//密码错误 
                    cout << "ERROR: Wrong PW" << endl;
            }
            else //未注册 
                cout << "ERROR: Not Exist" << endl;
        }
    }
    return 0; 
}

学习心得:马上要期末考试了,有一点慌张……