博客作业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