找工作——数据结构

静态查找表:只做查找操作的查找表

动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。

如果查找的数据集是有序线性表,并且是顺序存储的,查找可以使用折半、插值、斐波那契等查找算法,因为有序,在插入和删除操作上,就需要耗费大量的时间。

二叉排序树

  定义:

  又称为二叉查找树,它或者是一颗空树或者是具有下列性质的二叉树。

  • 若它的左子树不为空,则左子树上所有结点的值均小于它的根节点的值;
  • 若它的右子树部位空,则右子树上所有结点的值均大于它的根节点的值;
  • 它的左右子树也分别为二叉排序树。

  构建过程

  删除操作:

    如果是叶节点直接删除;

    如果要删除的只有左子树或右子树,那就将该结点删除后,将它的左子树或右子树整个移动到删除的结点的位置即可;

    如果要删除的是左右子树都有的结点,找到需要删除的结点p的中序遍历的直接前驱(或直接后继),用s来替换结点p,然后再删除此结点s。

  总结:对于二叉排序树的查找,走的就是从根结点到要查找的结点的路径,其比较次数等于给定值的结点在二叉排序树的层数,因此二叉排序树的查找性能取决于二叉排序树的形状。我们希望,二叉排序树是比较平衡的,即其深度与完全二叉树相同,则查找的时间复杂度为logN,近似于折半查找。

平衡二叉树(AVL):是一种二叉排序树,其中每一个结点的左子树和右子树的高度差之多等于1.

  BF(Balance Factor)平衡因子:二叉树上结点的左子树深度减去右子树深度的值成为平衡因子。

  最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树。

  平衡二叉树的构建思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

BF为正值,右旋
BF为负值,左旋
BF一正一负,先将符号统一后,再旋转一次

红黑树:http://blog.csdn.net/eric491179912/article/details/6179908

前面讨论的数据结构,处理数据都是在内存中,因此考虑的都是内存中的运算时间复杂度。但如果要操作的数据集非常大,如数据库中的上千万条记录,硬盘中的上万个文件,在这种情况下,对数据的处理需要不断从硬盘等存储设备中调入或调出内存页面。一旦涉及到这样的外部存储设备,关于时间复杂度的计算就会发生变化,访问该集合元素的时间已经不仅仅是寻找该元素所需比较次数的函数,我们必须考虑对硬盘等外部存储设备的访问时间以及将会对该设备做出多少次单独访问。

一个结点只能存储一个元素,在元素非常多的时候,就使得要么树的度非常大要么树的高度非常大,甚至都必须足够大才行。这样就使得内存存取外存的次数非常多,这显然成了时间效率的瓶颈,这迫使我们要打破每一个结点只能存储一个元素的限制,为此引入了多路查找树。

多路查找树:其每一个结点的孩子可以多于两个,且每一个结点处可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。它的四种特殊形式:2-3树、2-3-4树、B树、B+树。

2-3树是这样一颗多路查找树:其中的每一个结点都具有两个还是(称它为2结点)或三个孩子(称它为3结点)。一个2结点包含一个元素和两个孩子(或没有孩子),且与二叉排序树类似,左子树包含的元素小于该元素,右子树包含的元素大于该元素。与二叉排序树不同的是,这个2结点要么没有孩子,要么就两个不能只有一个。一个2结点包含一小一大两个元素和三个孩子。并且2-3树种所有的叶子都在同一层上。

B树:是一种平衡的多路查找树,2-3和2-3-4树都是B树的特例。结点最大的孩子数成为B树的阶,因此2-3树是3阶B数。

如果在内外存交换数据频繁,会造成时间效率上的瓶颈,那么B树结构如何做到减少次数?

  我们的外村,比如硬盘,是将所有的信息分割成相等大小的页面,每次硬盘读写的都是一个或多个完整的页面,对一个硬盘来说,一页的长度可能是211到214个字节。在一个典型的B树应用中,要处理的硬盘数据量很大,因此无法一次全部装入内存,因此我们会对B树进行调整,是的B树的阶数与硬盘存储的页面大小相匹配。比如一颗B树的阶为1001(即一个结点包含1000个关键字),高度为2,它可以存储超过10亿个关键字,我们只要让根节点持久的保存在内存中,那么在这棵树上,需找某一个关键字至多只需要两次硬盘读取即可。通过这种方式在内存有限的情况下,每一次磁盘的访问我们都可以获得最大数量的数据,由于B树没结点可能具有比二叉树多得多的元素,所以与二叉树的操作不同,他们减少了必须访问结点和数据块的数量,从而提高了性能,B树的数据结构就是为内外存的数据交互准备的。

为了解决所有元素遍历等基本问题,我们在B树结构的基础上,加上了新的元素组织方式,就是B+树。

B+树:在B树种每一个元素在该树种只出现一次,有可能在叶子节点上,也有可能在分支节点上,而在B+树中,出现在分支结点中的元素会被当做他们在该分支结点位置的中序后继者中再次列出。另外每一个叶子节点都会保存一个指向后一叶子节点的指针。

这样数据结构的好处就是如果随机查找,就从根节点出发,与B树的查找方式一样,只不过及时在分支节点找到了待查找的关键字也只是用来索引的,不能提供实际记录的访问,还是需啊哟到达包含次关键字的终端节点。如果是从小到大查找关键字,我们可以从最左侧的叶子节点出发,不经过分支结点,而是沿着指向下一叶子的指针就可以遍历所有的关键字。

   

posted @ 2016-03-10 22:36  cjt1991  阅读(368)  评论(0编辑  收藏  举报