数据结构学习小记-查找
查找
- 
查找算法是指:从一些数据之中,找到一个特殊的数据的实现方法。查找算法与遍历有极高的相似性,唯一的不同就是查找算法可能并不一定会将每一个数据都进行访问,有些查找算法如二分查找等,并不需要完全访问所有的数据。查找算法适用于很多场景,最典型的应用场景就是已知次品商品的特征,如何从一堆商品当中查找出这些次品。 
- 
顺序查找算法:是最简单的查找算法,意思为:线性的从一个端点开始,将所有的数据一次访问,并求得所需要查找到的数据的位置,此时线性查找可以称呼为遍历。 
二分查找
- 
它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,注意必须要是有序排列,但有一种特殊情况可以不必须有序排列,即前一节介绍的商品选取,从一堆标准重量为10的商品中查找出唯一的次品,这种特殊的数据情况也可以使用二分查找。 
- 
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。 
分块查找算法
- 
分块查找是折半查找和顺序查找的一种改进方法;分块查找由于只要求索引表是有序的,对块内结点没有排序要求,因此适合节点动态变化的情况,其核心有:一是索引表,二是分块处理; 
- 
分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序。假设是按关键码值非递减的,那么这种块与块之间必须满足已排序要求,实际上就是对于任意的i,第i块中的所有节点的关键码值都必须小于第i+1块中的所有节点的关键码值。此外,还要建立一个索引表,把每块中的最大关键码值作为索引表的关键码值,按块的顺序存放到一个辅助数组中,显然这个辅助数组是按关键码值非递减排序的。查找时,首先在索引表中进行查找,确定要找的节点所在的块。由于索引表是排序的,因此,对索引表的查找可以采用顺序查找或折半查找;然后,在相应的块中采用顺序查找,即可找到对应的节点。简而言之,按照每一块中的最大关键码值以递增方式对块进行排序。先用顺序查找或者折半查找对节点所在块进行查找,然后在相应的块中进行顺序查找,即找到对应的节点。 
动态查找-二叉排序树
- 
二叉排序树又称二叉查找树,二叉搜索树;该树属于一种输入数据就默认产生一种顺序的数据结构;这不像本章前面的内容所描述的静态的在某一个数据段内进行查找,动态查找是一种输入时就会自动对其进行排序的数据结构,前文学过的STL中的set集合其底层就是一个类似的树形结构红黑树。 
- 
二叉排序树有以下性质: - 若左子树不空,则左子树上所有的节点的值均小于或等于它的根节点的值;
- 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
- 左右子树也分别为二叉排序树;即对于每一个根节点,其左孩子永远小于根,右孩子永远大于根;
 
- 
查找:考虑如果树是空的,则查找结束,无匹配,如果被查找的值和根节点的值相等,查找成功;否则就在子树中继续查找;如果被查找的值小于根节点的值,就选择左子树,大于根节点的值就选择右子树; 
- 
二叉排序的插入时建立在二叉排序的查找之上的,插入一个节点,就是通过查找发现该节点合适插入位置,把节点直接放进去; 
- 
二叉树的删除不再像二叉树的插入那么容易了,因为删除某个节点以后,会影响到树的其它部分的结构。删除的时候需要考虑以下几种情况:删除节点为叶子节点;删除的节点只有左子树;删除的节点只有右子树;删除的节点既有左子树又有右子树; 
平衡二叉树
- 
平衡二叉树balanced binary tree,具有以下性质:它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 其中最为经典当属AVL树,我们,简而言之,平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多为1。 
- 
性质:AVL树具有下列性质的二叉树(空树也属于一种平衡二叉树): a)必须是一颗二叉查找树;b)它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1;c)若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能为-1,0,1;d)只要二叉树上有一个节点的平衡因子的绝对值大于1,那么这颗平衡二叉树就失去了平衡; 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号