查找 -数据结构

时间:2019-02-11
本文章向大家介绍查找 -数据结构,主要包括查找 -数据结构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
               

几种查找算法:顺序查找,折半查找,分块查找,散列表

一、顺序查找的基本思想:

 从表的一端开始,向另一端逐个按给定值kx 与关键码进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与kx 相同的关键码,则查找失败,给出失败信息。

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。

【适用性】:适用于线性表的顺序存储结构和链式存储结构。

平均查找长度=(n+1)/2.

【顺序查找优缺点】:

缺点:是当n 很大时,平均查找长度较大,效率低;

优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。


二、有序表的折半查找基本思想:

在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键码相等,则查找成功;若给定值小于中间元素的关键码,则在中间元素的左半区继续查找;若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。

【步骤】
① low=1;high=length; // 设置初始区间
② 当low>high 时,返回查找失败信息// 表空,查找失败
③ low≤high,mid=(low+high)/2; //确定该区间的中点位置
      a. 若kx<tbl.elem[mid].key,high = mid-1;转② // 查找在左半区进行
      b. 若kx>tbl.elem[mid].key,low  = mid+1; 转② // 查找在右半区进行
      c. 若kx=tbl.elem[mid].key,返回数据元素在表中位置// 查找成功

有序表按关键码排列如下:

7,14,18,21,23,29,31,35,38,42,46,49,52

在表中查找关键码为14 的数据元素:


 【算法实现】

int Binary_Search(ElemType a[], ElemType kx, int length)    {    int mid,low,high, flag = 0;    low = 0; high = length;                   /* ①设置初始区间*/    while(low <= high)                        /* ②表空测试*/    {    /* 非空,进行比较测试*/        mid = (low + high)/2;                /* ③得到中点*/        if(kx < a[mid]) high = mid-1;        /* 调整到左半区*/        else if(kx > a[mid]) low = mid+1;    /* 调整到右半区*/        else {                                /* 查找成功,元素位置设置到flag 中*/            flag=mid;            break;        }                            }    return flag;}

【性能分析】

平均查找长度=Log2(n+1)-1

 从折半查找过程看,以表的中点为比较对象,并以中点将表分割为两个子表,对定位到的子表继续这种操作。所以,对表中每个数据元素的查找过程,可用二叉树来描述,称这个描述查找过程的二叉树为判定树。

                                                  (7,14,18,21,23,29,31,35,38,42,46,49,52)折半查找的判定树