数据结构基本查找算法

来源:互联网 发布:python 迭代器的使用 编辑:程序博客网 时间:2024/05/20 02:26

1.概述

  查找表的概念:由同一类型的数据元素(或者记录)构成的集合。由于集合中的数据元素之间存在完全松散耦合的关系,因此,查找表是一种非常灵便的数据结构。
  
  查找表的操作:
  a)查询某个“特定的”数据元素是否在查找表中
  b)检索某个“特定的”数据元素的各种属性
  c)在查找表中插入一个数据元素
  d)从查找表中删去某个数据元素
  
  查找表的分类:
  按照记录在表中的位置和它的关键字之间的关系查找表可以分为:静态查找表,动态查找表和Hash表。
  静态查找表和动态查找表都是记录在表中的位置和它的关键字之间不存在一个确定的关系。而Hash表是记录在表中的位置和它的关键字之间存在一个确定的关系。
  
  查找表的定义:
  静态查找表:仅作查询和检索操作的查找表。
  动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,此类表为动态查找表。
  哈希表: 根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“映象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。
  
  查找表的性能分析:
  通常把对关键字的最多比较次数和平均比较次数作为查找算法的两个基本技术指标,分别叫做最大查找长度(MSL)和平均查找长度(ASL)。

2.静态查找表

顺序查找

  基本思想:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
  代码实现

//顺序查找public int search_seq(int[] nums,int key) {for (int i = 0; i < nums.length; i++) {if (nums[i] == key) {//找到该元素,返回元素下标return i;}}//查找失败,返回-1return -1;}

  优缺点:算法简单,且对表的结构无任何要求,无论是用向量还是用链表来存放结点,也无论结点之间是否按关键字有序,它都同样适用;查找效率低,因此,当n较大时不宜采用顺序查找。
  平均查找长度:(n+1)/2

折半查找

  基本思想:又称二分查找,折半查找是以处于区间中间的位置记录的关键字和给定值进行比较,若相等,查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者区间大小小于0时,则查找失败。折半查找只适用于有序表,且限于顺序存储结构,对线性链表无法进行查询。
  代码实现

//折半查找public int search_Bin(int[] nums,int key) {int low = 1;//下界int high = nums.length;//上界int mid;while (low <= high) {mid = (low + high)/2;if(key == nums[mid]) {//区间中间值等于要查找的值return mid;}else if(key < nums[mid]) {high = mid -1;}else {low = mid + 1;}}//未查找到return -1;}

  优缺点:虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。
  平均查找长度:log2(n+1) -1

分块查找

  基本思想:分块查找又称索引顺序查找,性能介于顺序查找和二分查找之间。表R[1..n]均分为b块,前b-1块中结点个数为 s=n/b(向上取整) ,第b块的结点数小于等于s;每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表是”分块有序”的。然后抽取各块中的最大关键字和它们的位置构成索引表,该索引表是递增有序的。此时,当我们要查找元素时,可以在索引表上面采用折半查找(优先)或者顺序查找确定该元素在哪一个块中,然后再在块内使用顺序查找(因为块中的元素是无序的)。
  代码实现
  分块查找
  平均查找长度:log2(n/s+1)+s/2

3.动态查找表

二叉排序树

  又称二叉查找树
  定义:二叉排序树或者是空树,或者是满足如下性质的二叉树
  (1)若它的左子树不空,则左子树上的所有节点的值均小于根节点的值;
  (2)若它的右子树不空,则右子树上的所有节点的值均大于根节点的值;
  (3)它的左右子树也分别为二叉排序树。
  操作:{动态查找表–二叉排序树(二叉查找树)}(http://www.cnblogs.com/foreverking/articles/2338557.html)

B-树

  B-树是一种平衡的多路查找树,在文件系统中很有用。
  定义:一颗m阶B-树或为空树,或者满足如下性质
  (1)树中每个节点至多有m棵子树;
  (2)若根节点不是叶子节点,则至少有两棵子树;
  (3)除根节点之外所有非终端节点至少有m/2向上取整棵子树;
  (4)所有非终端节点中包含下列信息数据:(n,A0,K1,A1,k2,A2,…,An.Kn)其中,n是表示该节点中关键字的个数,K为关键字,A为指向子树的指针。Ai-1指向的子树中节点的值都小于Ki,Ai指向的子树节点中的值都大于Ki;
  (5)所有的叶子节点都出现在同一层次上,不带信息。可以看做是外部节点或者是查找失败所到达的节点。
  在B-树上进行查找的过程和二叉排序树的查找类似。具体过程参考《数据结构》,P238。

4.哈希表

  概念:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置。
  哈希函数构造方法:直接定址法,数字分析法,平方取中法,折叠法,除留余数法,随机数法…
  处理冲突的方法:开放定址法,再哈希法,链地址法,公共溢出区
  哈希表的查找:在哈希表上进行查找的过程和哈希表的构造过程基本一致。给定K值,根据造表时设定的哈希函数求得哈希地址,若表中的此位置上没有记录,则查找失败;否则,需要拿给定值与记录进行比较,若相等,则查找成功;否则,根据造表时设定的处理冲突的方法找下一个地址,直到哈希表中某个位置为空或者表中的记录与给定值相等为止。
  具体过程参考《数据结构》,P251。

5.参考资料

资料一
资料二《数据结构(C语言版)》严蔚敏,吴伟民

0 0
原创粉丝点击