博客作业05--查找

1.学习总结

1.1查找的思维导图

1.2 查找学习体会

map的基本操作函数:

  C++ Maps是一种关联式容器,包含“关键字/值”对

 begin()         返回指向map头部的迭代器

 clear()        删除所有元素

 count()         返回指定元素出现的次数

 empty()         如果map为空则返回true

 end()           返回指向map末尾的迭代器

  equal_range()   返回特殊条目的迭代器对

  erase()         删除一个元素

 find()          查找一个元素

 get_allocator() 返回map的配置器

 insert()        插入元素

 key_comp()      返回比较元素key的函数

 lower_bound()   返回键值>=给定元素的第一个位置

  max_size()      返回可以容纳的最大元素个数

 rbegin()        返回一个指向map尾部的逆向迭代器

 rend()          返回一个指向map头部的逆向迭代器

 size()          返回map中元素的个数

 swap()           交换两个map

 upper_bound()    返回键值>给定元素的第一个位置

 value_comp()     返回比较元素value的函数

c++ map容器应用实例

#include <map>  
#include <string>   
#include <iostream>   
using namespace std;  
  
void map_insert(map < string, string > *mapStudent, string index, string x)  
{   
mapStudent->insert(map < string, string >::value_type(index, x));  
}  
  
int main(int argc, char **argv)   
{   
char tmp[32] = "";   
map < string, string > mapS;  
  
//insert element   
map_insert(&mapS, "192.168.0.128", "xiong");  
map_insert(&mapS, "192.168.200.3", "feng");  
map_insert(&mapS, "192.168.200.33", "xiongfeng");  
  
map < string, string >::iterator iter;  
  
cout << "We Have Third Element:" << endl;   
cout << "-----------------------------" << endl;  
  
//find element   
iter = mapS.find("192.168.0.33");   
if (iter != mapS.end()) {   
cout << "find the elememt" << endl;   
cout << "It is:" << iter->second << endl;   
} else {   
cout << "not find the element" << endl;   
}  
  
//see element   
for (iter = mapS.begin(); iter != mapS.end(); iter ) {  
  
cout << "| " << iter->first << " | " << iter->   
second << " |" << endl;  
  
}   
cout << "-----------------------------" << endl;  
  
map_insert(&mapS, "192.168.30.23", "xf");  
  
cout << "After We Insert One Element:" << endl;   
cout << "-----------------------------" << endl;   
for (iter = mapS.begin(); iter != mapS.end(); iter ) {  
  
cout << "| " << iter->first << " | " << iter->   
second << " |" << endl;   
}  
  
cout << "-----------------------------" << endl;  
  
//delete element   
iter = mapS.find("192.168.200.33");   
if (iter != mapS.end()) {   
cout << "find the element:" << iter->first << endl;   
cout << "delete element:" << iter->first << endl;   
cout << "=================================" << endl;   
mapS.erase(iter);   
} else {   
cout << "not find the element" << endl;   
}   
for (iter = mapS.begin(); iter != mapS.end(); iter ) {  
  
cout << "| " << iter->first << " | " << iter->   
second << " |" << endl;  
  
}   
cout << "=================================" << endl;  
  
return 0;   
}   

2.PTA实验作业

2.1 题目1:6-2 是否二叉搜索树

2.2 设计思路

bool IsBST ( BinTree T )
{
    定义静态整型变量min=-32678作为判断的最小值
    如果树空 返回null
    递归调用函数IsBST (T->Left)
    if(T->DATA大于min)
    则min=T->DATA
    else返回false
    递归调用函数IsBST并指向该树的右子树
}

2.3 代码截图

2.4 PTA提交列表说明

前两次错误是因为用递归调用遍历左子树之后忘记遍历右子树造成的,通过与室友讨论解决

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

2.2 设计思路

int LCA( Tree T,  int u, int v )
{
    if(树空)  返回ERROR
    if(u或v不在树中)  返回ERROR //由find函数解决 细节不表。
    if(当前T->key结点等于u或等于v)  返回当前节点
    if(u在当前节点的右子树且v在当前节点左子树 或 u在当前节点左子树或v在当前节点右子树 即u、v分别在当前节点左右子树) 返回当前节点
    if(u在当前节点右子树)  递归调用 LCA(T->Right,u,v)并返回最终值
    if(u在当前节点左子树)  递归调用LCA(T->Left,u,v)并返回最终值
}

2.3 代码截图

2.4 PTA提交列表说明

第一次提交是由于find函数中判断返回值出错导致的答案部分正确,第二次提交索性没有判断u或v不在树中的情况,结果只有两个测试点没过,第三次仔细修改后发现find函数中返回值0和1恰好相反了,通过修改代码解决。

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

2.2 设计思路

int main()  
{
    定义一个整型变量N用来储存测试次数  输入N
    创建一个map容器  map<long int, string>mapQQ;
    定义字符变量 choose
    定义long int型变量qq_number来储存qq号 string型变量qq_password储存测试需要的密码
    map<long int, string>::iterator iter;   //前向迭代器 
    for (int i = 0; i < N; i++)
    {
         输入choose、qq_number和qq_password
         对qq_number进行查找
         if(choose==N){
             if(容器中已有此qq账号)  返回ERROR: Exist
         else
             创建这个号码并储存于map容器中
             返回New: OK
         if(choose==L)
             if(容器中已有此qq账号)  
                 判断qq号与密码是否匹配 如果匹配输出"Login: OK 如果不匹配输出ERROR: Wrong PW
             如果容器中没有此qq号 输出"ERROR: Not Exist
      return 0;
}

2.3 代码截图


2.4 PTA提交列表说明

因为本题运用到map容器,所以修改次数较多,而且掌握不是特别熟练 ,系统多试几次就会崩溃,后经百度和问室友解决,也使我了解到了map这个容器。

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

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

3.2 我的总分

130

4. 阅读代码

//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;  
        }  

本次阅读代码根据题目要求去找了红黑树的查找函数find()函数的具体实现,其实是找了段自己也似懂非懂的代码,其实大致能够看懂,但是要深究的话可能会话更多时间,贴出来也方便自己以后借鉴或者学习吧。

posted @ 2018-05-26 21:30  爻象  阅读(137)  评论(0编辑  收藏  举报