数据结构:第七章学习小结
第7章 查找
一、内容小结
(1)基本概念:
①查找表:是由同一类型的数据元素(或记录)构成的集合 (eg.线性表、树表、散列表);
②关键字:是数据元素(或记录)中某个数据项的值--》作为一种"标识";
③查找:根据给定的值,在查找表中确定一个其关键字等于给定值得记录或数据元素;
查找成功即返回该关键字信息,失败则可返回"空"指针或"空"记录。
④动态查找表和静态查找表:*前者*:查找的同时对表做修改操作(如插入和删除),反之为后者。
⑤平均查找长度(ASL):确定给定关键字在表中的位置,需和给定值进行比较的关键字个数的期待值:
(2)关于散列表:
①散列函数的常用构造方法
1、好的散列函数:计算简单,散列地址分布均匀;
2、数字分析法:对数字进行一定左移、右移或旋转
3、平方取中法:平方,取平方数中间三位数
4、折叠法:将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些),然后将这几部分叠加求和,并按散列表表长,取后几位作 为散列地址;
5、除留余数法:f(key)=key mod p
②散列表中处理冲突的方法:
1、开放地址法:发生冲突时,采用合适方法计算得到另一存记录的地址。若还出现冲突,则继续寻找,以此类推得到最终地址。
2、链地址法:把具有相同散列表散列地址的记录放在同一个单链表中,称为同义词链表。(根据散列地址再进行插入关键字)
二、作业/实践中学习心得
1.关于二分查找的SPOC讨论:while(low<=high)的条件改为while(low<high)会出现如何的结果?
p.s.我选了课堂上老师的例子将大概分析过程都列了出来,感觉自己对二分查找中的low和high的分析掌握了些~
*后面看到同学的更简单明了的方法:利用只有一个元素的查找表来比较给定值,此时进入查找的条件就是low==high,所以可以更好地了解while中的条件为什么需要的是low<=high了~
2.PTA的个人小测(关于哈希表的一些应用--处理冲突):
设有一组关键字:(10,16,32,17,31,30,20),哈希函数为:H(key) =key MOD 11,表长为12,线性探测法处理冲突。试回答下列问题: 1、画出哈希表的示意图;2、若查找关键字20,需要依次与哪些关键字进行比较? 3、若查找关键字27,需要依次与哪些关键字比较? 4、假定每个关键字的查找概率相等,求查找成功时的平均查找长度。 5、求装填因子。
*在上课时通过老师的过程演示,自己也慢慢学到了如何填哈希表,按照给定的关键字序列按顺序满足哈希函数的条件填入哈希表,出现冲突(余数相同)需要往后找空格填。查找对应关键字时,例如查找关键字20,首先要与H(20) = 20 % 11 = 9号单元内容比较,即20 vs 31,不正确。则还要依次顺移,与10,32,20相比,一共比较4次。即要包括到查找到对应关键字的次数。
出现问题?=》给定需要查找的关键字不存在在查找表中时,需要比较几次呢?(网上查找到两种情况):
①在关键字取余后与对应单元格内容比较时,若对应单元格为空。则只需比较这一次。
②若第一次查找的对应单元格不为空,则依次顺移比较,比较次数约为关键字序列的长度。
*装填因子即为:关键字个数/散列表表长*
三、目标完成情况
上一周的目标为课前预习课后实践,关于第7章查找的内容,感觉自己有在这一周中发现了以前在查找算法上的一些理解不足,并在各样的实践中慢慢培养了自己尝试思考分析过程,可能中途也遇到了一些难题是有点卡住的,最后还是通过与同学的讨论或者网上博客的学习得到了一些答案,感觉自己在本章的学习的吃力程度也在慢慢减少,反而兴趣有在增加,这一点是让自己挺欣慰的。
下周目标:马上要进入第8章以及期末,希望自己在空闲时间内不仅可以复习巩固一下前面几章的关键内容,也要做好预习准备。在作业和实践中也尽量继续保持求知好问(可以通过博客学习)的心态坚持下去!