数据结构之查找

Posted 进步一丢点everyday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之查找相关的知识,希望对你有一定的参考价值。

查找

  1. 概论
    查找表(search table):是由同一类型的数据元素构成的集合
    关键字(Key):是数据元素中某个数据项的值
    查找(Searching):就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素
查找方式Value
静态查找表(Static search table)只作查找操作和查找表
动态查找表(Dynamic search table)在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。
  1. 顺序查找
    定义:(Sequential search)又叫线性查找,是最基本的查找方式,过程就说从表中第一个元素记录开始,逐个进行记录的关键字和给定值的比较,若给定的关键字和给定值相等,则查找成功。

  2. 有序表查找
    a.折半查找:通过二分验证的方式进行查找
    b.插值查找:不是二分的方法,更加有目的性。根据要查找的关键字Key与查找表中最大最小记录的关键字比较后的查找方式。
    c.斐波那契查找:
    首先斐波那契数列为0、1、1、2、3、5、8…
    看出规律了吧,就是给定前两个数相加得到第三个数,以此类推,此外:前一个数除以相邻的后一个数,比值无限接近黄金分割。比如5/8 = 0.625.越往后越接近0.618.
    查找的核心是:
    (1)当要查找的数key = a[mid]时候,查找成功;
    (2)当key < a[mid]时候,新范围是第low个到第mid-1个,此时范围个数为F【k-1】-1个;
    (3)当key > a[mid]时候,新范围为第mid+1个到high个,此时范围个数为F[k - 2] -1个。

  3. 线性索引查找
    所谓索引,就是把一个关键字与它对应的记录相关联。按照结构可以分为线性索引、树形索引和多级索引。
    而线性索引又可以分为稠密索引(将数据集中的每个记录对应一个索引项,对于稠密索引这个索引来说,索引项一定按照关键码有序的排列);分块索引(把数据集的记录分为若干块,并且块内无序,快间有序);倒排索引。

  4. 二叉排序树
    定义:(Binary sort tree)又称二叉查找树,它可以是空树,也可以是任意结点的左子树都小于其自身,而任意结点的右子树都大于其自身,且左右子树分别是二叉排序树。
    用途:对于二叉树的查找、排序和删除在原理上都比较简单,但是代码实现方面目前还没有明白,需要说的是删除操作:对于要删除的的结点只有单面的子树时候,是好解决的,例如下图中删除35结点,它只有右子树37,没有左子树,因此只需要将37结点连到35的双亲结点47即可,删除99结点同理。

    可是下图这种要删除的结点既有左子树又有右子树,怎么办,该连哪个?

此刻,如果我们对原本的二叉树进行排序,也就是中序遍历时候有29,35,36,37,47,48,49,50,51,56,。。。。,可以发现与47相邻的两个输为37和49,也就是47左结点的右结点37,47右结点的左结点49,才能更好的代替47,因为他们和47最相近,下两图分别为删除了47,用37代替和用49代替的结果。

  1. 平衡二叉树(AVL)这个简写和它的英文名称无关,至是和作者的简称有关。
    定义:它是一种二叉排序树,其中的每一个结点的左子树和右子树的高度差至多等于1.
    平衡因子:二叉树双上结点的左子树深度减去右子树深度的值称为平衡因子。

    图一满足AVL的条件
    图二不满足,他就不是一个二叉排序树,因为59
    图三不满足因为58结点的左子树深度为2,而右子树深度为0;
    接着就是需要将给定的数列转化为AVL方便以后的查找。
    至于转化过程就是一顿旋转(其实我没太彻底明白,先挖坑)

以上是关于数据结构之查找的主要内容,如果未能解决你的问题,请参考以下文章

大话数据结构之查找

数据结构之二叉查找树码源以及每一行代码的注释(java实现)

数据结构之二叉树

数据结构之二叉树扩展AVL,B-,B+,红黑树

Nginx数据结构之红黑树ngx_rbtree_t

数据结构基础之平衡二叉树详解