二、实例
1、无序和有序情况下,ASL的不同
2、分块查找中,索引表示如何建立的
3、判断二叉树是否是AVL树
如果不是AVL树,要分情况进行调整: LL, RR, LR, RL
4、用线性探测再散列处理和二次探测再散列冲突,并求ASL
ASL = (1*4 + 2*2 + 3 + 6 + 5)/ 9
心得体会:
发现代码的实现能力和对知识的掌握,在一定程度上,是不成正比的。薄弱的基础导致了在完成编程作业时很吃力,在不断地提交的过程中,不断修改,从中分析自己的代码,又或是通过查询,学习他人的方法,虽然最后还是没能够满分提交,但是在这个过程中,也能学到已经没有掌握的知识。挫败感虽有,但是更有前进的动力。
在不断的深入学习这种,难度在不断提高,对知识的掌握能力也有着很高的要求。我觉得在这过程中,对于我来说,最好的方法就是跟着不断思考,动手去完成课堂或课后的题目,不要得过且过。
(担心思维导图看不清,以下是文字版)
1 线性表的查找 2 顺序查找 3 方法:把待查关键字key存入表头(作哨兵),从后向前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度 4 只用比较N次 5 有序和无序的ASL不同,无序中每个元素查找概率不同。 6 N很大时,不适宜 7 折半查找(二分查找) 8 设表长为n, low, high,mid分别指向待查元素所在区间的上界、下界和中点,K为给定值;判断所要查找的元素是否与mid所在关键字相等。 9 性能分析:每次查找时间都缩小一半,时间复杂度O(log2N) 10 局限: 11 基于顺序表存储,且一定要有序 12 适合一次排序,多次查找。因此针对静态数组 13 数据量太小,不需要二分 14 数据量太大,不能用。因为二分数据需要数组来存储,而数组的内存空间必须是连续的,找不到存储如此大规模数据的连续内存空间 15 分块查找 16 即分成若干子表,要求每个子表中的数值都比一块中数值小(但子表内未必有序)。然后将各子表中的最大关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针) 17 块间有序,块内无序 18 适用情况:线性表既要快速查找又经常动态变化,则可采用分块查找 19 优点:易于插入和删除,无需进行大量移动 20 缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算 21 22 树表查找 23 二叉排序树 24 可以看作是一个有序表 25 适合深度小 26 平衡二叉树 27 所有结点的左、右子shu深度之差的绝对值<=1 28 平衡因子:左右子树高度差 29 要不断调整平衡,调整最小不平衡子树 30 31 散列表的查找 32 直接算出位置,与数据量无关 33 记录在数组中的存储位置P与其关键字key之间存在对应关系:H(key) = P 34 H函数称为哈希函数 35 优点:查找速度极快O(1),与元素个数无关 36 相关术语 37 散列函数:转换函数,将关键字转换为位置(下标) 38 散列表 39 冲突:不同的关键字映射到同一个散列地址 40 冲突解决:开放地址法 41 线性探测再散列 42 二次(平方)探测再散列 43 随机探测再散列 44 链地址法:将相同散列地址的链成一个单链表,适合表长不定 45 同义词:H函数相等的关键字 46 除留余数法:所选P要小于表长的最大质数 47 48 基本概念 49 查找表: 50 同一类型的数据元素构成的集合 51 关键字: 52 数据元素中某个数据项的值 53 只存储关键字的意义其实并不大,还要记录地址/在表中的序号 54 查找 55 动态查找 56 查找的同时,需要对表进行修改操作(如插入/删除) 57 静态查找 58 平均查找长度(ASL) 59 取决于 60 散列函数 61 处理冲突的方法 62 散列表的填装因子 = M / S( M = 元素个数,S = 数组的长度)