博客作业05-查找
1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
谈谈你对查找算法学习体会。也可以谈谈STL容器中查找如何用的。
查找在方法上可分为一下几种类型
1. 顺序查找
2. 二分查找
3. 插值查找
4. 斐波那契查找
5. 树表查找
6. 分块查找
7. 哈希查找
针对不同的类型,并没有好与不好之分,有些方法只适用于特定环境,有些方法比较简单,但浪费时间,有些方法思路十分复杂,但节约时间,但是还是得用空间去抵,所以学会查找不仅仅是要去学各种查找方法的原理以及代码实现,更重要的是能够针对不同的环境和情形下选择正确的查找方式,同时C++的库函数里面也有许多自带函数,熟练运用可以事半功倍。
map工作原理:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了, 底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响.
2.PTA实验作业(4分)
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
设计思路:利用中序遍历,如果是递增则成功,否则失败
bool IsBST(BinTree T) {
int num[999],t=1;
利用非递归方法进行中序遍历{
将中序遍历得到的结果储存在数组num中;
}
for (int i = 1; num[i] != 0; i++)
{
如果发现后面数比前面小,即不是递增数列,t = 0;
}
return t;
}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
2.1 题目2:QQ帐户的申请与登陆
2.2 设计思路(伪代码或流程图)
设计思路:如果QQ号申请正确就插入,失败则提示,登陆时存在此QQ则成功,否则失败,也可用红黑树做
BinTree BST = NULL;int n, i = 0;char K[100001];User QQ[100001];
输入 n;
for (i = 0; i < n; i++) {
输入QQ账号,密码;
}
int t = 0;
for (i = 0; i < n; i++) {
if (K[i] != 'N') t += 1;
}
if (t == 0) {
for (i = 0; i < n; i++) {
if((QQ号符合规定)
cout << "New: OK" << endl;
else cout << "ERROR: Exist"<<endl;
}
return 0;
}
for (i = 0; i < n; i++) {
if (K[i] == 'N') {
if (QQ号或者密码不符合要求) {
cout << "ERROR: Exist" << endl;
continue;
}
else {
插入QQ[i]
cout << "New: OK" << endl;
continue;
}
}
else if (K[i] == 'L') {
if (找不到QQ[i]) {
cout << "ERROR: Not Exist" << endl;
continue;
}
else
{
if (找到) {
cout << "Login: OK" << endl;
continue;
}
else {
cout << "ERROR: Wrong PW" << endl;
continue;
}}}}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
部分正确:这道题由于时间复杂度比较紧张,所有全删除,且最大值这个点一直过不了,于是多加了一个if让他顺利通过
2.1 题目3: 航空公司VIP客户查询
2.2 设计思路(伪代码或流程图)
设计思路:利用红黑树,如果飞行距离不足500则补到500,然后插入,然后在里面找,如果找到输出飞行距离,找不到就NO info吧
int N, K, i;char idcard[19];long long flyway;
scanf("%d %d",&N,&K);
map<string, long long>Map;
for (i = 0; i < N; i++)
{
输入ID和飞行距离;
飞行距离不足500则自动增加到500;
if (找不到Map[idcard])) {
初始化Map[idcard] = 0;
}
Map[idcard] += flyway;
}
scanf("%d",&N);
for (i = 0; i < N; i++) {
scanf("%s",idcard);
if (找不到)
{
printf("No Info\n");
}
else
输出飞行总和距离;
}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
部分正确:利用C++的语法会导致时间不足支撑,讲C++的cin和cout全部改成scanf和printf就成功通过了
3.截图本周题目集的PTA最后排名(3分)
本次题目集总分:175分
必做题共:145分
3.1 PTA排名(截图带自己名字的排名)
3.2 我的总分:163
本题评分规则:
(1)2个题目集PTA总分145--175分:3分(全部题目都做)
(2)PTA总分在120分--145分:2.5分(必做题全部做完,选做题做部分)
(3)PTA总分在105--120分:2分(必做题大部分做完)
(4)PTA总分在80--105分:1.5分
(5)PTA总分在45分-80分:1分
(6)PTA总分在45分以下:0分
4. 阅读代码(必做,1分)
using namespace std;
int main(int argc, char const *argv[]) {
int n, m, a, b;
char s[2000], tmp[2000];
set<string> st[101];
scanf("%d%*c", &n);
for(int i=1; i<=n; ++i) {
while(gets(s)) {
if(!strcmp(s, "#")) break;
int last = 0;
for(int j=0; s[j]; ++j) {
if(s[j]>='A' && s[j]<='Z') s[j] += 32;
// 分割单词,符合要求的存进 set
if(s[j]<'a' || s[j]>'z') {
s[j] = 0;
strcpy(tmp, s+last);
last = j+1;
tmp[10] = 0;
if(strlen(tmp) >= 3) st[i].insert(tmp);
}
}
strcpy(tmp, s+last);
tmp[10] = 0;
if(strlen(tmp) >= 3) st[i].insert(tmp);
}
}
scanf("%d", &m);
while(m--) {
scanf("%d %d", &a, &b);
int cnt = 0;
set<string>::iterator it;
// !important: 遍历 size 较小的 set
if(st[a].size() > st[b].size()) swap(a, b);
for(it=st[a].begin(); it!=st[a].end(); ++it) {
if(st[b].count(*it)) cnt++;
}
printf("%.1f%%\n", 100.0*cnt/(st[a].size()+st[b].size()-cnt));
}
return 0;
}
代码点评:这是本次pta最后一题的网络代码,解题思路是每个文件内的单词存放到单独的一个 set 中。询问时直接遍历其中一个 set(必须是 size 较小的那个,否则会超时在最后一个测试点),用 count() 查找另一个 set 中存不存在这个单词即可。
- 代码Git提交记录截图
在码云的项目中,依次选择统计-Commits历史-设置时间段,进行搜索并截图,如下图所示,需要出现学号、项目提交说明。请在码云中将你的昵称改为“学号-姓名”。