博客作业05--查找

1.学习总结(2分)

1.1查找的思维导图

各种查找的时间复杂度,ASL成功,不成功。都要体现。

1.2 查找学习体会

线性表的查找:

顺序查找,折半查找(元素是有序的),分块查找

树表查找:

二叉搜索树,平衡二叉树,B-树,B+树

二叉搜索树的特点:
1.若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.任意节点的左、右子树也分别为二叉查找树。
4.中序遍历得到递增序列

平衡二叉树:
每个节点的左右子树的高度至多相差1,平衡因子是左子树的高度减去右子树的高度

B-:
1.所有的叶子节点在同一层,并且不带信息
2.每个节点至多有m棵子树,至多含有m-1个关键字
3.若根节点不是终端节点,则至少含有两棵子树
4.除根节点外,其他非叶子节点至少有m/2(取上整)棵子树,m/2(取上整)-1个关键字

B+:
1.每个分支节点至多有m棵子树
2.根节点或者没有子树,或者至少有两棵子树
3.除根节点外,其他每个分支节点至少有m/2(取上整)棵子树
4.有n棵子树的节点有n个关键字

哈希表查找:

哈希函数的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。

2.PTA实验作业(4分)

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

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

        定义一个静态局部变量min
        if T为空
        return true
        遍历T的左子树IsBST(T->Left)
        if T->Data大于min
        min=T->Data
        else 
        return false
        遍历T的右子树IsBST(T->Right)    

主要就是用中序遍历,看元素是不是从小到大排列

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

2.4 PTA提交列表说明。


部分正确:第一次else return false这句没有写
编译错误:函数bool IsBST ( BinTree T )在T前面多了个&,在devc上写题目因为用到其他题的函数树的名称不一样,就用到了&,提交的时候忘记删去&

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

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

        定义Tree类型变量p
        定义整型变量flag1和flag2
        p=T
        while p
            查找u是否在这棵树上,如果在这棵树上flag1=1
        p=T
        while p
            查找v是否在这棵树上,如果在这棵树上flag2=1
        if T为空
        return ERROR
        while T不为空
            if u或v不在这棵树上
                return ERROR
            if u和T->key相等或v和T->key相等
                return T->key
            if u、v分别在T的两边
                return T->key
            if u、v的值都大于T->key
               在右子树里寻找
            if u、v的值都小于T->key
               在左子树里寻找

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)


2.4 PTA提交列表说明。


这题是参考了网上的代码写的。自己思考的时候,考虑到也许要用到栈或者队列,但是解题思路一片空白,不知道该如何下手,后面就参考了网上的写法

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

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

        定义整型变量N、K、M、miles、i、temp
        定义字符数组num[19]
        map<string,int> user
        map<string,int>::iterator iter
        输入N、K的值
        for i=0 to i小于N
            输入num和miles的值
            if miles小于K
                 查找这个用户是否已经存在
                 if 该用户已经存在
                    飞行里程+K
                否则插入该用户的信息
           否则
                 查找这个用户是否已经存在
                 if 该用户已经存在
                    飞行里程+miles
                否则插入该用户的信息
        输入M的值
        for i=0 to i小于M
            输入num的值
            查找这个用户是否存在
                if 存在
                     输出飞行里程
                否则
                     输出No Info

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)


2.4 PTA提交列表说明。


部分正确:第一次是后面两个测试点运行超时,好像用cin和cout不行,要用scanf和printf
第二次后面的两个测试点变成了答案错误,改了字符数组的长度还是错,后面才发现在里程数大于K的时候,没有再去找一下是否已经存在过,改了之后就通过了

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

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

3.2 我的总分:

145
得分2.5

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

HashMap中红黑树的查找函数find()实现

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

5. 代码Git提交记录截图

posted @ 2018-05-26 22:16  hoppp  阅读(234)  评论(1编辑  收藏  举报