我们知道,将数据采用顺序存储或者链式存储等多种方式存储不是最终目的,我们要使用存储的数据,发挥它的作用。但是,在使用数据时,要先对数据进行查找,在日常生活和各种软件系统中,查找是一种十分常见的操作,下面我为大家讲解一下我对查找表的理解。
导图:
由图可以看出,查找表可分为动态查找表和静态查找表。之所以这么区分他们,是根据我们的需求而来。如果我们仅需要查找表中的某一元素或某一元素的属性,则使用静态查找,如果需要对查找表结构进行修改,则选择动态查找。
静态查找表:
静态查找表中,最简单的实现方式是以顺序表为存储结构,顺序表的存储更像我们的数组,通过键值进行存储。查找时,从表的最后一个元素开始向前查找,设置第一个元素为岗哨,将要被查找的值赋给岗哨。每次拿岗哨的值与表中的值从后向前做对比。查到后终止,返回位置。也可以倒过来,将岗哨放在最后,从后往前查。
静态查找表是已经完全储存好数据的表,为了提高查找速率,我们将数据进行处理,使其有序。方法有两种:按块有序,建立有序表。按块有序,将数据分块,标明每块的最大键值和块起始位置(索引派上用场)。在查找时,分两个阶段:第一阶段,将key与最大键值比较确定在哪个块(这个过程可以使用二分查找,也可使用顺序查找)。而建立完全的有序表后,就可以使用我们最熟悉的二分查找(向下取整)。
动态查找表:
静态查找表一旦建立后,所含的数据元素是固定不变的,动态查找表是根据排序规则实现边查边生成。有两种方式:二叉排序树(二分法)和散列表(函数关系)。
二叉排序树:
性质:
若左子树不空,则左子树上所有的结点的键值均小于根结点键值
若右子树不空,则右子树上所有的结点的键值均大于根结点键值
根的左右子树也分别为二叉排序树。
中序遍历得到升序序列(有序序列)
查找二叉排序树中的数据和向其中插入数据都需要查找,因为二叉树的性质,查找的过程就使用了二分法规则。二叉排序树是一种树形存储,和顺序表一样,都是将值存储到某种结构中,根据该结构的位置找到存储位置。我们在使用该值时,要先用键值进行比较,才能找到在该结构中的位置,比如,数组 ele【i】=key。
散列表:
散列表使用函数将键值和存储地址建立函数关系,直接根据key找到存储位置,不需要找i。关于散列表,主要是解决同义词之间的冲突,相信大家看我的导图就能理解了,我就不多做解释了。
最后:
这是我对概念的简单理解,还没有联系到具体的生活中,如果大家有更通俗的理解,希望咱们能一起探讨。