1.本周学习总结
1.思维导图
2.谈谈你对查找运算的认识及学习体会。
①.学习了许多查找的方法,比如:线性表中的顺序查找、折半查找、分块查找。顺序我们之前也接触过,而折半查找较为顺序查找的一种改进,这种改进使效率快了许多。
②.树表类的查找:二叉排序树、平衡二叉树、还有B_/+树。其中难操作的是平衡二叉树的失衡调整,LL和RR好做,比较容易出错的是LR型和RL型,不容易分清,不过理解之后还勉勉强强吧。
③.哈希的查找:之前老师提过哈希数组,现在具体来学。哈希是一种空间换时间的算法,哈希冲突寻找KEY,在计算不成功ASL时会把分母记为表的长度。哈希可以把查找效率达到O(N)。
④.总的来说这章的内容细节多,还容易记混,虽然这章对代码没有要求,不过涉及前面所学的一些知识内容,而之前学的时间长了没有及时复习都记忆都模糊了。
2.PTA实验作业
2.1题目1:二叉搜索树的操作集
2.1.1设计思路
Insert 函数:
if是否是一个空结点
如果不是空则生成一个空结点
{
BST->Data=x;
BST->Left=NULL;
BST->Right=NULL;}
else
{
if(插入值小于结点的值就向插
否则向右插;}
如果已经存在什么都可不做;
return BST;
Find 函数:
while{
遍历结点,如果小于结点就找左子树否则找右子树,相等即为找到}
}
end while 找不到返回NULL
FindMin函数:
利用递归思想一直寻找到左子树,如果左子树为空即为到}
return BST;
else
return FindMin(BST->Left
FinMax函数:
与FindMin函数一样,利用递归思想一直找右子树。
Delete函数:
定义一个 position temp;
if(树为空即没有)
else
{
类似于查找插入,要删除节点小于左子树结点往左找,否则往右找,找到当前结点就做删除操作
}
else
{
如果删除结点有两个孩子的情况:找最小,填充删除结点,原来删除的那个数据拿来给填的那个节点;
如果删除结点只有一个孩子的情况:结点的话直接赋值
如果删除结点没有孩子:直接删除
}
2.1.2代码截图
2.1.3本题PTA提交列表说明
- Q:部分正确,说明整体的代码是没有错的,查看代码发现删除只有一个结点时,删除完之后应该是空树,同时是空树的情况也就是没有节点的应该是错误的。
- A:判断只有一个结点的情况,删除操作结束后应该是空树,也就是最终树。
2.2 题目2:QQ帐户的申请与登陆
2.2.1设计思路
main函数:定义 N//个数
!!!getchar();//挡掉回车操作
for(i to N )
{
依次录入题目信息
if(命令符是L则调用登录函数)
否则调用新申请一个函数
!!!getchar();注意要挡掉回车
}
GetNextPrim函数:找最小素数
就是一个遍历查找过程,emmmm.....判断是不是最小的素数即可,
Hash函数:就是一个求余,把它单独写出来而已
HashTable CreateTable:函数:emmmm....与之前的建立没有不同什么可以说的,注意的是H->heads也要申请动态空间。
Insert函数:在找到位置后,依次比较信息是否正确,if(所找不为空) printf("exit!")
else
{ 不为空
头插法插入
printf("OK"); //说明申请成功
}
Login函数:
{
while(user)
{
if(user->ID ==ID )//不符合则遍历下一条
user - > next;
如果符合则比较用户名与密码是否正确
是则返回:OK
否则返回:ERROR
}
end while
if(user==NULL) //说明用户名不存在
2.2.2代码截图
- 同学的代码:
2.2.3本题PTA提交列表说明
- 编译错误:不了解H->heads[i].user也是要malloc一下,自己写出来一塌糊涂就百度了。
- 看同学的博客看到map来做,代码简洁不少,利用map容器的一一对应的处理数据的能力,在匹配时也要快一些
2.3 题目:航空公司VIP客户查询
2.3.1设计思路
定义map<long,long,long>table;//保证数值可以大一些
定义常量n,k
输入n,k
while(n--)
输入客户身份证号码id/校验码c以及里程的长度len
if(c=='x') 下一个id
if (长度小于k) 也按k算
if(!table.count(id)//如果用户不存在重复 table[id]=0
否则进行累加
end while
输入n
for int i=0 to M do
输入查询的身份证号码
if(c=='x') 下一个id
if(用户存在直接输出)printf("table[id]");
否则输出NO INFo
2.3.2代码截图
2.3.3提交列表及其说明
- Q1:map定义的为<string,string,int>
- A1:应该改为map<long,long,long>来保证数值足够大
- Q2:用cin来读取数据
- A2:改为scanf来输入数据,把提交类型改为c而不是c++
3、阅读代码
3.1 题目:爱吃香蕉的珂珂
3.2 解题思路
如果珂珂能以K的进食速度吃完所有香蕉在H小时内,那么她也可以用更快的速度的吃完,当珂珂能以K的速度吃完香蕉是,我们就令possible(K)为TRUE,那么存在X使得当K>=X,possible(K)=TRUE
3.3 代码截图
-
c++:
-
java:
-
python:
3.4 学习体会
这道题是用二分法解决,时间复杂度O(NlogW),N为香蕉数量,W为最大香蕉的大小;空间复杂度为O(1)。用二分法来找到possible(K )的值来找第一个的使possible(X)为TRUE的X,在循环中,不变的possible(hi)True,lo总<=答案,最后我们猜测珂珂将会在Math.ceil(p/K)=((p-1)/K)+1小时内吃完这一推香蕉,将没一堆的时间总和与H进行比较。二分法在这道题中和我们平时学习的没有什么不同,同样是分为两部分,选取中间值,这道题的不好思考如果不是看题解的话要自己做不太能想到是这样子解法。