文字描述

  以有序表表示静态查找表时,可用折半查找算法查找指定元素。

  折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。

示意图

算法分析

  折半查找过程可以用一颗二叉判定树来表示,而具有n个结点的判定树的深度为[log2n]+1,所以折半查找法在查找成功和不成功时,与给定值进行比较的关键字个数都不会超过[log2n]+1. 现讨论折半查找算法的平均查找长度。

   为讨论方便,假设有序表长度为n=2h-1,则描述折半查找的判定树是深度为h的满二叉树。假设每个记录的查找概率相等Pi = 1/n, 则折半查找查找成功的平均查找长度

  当n足够大时,平均查找长度约为log2(n+1)-1 可见,折半查找的效率比顺序查找要高,但是折半查找只适用于有序表,且限于顺序存储结构,对线性链表无法有效地进行折半查找。

代码实现

 /*
./a.out 5 13 19 21 37 56 64 75 80 88 92
*/
#include <stdio.h>
#include <stdlib.h> #define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define LQ(a, b) ((a) <= (b))
#define MAX_SIZE 50
#define DEBUG typedef int KeyType;
typedef char InfoType;
/*数据元素类型定义*/
typedef struct{
//关键字域
KeyType key;
//其他域
InfoType otherinfo;
}ElemType;
/*静态查找表的顺序存储结构*/
typedef struct{
//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
ElemType *elem;
//表长度
int length;
}SSTable; /*折半查找算法
*
*顺序表中的元素应该按照由小到大顺序排列.
*
*在顺序表ST中顺序查找其关键字等于key的数据元素。
*若找到,则函数值为该元素在表中的位置,否则为0
*/
int Search_Bin(SSTable ST, KeyType key){
//置区间初值
int low = ;
int high = ST.length;
int mid = (low+high)/;
while(low<=high){
mid = (low+high)/;
if(EQ(ST.elem[mid].key, key)){
//找到待查元素
return mid;
}else if(LT(ST.elem[mid].key, key)){
//继续在后半区间查找
low = mid+;
}else{
//继续在前半区间查找
high = mid-;
}
}
return ;
} //顺序打印顺序表中的数据元素
void print_Seq(SSTable ST){
int i = ;
for(i=; i<= ST.length; i++){
printf("[%d]=%d/%c; ", i, ST.elem[i].key, ST.elem[i].otherinfo);
}
printf("\n");
} int main(int argc, char *argv[])
{
int i = , loc = , key=;
ElemType arr[MAX_SIZE+] = {};
for(i=; i<argc; i++){
arr[i].key = atoi(argv[i]);
arr[i].otherinfo = 'a'+i-;
}
SSTable ST;
ST.length = i-;
ST.elem = arr;
#ifdef DEBUG
printf("输入了数据:");
print_Seq(ST);
#endif
while(){
printf("输入待查找的key值(负值表示结束):");
scanf("%d", &key);
if(key < )
break;
loc = Search_Bin(ST, key);
printf("key值为%d的位置在%d\n", key, loc);
}
return ;
}

折半查找(有序表)

运行

查找->静态查找表->折半查找(有序表)的更多相关文章

  1. JAVA通过继承线性表来实现有序表

    1,对于线性表而言,里面的元素是无序的,可以随意地将新元素增加到线性表中而不需要考虑该元素在线性表中的位置.但是,对于有序表而言,其中的元素是按照某种方式进行排序的,因此在有序表中插入元素时,需要按照 ...

  2. java数据结构之有序表查找

    这篇文章是关于有序表的查找,主要包括了顺序查找的优化用法.折半查找.插值查找.斐波那契查找: 顺序优化查找:效率极为底下,但是算法简单,适用于小型数据查找: 折半查找:又称为二分查找,它是从查找表的中 ...

  3. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  4. LeetCode编程训练 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  5. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  6. java基础-数组的折半查找原理

    java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...

  7. 算法学习记录-查找——折半查找(Binary Search)

    以前有个游戏,一方写一个数字,另一方猜这个数字.比如0-100内一个数字,看谁猜中用的次数少. 这个里面用折半思想猜会大大减少次数. 步骤:(加入数字为9) 1.因为数字的范围是0-100,所以第一次 ...

  8. 查找(顺序表&有序表)

    [1]查找概论 查找表是由同一类型是数据元素(或记录)构成的集合. 关键字是数据元素中某个数据项的值,又称为键值. 若此关键字可以唯一标识一个记录,则称此关键字为主关键字. 查找就是根据给定的某个值, ...

  9. 查找->静态查找表->次优查找(静态树表)

    文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...

随机推荐

  1. c#中的 virtual override 和abstract 以及sealed

    1.如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖. 2.如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏. 3.如果子类 ...

  2. linux每日命令(30):Linux 用户及用户组相关文件、命令详解

    一. 用户.用户组概念及其文件结构详解 Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.nobody.ftp等,这些也都是非root用户,即 ...

  3. Android开发(十七)——关闭中间activity

    参考: http://java--hhf.iteye.com/blog/1826880

  4. android——判断当前网络是否可用

    http://www.cnblogs.com/codeworker/archive/2012/04/23/2467180.html //判断当前是否有网络连接 private boolean isCo ...

  5. Spring Security登陆

    本文参考或摘录自:http://haohaoxuexi.iteye.com/blog/2154714 在上一篇中使用Spring Security做了一些安全控制,如Spring Security 自 ...

  6. [C#] 一款代码注释清理工具

    [C#] 一款代码注释清理工具   在程序开发过程中,很多时候我们都会在代码中进行注释,以便大家更容易理解或能更直观明白某个类或方法是用来做什么的,我们就会用注释 就以C#为列子,注释符大致为'//' ...

  7. Centos7最小化安装

    1.先使用minimal安装系统 2.配置网络:dhcp或者静态ip,修改/etc/sysconfig/network-scripts/ifcfg-eth0文件:配置DNS,修改/etc/resolv ...

  8. .NET解决[Serializable] Attribute引发的Json序列化k_BackingField

    在WebAPI中的WebApiConfig直接加入如下配置 有问题找谷歌

  9. 一台PC双网卡,一个外网一个内网

    问题:一台PC双网卡,一个连外网一个连内网.用户主要访问外网,内网只访问有限的几个ip.因为外网很大,一般人公司内网常访问的ip是有限的几个. 现在如何做到在上外网的同时也能访问内网的系统?明明两个网 ...

  10. 设计模式-行为型模式,python 中介者模式

    中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...