数据结构第七章学习心得
本章我们学习了查找
查找表:由同一类型的数据元素或记录构成的集合在查找时对表做修改操作,如插入和删除,则称为动态查找表,否则称为静态查找表。
原理:由于从内存中提取数值经常要比复杂的计算速度快很多,所以这样得到的速度提升是很显著的。
查找分为两类
静态查找 动态查找
按照查找的顺序分类
顺序查找:简单,略
二分查找:在数据排列有序的情况下,二分查找可以将ASL和时间复杂度降低(相比于顺序查找) 因为早早学习过了二分法的数学知识,理论上不太有问题,实际操作时需要注意的点。
int Search_Bin(SSTable ST, KetType key) { int low = 0 ; int high = ST.length - 1 ; while(low <= high) { int mid = (low + high) / 2 ; if(key == ST.R[mid].key) return mid ; //找到待查元素 else if(key < ST.R[mid].key) high = mid - 1 ; //继续在前一子表进行查找 else low = mid + 1 ; //继续在后一子表进行查找 } return 0 ; //表中不存在待查元素 }
但是在做第七章实践一时使用这种方法出现超时现象,虽然直接用数组写就直接解决,但是还要稍微完善一下我的结构体代码。
分块查找:
存储节点时,建立一个带有若干索引项的索引表。
通过对索引表的信息和地址的访问,可以操作相关数据。
二:树相关的查找
二叉树表:二叉树表特点是该节点左子树的值小于该节点的值,右子树的值大于该节点的值。
AVL树:又名平衡树,将每个节点的左子树高与右子树高的差值取绝对值,所有节点的绝对值的值小于等于1。
该结构的树好处在于,当在非极端情况时(),时间复杂度可以达到o(log2n)
B-树和B+树
他们都不是二叉树
B-树:利用关键字进行二分查找
一个m阶的B树具有如下几个特征:
-
根结点至少有两个子女。
-
每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
-
每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
-
所有的叶子结点都位于同一层。
-
每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 B+树:
B+树:利用指针和二分法进行查找
一个m阶的B+树具有如下几个特征:
-
有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
-
所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
-
所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
散列表:也叫哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
具体方法:
直接定值法;数字分析法;平方取中法 折叠法;除留余数法;
处理散列冲突的方法:
开放定址法;线性探测法;二次探测法;随机探测法;再散列函数法;链地址法(封闭寻址法)等。