数据结构与算法基础-学习-22-查找之顺序查找与折半查找(二分查找)

news2025/1/9 16:52:38

目录

一、概念

1、查找表

2、关键字

3、主关键字

4、次关键字

二、查找表分类

1、静态查找表

2、动态查找表

三、平均查找长度

四、顺序查找

1、适用范围

2、结构体定义

3、函数定义

(1)生成测试数据(创建顺序查询表)

(2)无哨兵

(3)有哨兵

五、折半查找

1、非递归

2、递归

六、Linux环境编译测试


一、概念

1、查找表

由同一类型的数据元素构成的集合。

2、关键字

用来标识一个数据元素的某个数据项的值。

3、主关键字

可唯一地标识一个记录的关键字。

4、次关键字

用以识别若干记录的关键字。

二、查找表分类

1、静态查找表

仅作查询操作的查找表。

2、动态查找表

作插入和删除操作的查找表。

三、平均查找长度

ASL = \sum_{i=1}^{n} pi * ci

关键字的平均比较次数,也称为平均查找长度ASL(Average Search Length)。

参数名描述
n记录的个数。
pi查找第i个记录的概率(通常认为pi = 1 / n)。
ci记录第i个记录所需的比较次数。

四、顺序查找

1、适用范围

(1)顺序表或线性链表表示的静态查找表。

(2)表内元素之间无序。

2、结构体定义

typedef char          CharKeyType;
typedef int           IntKeyType;
typedef long long int SeqSearchTableSizeType;
typedef long long int ChunkSizeType;

typedef struct SeqSearchTableElemType
{
    CharKeyType            CharKey;//后续可以放其他类型的数据,不止一个关键域。
    SeqSearchTableSizeType NumberKey;
}SeqSearchTableElemType;

//Data的0号位不用,当作哨兵使用
typedef struct SeqSearchTable
{
    SeqSearchTableElemType* Data;
    SeqSearchTableSizeType  Length;
}SeqSearchTable;

3、函数定义

(1)生成测试数据(创建顺序查询表)

//生成测试数据使用
Status CreateSeqSearchTable(SeqSearchTable** SST, SeqSearchTableSizeType DataNum, CharKeyType key)
{
    JudgeAllNullPointer(SST);
    
    *SST                     = (SeqSearchTable*)MyMalloc(sizeof(SeqSearchTable));
    (*SST)->Data             = (SeqSearchTableElemType*)MyMalloc(sizeof(SeqSearchTableElemType) * (DataNum + 1));
    (*SST)->Length           = DataNum;
    SeqSearchTableSizeType i = 1;
    SeqSearchTableSizeType j = 65;

    for(i = 1; i <= DataNum; i++,j++)
    {
        if(j > 90)
        {
            j = 65;
        }
        (*SST)->Data[i].CharKey   = j;
        (*SST)->Data[i].NumberKey = i;
    }
    (*SST)->Data[1].CharKey = key;
    Log("Create SeqSearchTable Normal\n",Info);
    return SuccessFlag;
}

(2)无哨兵

//0:查询不到关键元素。其他值:关键字在SeqSearchTable中的索引位。
SeqSearchTableSizeType SeqSearch(SeqSearchTable* SST, CharKeyType Key)
{
    JudgeAllNullPointer(SST);
    Log("SeqSearch Start\n", Info);
    SeqSearchTableSizeType i;

    for(i = SST->Length - 1; i >= 1; i--)
    {
        if(SST->Data[i].CharKey == Key)
        {
            return i;
        }
    }
    return 0;
}

(3)有哨兵

//0:查询不到关键元素。其他值:关键字在SeqSearchTable中的索引位。
SeqSearchTableSizeType SeqSearchSentry(SeqSearchTable* SST, CharKeyType Key)
{
    JudgeAllNullPointer(SST);
    Log("SeqSearchSentry Start\n", Info);
    SST->Data[0].CharKey = Key;
    SeqSearchTableSizeType i;

    for(i = SST->Length - 1;; i--)
    {
        if(SST->Data[i].CharKey == Key)
        {
            return i;
        }
    }
}

相比于无哨兵,例如需要比较n次才能匹配关键字,可以少判断n次的i >= 1,效率上有一定提升。

五、折半查找

折半查找的效率高于顺序查找,但适用范围仅限于排好序的数据,没有顺序查找适用性广泛。

1、非递归

SeqSearchTableSizeType BinarySearch(SeqSearchTable* SST, SeqSearchTableSizeType NumberKey)
{
    JudgeAllNullPointer(SST);
    Log("BinarySearch Start\n", Info);
    SeqSearchTableSizeType LowIndex  = 1;
    SeqSearchTableSizeType HighIndex = SST->Length;
    SeqSearchTableSizeType MidIndex;

    while(LowIndex <= HighIndex)
    {
        MidIndex = (HighIndex + LowIndex) / 2;
        if(SST->Data[MidIndex].NumberKey == NumberKey)
        {
            return MidIndex;
        }
        if(SST->Data[MidIndex].NumberKey > NumberKey)
        {
            HighIndex = MidIndex - 1;
        }
        else
        {
            LowIndex = MidIndex + 1;
        }
    }
    return 0;
}

例如我们需要找13,MidIndex = (0 + 10)/ 2 = 5,15比13大。

HighIndex = 5 - 1 = 4;

 MidIndex = (0 + 4)/ 2 = 2,12比13小。LowIndex = 2 + 1 = 3;

 MidIndex = (3 + 4)/ 2 = 3,找到关键字13。

2、递归

SeqSearchTableSizeType BinarySearchRecursion(SeqSearchTable* SST, SeqSearchTableSizeType NumberKey, SeqSearchTableSizeType LowIndex, SeqSearchTableSizeType HighIndex)
{
    if(LowIndex > HighIndex)
    {
        return 0;
    }

    SeqSearchTableSizeType MidIndex = (HighIndex + LowIndex) / 2;

    if(SST->Data[MidIndex].NumberKey == NumberKey)
    {
        return MidIndex;
    }
    else if(SST->Data[MidIndex].NumberKey > NumberKey)
    {
        HighIndex = MidIndex - 1;
        return BinarySearchRecursion(SST, NumberKey, LowIndex, HighIndex);
    }
    else
    {
        LowIndex = MidIndex + 1;
        return BinarySearchRecursion(SST, NumberKey, LowIndex, HighIndex);
    };    
}

递归先写退出条件再写逻辑关系,其实每一步都是折半查找,总体思路和上面差的不多,这里就不多赘述了。

六、Linux环境编译测试

[gbase@czg2 Select]$ make
gcc -Wall -Wextra -O3 ../Log/Log.c ../PublicFunction/PublicFunction.c Select.c HashTable.c AvlTree.c main.c -o TestSelect -I ../Log/ -I ../PublicFunction/ -I ./ -I ../PublicFunction/SqStack/

[gbase@czg2 Select]$ ./TestSelect 
[2023-5]--[ Info  ]--Create SeqSearchTable Normal
[2023-5]--[ Info  ]--SeqSearch Start
[2023-5]--[ Info  ]--Index : 1, Elapsed Time : 0 ms
[2023-5]--[ Info  ]--SeqSearchSentry Start
[2023-5]--[ Info  ]--Index : 1, Elapsed Time : 0 ms
[2023-5]--[ Info  ]--BinarySearch Start
[2023-5]--[ Info  ]--Index : 3, Elapsed Time : 0 ms
[2023-5]--[ Info  ]--BinarySearchRecursion Start
[2023-5]--[ Info  ]--Index : 3, Elapsed Time : 0 ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git reset和git revert的区别

前提条件 假设现在有三次提交到remote repository: commit abf94bdf743e23737950c36bda381d2aba1803fc(HEAD -> master, origin/master) Author: ztenv <class7classqmm.com> Date: Tue Sep 21 16:36:39 2021 0800feat add 3.gocommit 181cc7131acc18f248aba46384…

2023年值得关注:邮件营销平台的新技术和新趋势

对于希望增加在线影响力和想要接触更广泛受众的企业来说&#xff0c;电子邮件营销是一个非常好用的工具。它能够为企业培养长期的联系人&#xff0c;以极高的投资回报比为企业带来长期收益。特别是对于想要出海的企业或者做跨境贸易的公司来讲&#xff0c;邮件营销可以发挥巨大…

(抄送列表,年会抽奖)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、[编程题]抄送列表 二、[编程题]年会抽奖 一、[编程题]抄送列表 链接&#xff1a;抄送列表__牛客网 来源&#xff1a;牛客网 题目&#xff1a; NowCoder每天要处理许多邮…

Swift 技术 删除缓存,清空缓存

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

测试开发如何进阶?需要哪些能力?吐血整理-你的进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试开发&#xff…

Redis底层设计与源码分析(一)__底层数据结构逻辑分析

前言 最近在工作中接触redis&#xff0c;但实际应用不多&#xff0c;可用场景也不是很明确&#xff0c;所以想借机多多学习下redis相关知识&#xff0c;一下内容都是通过自己找资源学习之后归纳总结的知识&#xff0c;若有相关错误点&#xff0c;请指正。 一、redis介绍 1.…

Softing线上研讨会 | 轻松访问XML文件中的过程数据

| 线上研讨会时间&#xff1a;2023年5月8日下午4点或晚上10点 对于传统车间的系统应用和创新的物联网解决方案而言&#xff0c;高效访问机器和流程数据至关重要。而在现有工厂中&#xff0c;过程数据通常以XML文件的形式出现。对此&#xff0c;Softing Industrial提供了一个用…

操作系统——设备管理

0.关注博主有更多知识 操作系统入门知识合集 目录 1.设备管理概念 2.SPOOLing技术 1.设备管理概念 在计算中&#xff0c;除CPU、内存以外的所有设备统称为外设&#xff0c;即外部设备&#xff0c;例如鼠标、键盘、打印机、摄像头、磁盘、硬盘......那么这些只需要连接到计…

多城市门店店铺展示地图导航pc/h5系统开发

多城市门店店铺展示地图导航pc/h5系统开发 系统设置&#xff1a; 网站标题、网站副标题、Logo图、网站背景图、网站底部图、网站底部版权、网站ICP备案、腾讯地图Key。 店铺列表&#xff1a; 店铺名称、店铺图标、设备、电话、省市区、详细地址。 添加店铺&#xff1a; 店铺…

搭建Harbor镜像仓库及简单使用

一、Harbor简介 Harbor是由VMware公司中国团队为企业用户设计的Registry server开源项目&#xff0c;包括了权限管理(RBAC)、LDAP、审计、管理界面、自我注册、HA 等企业必需的功能&#xff0c;同时针对中国用户的特点&#xff0c;设计镜像复制和中文支持等功能。 作为一个企…

CentOS7下离线安装MySQL8

背景 在hw外包干久了&#xff0c;要废了&#xff0c;什么都要忘记了&#xff0c;感觉和外面脱节太大了&#xff0c;太危险了&#xff0c;赶紧复习一下压压惊。 准备rpm安装包 下载地址&#xff1a;https://www.mysql.com/cn/downloads/ 图1&#xff1a; 图2&#xff1a; 图…

2 行代码开启 SAST,将代码漏洞定位到具体行数

&#x1f4a1; 如何在流水线中集成与应用 SAST&#xff0c;实现自动化代码安全扫描 &#xff1f; 近日&#xff0c;在「DevSecOps软件安全开发实践」课程上&#xff0c;极狐(GitLab) 高级专业服务交付工程师欧阳希、极狐(GitLab) 后端工程师黄松&#xff0c;分享了静态安全扫描…

互联网赚钱项目有哪些?目前最火的互联网项目

互联网是一个神奇的行业&#xff0c;大门不出二门不迈&#xff0c;一根网线一台电脑&#xff0c;甚至一台手机就可以赚钱。它给我们创造了前所未有的商业机会&#xff0c;让成千上万有梦想&#xff0c;敢想敢干的人通过互联网获得了巨大的成功&#xff01;正因为如此&#xff0…

引领真无线耳机未来趋势,NANK南卡OE骨传导真无线耳机惊艳亮相

传统的蓝牙耳机存在很多问题&#xff0c;例如续航时间短、长期佩戴耳朵会不舒服&#xff0c;甚至影响听力等等。为了解决这些问题&#xff0c;在骨传导领域深耕十多年的南卡品牌推出了这款真无线骨传导耳机——NANK南卡 OE。 NANK南卡OE即将正式上线&#xff0c;这一消息一经宣…

项目搭建第一天后台搭建方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、后台环境是什么&#xff1f;二、使用步骤1.项目目录2.项目介绍3.项目构建3.1 注册中心搭建方式3.2 关键配置3.3 开启高可用方式 总结 前言 提示&#xff1…

10 KVM虚拟机配置-虚拟CPU和虚拟内存

文章目录 10 KVM虚拟机配置-虚拟CPU和虚拟内存10.1 概述10.2 元素介绍10.3 配置示例 10 KVM虚拟机配置-虚拟CPU和虚拟内存 10.1 概述 本节介绍虚拟CPU和虚拟内存的常用配置。 10.2 元素介绍 vcpu&#xff1a;虚拟处理器的个数。 memory&#xff1a;虚拟内存的大小。 属性un…

盖雅工场荣获「2022年度最佳人力资源服务机构」奖

2023年4月26日&#xff0c;HRoot重磅发布2022年度最佳人力资源服务机构榜单。盖雅工场凭借专业的服务、优质的品牌口碑和影响力&#xff0c;再度荣获「2022年度最佳人力资源服务机构」奖项&#xff0c;彰显了盖雅优秀的产品实力以及在人力资源技术服务领域的优势地位。 奖项背景…

PCL学习五:Range Images-距离图像

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云PCL深度图像 1. 引言 1.1 深度图像的获取与研究方向 获取方法 激光雷达深度成像法&#xff0c;计算机立体视觉成像&#xff0c;坐标测量机法&#xff0c;莫尔条纹法&#xff0c;结构光法 研究方向 深度图像的分割技术深度…

使用 SaleSmartly 实时聊天提高转化率

在竞争激烈的电子商务环境中&#xff0c;很难给客户留下持久的印象&#xff0c;与他们建立关系更加困难。但是&#xff0c;提供个性化的体验和产品是超越竞争对手的最佳方式之一。这就是为什么许多跨境电子商务企业将与客户的个性化沟通作为他们的首要任务。 SaleSmartly&#…

JVM原理与实战(一)

jvm的基本结构 1.类加载系统 负责从文件系统或者网络中加载Class信息 2.方法区 &#xff08;1&#xff09;加载的类信息存放于一块称为方法去的内存空间 &#xff08;2&#xff09;除了类的信息外&#xff0c;方法区中可能还存放着运行时常量池信息&#xff0c;包括字符串字面…