数据结构第七章学习心得

本章我们学习了查找

查找表:由同一类型的数据元素或记录构成的集合在查找时对表做修改操作,如插入和删除,则称为动态查找表,否则称为静态查找表。

原理:由于从内存中提取数值经常要比复杂的计算速度快很多,所以这样得到的速度提升是很显著的。

查找分为两类

静态查找  动态查找

按照查找的顺序分类

顺序查找:简单,略

二分查找:在数据排列有序的情况下,二分查找可以将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)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

具体方法:

 

直接定值法;数字分析法;平方取中法 折叠法;除留余数法;

 

处理散列冲突的方法:

开放定址法;线性探测法;二次探测法;随机探测法;再散列函数法;链地址法(封闭寻址法)等。



猜你喜欢

转载自www.cnblogs.com/pjc1435211553/p/13198122.html