第七章学习小结

本章相对于前几章的学习,更多的是基础的衍生与应用。主要介绍了数据处理中经常使用的操作——查找。

本章的查找表主要是三种:线性表,树表,散列表。

 

线性表:顺序查找,折半查找,分块查找

顺序查找:O(n)的时间复杂度,简单操作,但是效率低下

折半查找:O(log2n)的时间复杂度,查找效率较高但是较为适合有序的顺序表,不适合经常做插入和删除的线性表

分块查找:时间复杂度取决于所在块的查找方式,查找效率中等。

 

树表:二叉排序树,平衡二叉树,B树B+树

二叉排序树适合形态均匀的二叉树,例如平衡二叉树是最好的例子,众生平等,可以确保任何情况下深度均为O(log2n)。

B树是一种平衡的多叉查找树,是一种在外存文件系统中常用的动态索引技术(引自课本)。与二叉排序树类似,顺指针查找结点和结点内的关键字中查找交叉进行。

B+树是B树的变体,相较B树更适合做文件系统的索引。

 

散列表:构造散列函数,处理冲突

构造散列函数:除留余数法。

处理冲突:开放地址法,链地址法(个人更喜欢链地址法,虽然存储效率低但是查找效率较高且易于实现)

 

实践:

实现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

网络上查到的一个思路参考:
 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 map<string,string> Map;
 5 map<string,string>::iterator it;
 6 
 7 int main()
 8 {
 9     int N;
10     string select, number, password;
11     cin >> N;
12     while( N-- ){
13         cin >> select;
14         if( select == "N" ){ 
15             cin >> number >> password;
16             if( Map.find(number) == Map.end() ){
17                 Map[number]=password;
18                 cout << "New: OK" << endl;
19             }
20             else
21                 cout << "ERROR: Exist" << endl;
22         }
23         else{
24             cin >> number >> password;
25             if( Map.find(number) != Map.end() ){
26                 if( Map[number] == password )
27                     cout << "Login: OK" << endl;
28                 else
29                     cout << "ERROR: Wrong PW" << endl;
30             }
31             else
32                 cout << "ERROR: Not Exist" << endl;
33         }
34     }
35     return 0; 
36 }
View Code

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <bits/stdc++.h>
 4 using namespace std;
 5  
 6 struct instruction{
 7     char ch;
 8     string acount,code;
 9 };
10  
11 int main(){
12     int n;
13     cin >> n;
14     instruction s[n];
15     map<string,string> qq;
16     for(int i=0;i<n;i++){
17         cin >> s[i].ch >> s[i].acount >> s[i].code;
18         switch(s[i].ch){
19             case 'N':
20                 if(qq.find(s[i].acount)==qq.end()){
21                     qq[s[i].acount] = s[i].code;
22                     cout << "New: OK" << endl;//申请成功,输出"New: OK"
23                 }
24                 else{
25                     cout << "ERROR: Exist" << endl;//申请号码已经在,输出"ERROR: Exist"
26                 }
27                 break;
28             case 'L':
29                 if(qq.find(s[i].acount)==qq.end()){
30                     cout << "ERROR: Not Exist" << endl;//老帐号QQ号码不存在,输出"ERROR: Not Exist"
31                 }
32                 else{
33                     if(qq[s[i].acount]==s[i].code){
34                         cout << "Login: OK" << endl;
35                     }
36                     else{
37                         cout << "ERROR: Wrong PW" << endl;
38                     }
39                 }
40                 break;
41             default: break;
42         }
43     }
44     return 0;
45 }
View Code

 

posted @ 2019-06-02 16:51  Marshall·Wayne  阅读(129)  评论(0编辑  收藏  举报