第七章学习小结
Posted 陆佑蓝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七章学习小结相关的知识,希望对你有一定的参考价值。
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; }
学习心得:马上要期末考试了,有一点慌张……
以上是关于第七章学习小结的主要内容,如果未能解决你的问题,请参考以下文章