【数据结构】折半查找/二分查找 查找判定树+效率分析+完整代码

news2024/10/4 22:26:23

2.2 折半查找

  • 算法思想

    • 定义:

      折半查找,又称二分查找,仅用于有序顺序表

    • 实现思路:

      1.设置low和high指针,分别在序列首尾;

      2.取中间位置mid=(low+high)/2;

      3.若mid所指元素大,则去前半段查找,即high=mid-1;

      若mid所指元素小,则去后半段查找,即low=mid+1;

      查找成功则返回mid。

    在这里插入图片描述

  • 代码

    //查找表的数据结构
    typedef struct{
        ElemType *elem; //动态数组基址
        int TableLen; //表的长度
    }SSTable;
    //折半查找
    int Binary_Search(SSTable L,ElemType key){
        int low=0,high=L.TableLen-1,mid;
        while(low<=high){
            mid=(low+high)/2; //取中间位置
            if(L.elem[mid]==key)
                return mid;
            else if(L.elem[mid]>key)
                high=mid-1;
            else
                low=mid+1;
        }
        return -1;
    }
    
  • 查找效率分析

    在这里插入图片描述

  • 折半查找判定树的构造

    • 如果当前low和high之间有奇数个元素,则mid分割后,左右两部分元素个数相等。

      如果当前low和high之间有偶数个元素,则mid分割后,左半部分比右半部分少一个元素。

      在这里插入图片描述

    • 折半查找的判定树一定是平衡二叉树

      折半查找的判定树中,只有最下面一层是不满的。

      因此,元素个数为n时树高 h = ⌈ l o g 2 ( n + 1 ) ⌉ h=\lceil log_2(n+1) \rceil h=log2(n+1)⌉

      在这里插入图片描述

  • 性能分析

    时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n)

    • 顺序查找时间复杂度为 O ( n ) O(n) O(n),但查找速度不一定是折半查找快,比如要查找第一个元素时,还是顺序查找快。
  • 完整代码

    #include <stdio.h>
    #include <stdlib.h>
    
    // 定义ElemType,这里假设是int类型
    typedef int ElemType;
    
    // 定义查找表的数据结构
    typedef struct {
        ElemType *elem; // 动态数组基址
        int TableLen;   // 表的长度
    } SSTable;
    
    // 折半查找函数
    int Binary_Search(SSTable L, ElemType key) {
        int low = 0, high = L.TableLen - 1, mid;
        while (low <= high) {
            mid = (low + high) / 2; // 取中间位置
            if (L.elem[mid] == key)
                return mid;
            else if (L.elem[mid] > key)
                high = mid - 1;
            else
                low = mid + 1;
        }
        return -1;
    }
    
    int main() {
        // 初始化测试数据
        SSTable L;
        int arr[] = {1, 3, 5, 7, 9};
        L.elem = arr;
        L.TableLen = sizeof(arr) / sizeof(arr[0]);
    
        // 测试折半查找
        ElemType key = 7;
        int result = Binary_Search(L, key);
        if (result != -1) {
            printf("The element %d is found at index: %d\n", key, result);
        } else {
            printf("The element %d is not in the table\n", key);
        }
    
        return 0;
    }
    

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

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

相关文章

乡村振兴的乡村社会治理创新:创新社会治理模式,提升社会治理能力,构建乡村社会治理新格局,建设和谐美丽乡村

一、引言 乡村振兴是我国现代化进程中的重要战略&#xff0c;而乡村社会治理创新则是乡村振兴的关键环节。随着社会的不断发展和进步&#xff0c;传统的乡村社会治理模式已难以满足当前乡村发展的需要。因此&#xff0c;创新社会治理模式、提升社会治理能力、构建乡村社会治理…

04 贝尔曼最优公式

贝尔曼最优公式 前言1、Motivating examples2、Definition of optimal policy3、Bellman optimality equation(BOE)&#xff1a;Introduction4、 BOE&#xff1a;Maximization on the right-hand side5、BOE&#xff1a;Rewrite as v f(v)6、Contraction mapping theorem7、BO…

最新微信智能电子名片源码 全开源可二开 智能名片系统开发

在数字化日益深入人心的今天&#xff0c;名片已不再是简单的纸质交换工具&#xff0c;而是成为了一个展示个人或企业形象、促进商务交流的重要窗口。分享一款全新的微信智能电子名片系统&#xff0c;源码开源、可二次开发的灵活性&#xff0c;更在功能上进行了全面升级和优化&a…

MySQL软件安装基于压缩包

打开mysql官网网址 MySQL :: Download MySQL Community Server 本次针对版本8的安装包方式进行安装&#xff0c;下载成功后接下来对MySQL进行安装 下载后有一个以zip后缀结尾的压缩包文件 对于安装包方式安装&#xff0c;比起可视化安装省去了许多安装步骤&#xff0c;这里直接…

数据结构的二叉树(c语言版)

一.二叉树的概念 1.二叉树的基本概念 二叉树是一种常见的树状数据结构&#xff0c;它由若干个节点组成&#xff0c;这些节点通过边连接起来。每个节点最多可以有两个子节点&#xff0c;分别称为左子节点和右子节点。 二叉树的特点是每个节点最多有两个子节点&#xff0c;而且…

如何根据列值选择DataFrame中的行?

在Python的数据分析库Pandas中&#xff0c;DataFrame是一种非常强大的数据结构&#xff0c;用于存储和操作表格数据。有时&#xff0c;我们可能需要根据某些列的特定值选择DataFrame中的行。本文将介绍如何使用Pandas进行此类操作&#xff0c;并提供一些实用的示例。 基本原理…

商场学习之微服务

前言 寒假前在新电脑上配置了java环境&#xff0c;maven仓库&#xff0c;node,js&#xff0c;navicat&#xff0c;MySQL&#xff0c;linux&#xff0c;vmware等环境&#xff0c;创建了6个mysql数据库&#xff0c;77张表。 如此多的表&#xff0c;字段&#xff0c;去手写基础…

常用网口操作

目录 网卡闪烁识别 查看光口或者电口 电口查看链接 如何去掉ip地址 网卡闪烁识别 装好系统后&#xff0c;不知道哪个名称对应哪个网卡&#xff0c;可以执行下面的命令。此时物理网卡会一闪一闪&#xff0c;按住ctrc&#xff0c;停止闪烁。这样就不担心找错网卡啦。也不用一…

【计算机网络篇】数据链路层(8)共享式以太网的退避算法和信道利用率

文章目录 &#x1f6f8;共享式以太网的退避算法&#x1f95a;截断二进制指数算法 &#x1f354;共享式以太网的信道利用率 &#x1f6f8;共享式以太网的退避算法 在使用CSMA/CD协议的共享总线以太网中&#xff0c;正在发送帧的站点一边发送帧一边检测碰撞&#xff0c;当检测到…

宝塔面板怎么解决nginx跨域问题

1.找到宝塔的nginx配置文件 宝塔有一点不同&#xff0c;nginx配置文件不在nginx的安装目录中&#xff0c;应当去/www/server/panel/vhost/nginx找到 2.添加你要跨域的地址 location /api {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-…

故障电弧产生的原因以及相关设备介绍-安科瑞 蒋静

1故障电弧的危害 故障电弧是指由于电气线路或设备中绝缘老化破损、电气连接松动、空气潮湿、电压电流急剧升高等原因引起空气击穿所导致的气体游离放电现象。故障电弧发生时&#xff0c;其中心温度可高达3000 ℃左右&#xff0c;并伴随有金属喷溅物&#xff0c;足以引燃任何可…

消息队列——Kafka

1、什么是消息队列&#xff0c;什么是Kafka&#xff1f; 我们通常说的消息队列&#xff0c;简称MQ&#xff08;Message Queue&#xff09;&#xff0c;它其实就指消息中间件&#xff0c;比较流行的开源消息中间件有&#xff1a;Kafka、RabbitMQ、RocketMQ等。今天我们要介绍的…

用balenaEtcher烧录ubuntu的iso文件都失败,所以选用了另一种烧录的软件Rufus,然后烧录成功了+安装ubuntu的坑

https://releases.ubuntu.com/bionic/进入网页下载ubuntu 选择烧录软件将下载的Ubuntu烧录到U盘中 之前用这个U盘烧录过一次&#xff0c;成功了&#xff0c;后来应该是U盘受损或者是什么其他原因使得用这个U盘总是烧录失败 换思路&#xff1a;由于一直使用balenaEtcher烧录ubu…

FileZilla一款免费开源的FTP软件,中文正式版 v3.67.0

01 软件介绍 FileZilla 客户端是一个高效且可信的跨平台应用程序&#xff0c;支持 FTP、 FTPS 和 SFTP 协议&#xff0c;其设计宗旨在于为用户提供一个功能丰富且直观的图形界面。此客户端的核心特性包括一个站点管理器&#xff0c;该管理器能有效地存储和管理用户连接详情及登…

Penpad 品牌升级为Pencils Protocol,提供用户“一鱼多吃”

Penpad是Scroll生态中最大综合平台之一&#xff0c;目前其得到了Scroll官方以及社区的支持&#xff0c;是Scroll包括成就系统、忠诚度积分等系列计划的首批合作伙伴&#xff0c;同时其也得到了OKX Wallet在内的行业伙伴的长期支持。 目前Penpad正在开启生态通证的Launch活动&am…

centos7同步银河麒麟服务器SP系列外网yum源包同步不完整问题

centos7同步银河麒麟服务器SP系列外网yum源包同步不完整问题 一 问题描述二 解决方法三 外网源配置步骤 一 问题描述 Red 7.7 x86架构同步银河麒麟服务器SP arm架构外网源的yum包不完整问题&#xff0c;yum repolist查看源里面有15000左右的包&#xff0c;使用reposync命令同步…

C++新特性-线程

主要内容 thread、condition、mutexatomicfunction、bind使用新特性实现线程池&#xff08;支持可变参数列表&#xff09;异常协程其他 1 C11多线程thread 重点&#xff1a; join和detach的使用场景thread构造函数参数绑定c函数绑定类函数线程封装基础类互斥锁mutexconditi…

鲜活很有感染力的女生图片_活力满满有生命力女生图片

鲜活很有感染力的女生图片_活力满满有生命力女生图片

Vue中CSS动态样式绑定与注意事项

vue中css使用动态变量_vue css变量 动态-CSDN博客 需求&#xff1a; vue使用el-select&#xff0c;下拉选择值时‘输入框’的背景图片就改变为对应所选项的背景图 分析 &#xff1a; 每次下拉选择&#xff0c;值发生变化&#xff0c;背景图与值一一对应绑定&#xff0c;为动态…

nuxt3.0+scrollreveal动画插件实现页面滚动加载动画效果

项目安装 npm install scrollreveal --save 在src下创建plugins文件夹&#xff0c;写入名为scrollreveal.client.ts的文件。 import { defineNuxtPlugin } from "#app"; import scrollReveal from scrollrevealexport default defineNuxtPlugin((nuxtApp) > {l…