博客作业05--查找

1.学习总结

1.1查找的思维导图

1.2 查找学习体会

  • 1、map简介
    map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
    对于迭代器来说,可以修改实值,而不能修改key。
  • 2、map的功能
    自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
  • 3、查找方式及使用
    目前知道的有map.find(关键字) 和 map.count(关键字)两种,使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。使用find,返回的是被查找元素的位置,没有则返回map.end()。

2.PTA实验作业(4分)

2.1 题目1:7-1 QQ帐户的申请与登陆

2.2 设计思路(伪代码或流程图)

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
定义map<string,string>a;
int n,i;
char k[2],QQnum[12],password[25];//新老用户选择,QQ号,QQ密码
输入行数n
for i=0 to n
	输入选择k
	如果是老用户
		输入QQnum,password
		if(a[QQnum].empty()){//不存在 
			输出"ERROR: Not Exist\n"
			}
		else{
			如果密码正确,输出"Login: OK\n"
		        否则 输出"ERROR: Wrong PW\n"
			}
        end if
	如果是新用户 
		输入QQnum,password
		if(a[QQnum].empty()){//不存在 
			a[QQnum]=password;//创建账号
			输出"New: OK\n"
		}
		else{//存在 
			输出"ERROR: Exist\n"//账号已存在
		}
	end if

2.3 代码截图

2.4 PTA提交列表说明。

这题主要是原来代码L和N的判断用的是字符c类型输入判断的,但是输出结果一直不对,看网上代码用的字符串数组来判断,修改后就可以了。

2.1 题目2:6-3 二叉搜索树中的最近公共祖先

2.2 设计思路(伪代码或流程图)

int LCA( Tree T, int u, int v ){//找最近公共祖先
	如果调用Find函数发现是空树或者找不到 
            返回ERROR
	if(v == T->Key || u == T->Key)    
             return T->Key;
	if v节点和u节点分别在T->Key两侧 
            return T->Key;
	return   (v<T->Key?(LCA(T->Left,u,v)):(LCA(T->Right,u,v)));
}
int Find(Tree BST, int X) {//在树种寻找X节点
	if (!BST) return 0;
	if 在树中找到该节点 返回1
	if (X > BST->Key) {
		return Find(BST->Right, X);//从该节点的右孩子继续查找
	}
	else if (X < BST->Key) return Find(BST->Left, X);//从做孩子就继续查找
}

2.3 代码截图

2.4 PTA提交列表说明。


部分正确:一开始没有考虑到v == T->Key || u == T->Key时的情况,导致部分测试点过不了,增加条件即可。

2.1题目3:7-2 航空公司VIP客户查询

2.2 设计思路(伪代码或流程图)

int main(){
	int n,k,i;//n为查询人数k为最低里程
	输入n,k
	char idcard[20];//定义身份证号
	long long flyway;//定义里程
	map<string,long long>Map;
	for i=0 to n {
		输入身份证号
		输入里程数
		如果该用户里程数<最低里程数 flyway=k;
		if(!Map.count(idcard)) Map[idcard] = 0;//不是会员
		Map[idcard]+=flyway;//累加里程数
	}
	输入要查询的人数n
	for i=0 to n {
		输入身份证号
		if(!Map.count(idcard))    输出"No Info\n"//不是会员 
		else 输出该会员里程数
	} 
} 

2.3 代码截图

2.4 PTA提交列表说明。


这题参考网上的代码自己慢慢理解map怎么用的,部分正确出现的问题主要是超时,把所有cin改成scanf,再把数组的大小改一下,就通过了,试着试着通过的一道题。

3.截图本周题目集的PTA最后排名

本次题目集总分:175分
必做题共:145分

3.1 PTA排名(截图带自己名字的排名)

(32林艺薇)

3.2 我的总分:145

4. 阅读代码(必做,1分)

  • HashMap中红黑树的查找函数find()实现
/** 
         * 调用树的find()函数 
         */  
        final TreeNode<K,V> getTreeNode(int h, Object k) {  
            return ((parent != null) ? root() : this).find(h, k, null);  
        }  
[java] view plain copy


 
/** 
         * 从根节点p开始查找指定hash值和关键字key的结点 
         * 当第一次使用比较器比较关键字时,参数kc储存了关键字key的 比较器类别 
         */  
        final TreeNode<K,V> find(int h, Object k, Class<?> kc) {  
            TreeNode<K,V> p = this;  
            do {  
                int ph, dir; K pk;  
                TreeNode<K,V> pl = p.left, pr = p.right, q;  
                if ((ph = p.hash) > h)           //如果给定哈希值小于当前节点的哈希值,进入左节点  
                    p = pl;  
                else if (ph < h)             //如果大于,进入右结点  
                    p = pr;  
                else if ((pk = p.key) == k || (k != null && k.equals(pk)))  //如果哈希值相等,且关键字相等,则返回当前节点  
                    return p;  
                else if (pl == null)        //如果左节点为空,则进入右结点  
                    p = pr;  
                else if (pr == null)        //如果右结点为空,则进入左节点  
                    p = pl;  
                else if ((kc != null ||  
                          (kc = comparableClassFor(k)) != null) &&  
                         (dir = compareComparables(kc, k, pk)) != 0)        //如果不按哈希值排序,而是按照比较器排序,则通过比较器返回值决定进入左右结点  
                    p = (dir < 0) ? pl : pr;  
                else if ((q = pr.find(h, k, kc)) != null)       //如果在右结点中找到该关键字,直接返回  
                    return q;  
                else  
                    p = pl;                             //进入左节点  
            } while (p != null);  
            return null;  
        } 

链接:https://blog.csdn.net/ymrfzr/article/details/51243766
函数注释很详细,find()函数里有对多种情况进行讨论,直接调用map.h后续功能的实现就很方便,像查找,如果用树来实现,建树,再遍历查找,代码量很大,但是调用Map的话,利用find(),代码精简了很多,我们只要知道原理就可以了。find()函数原理:如果找到会返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

5. 代码Git提交记录截图

posted @ 2018-05-26 22:43  evfun  阅读(210)  评论(1编辑  收藏  举报