C++常用的查找方法

来源:互联网 发布:sql developer使用 编辑:程序博客网 时间:2024/05/22 12:35

查找(search)当然也是最常见的运算,就是在数据集合中寻找满足条件的数据对象,找到后进一步给出对象的具体信息,在数据库技术中称为检索(retrieval)。

查找的依据

查找的依据是关键字(key word)是否相同。可以唯一地把资料区分出来的数据被称为主关键字

例如学生的资料,该资料是一个结构体变量;
struct student{
    int id ; //学号,可作为主关键字
    char name[20]; // 姓名
    char sex; // 性别
    int age; // 年龄
    char address[60]; //家庭地址
    float eng, phy,math , electron;
}; //英语,物理,数学,电子学成绩等也可作为关键字

如果关键字小的排在前面,我们称为升序排列,反之为降序排列

查找方法

  • 最简单的查找——顺序查找,即从数组第一个元素开始,一个一个顺序查下去直到找到或查到最后一个元素为止。
  • 数据排列有序时,可以采用对半查找(binary search)。算法的执行效率比顺序查找高。
  • 散列查找:散列(hash)查找是最快的查找方法。前文介绍的两种查找方法都是将需查找的关键字值与表中的数据元素的关键字值进行比较而达到查找的目的。如果能找到一个函数 f(key),将关键字经过函数的运算转换为数据表中的位置,直接将数据元素插入在该位置上。在查找中可直接取用该位置的数据元素。这样的组织称为散列,利用散列技术查找的方法称为散列查找,散列查找是一种直接查找。亦用音译称哈希查找。

查找举例

图6.3和图6.4描述对半查找是怎样进行的。这里是升序的有序表。(演示查找过程)

说明:首先安排两个指针low和high指向首尾两元素,取mid=(low+high)/2,如mid指向元素是所查找的,则结束。如果该元素关键字大了,则取low=mid+1, high不变,继续查找;如果该元素关键字小了,则取 high=mid-1,low不变,继续查找。如果查到low>high仍未找到,则失败,停止。这里有一步非常重要,就是low=mid+1和high=mid-1,表面上看用low=mid和high=mid代替只是效率低了一些,多保留了一个mid所指数据,但是实际上没有加1和减1时,可能数据存在而找不到。如在图6.3中,如果找到了仅剩20、21、23这一步,这时取low=mid,则剩下21、23,mid = (low + high)/2,得mid = low ,下一步low = mid ,还是剩下21、23,mid永远不能指向23,永远找不到23了。(演示查找过程)

【例6.4】对半查找递归算法,作为有序表模板类成员函数。(查看源码)
递归方法易读易懂,但效率低。注意递归的隐式循环代码编写。

【例6.5】对半查找迭代算法。(查看源码)

  • 该例中迭代算法的可读性也不差,效率要高于递归。注意迭代的显式循环代码编写的关键点。
  • *本例中出现的成员函数Binarysearch(T & x)const ,称为 const成员函数,该函数保证只读。相应节点对象重载的比较运算符也必须是const。