邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导

【问题描述】
邓俊辉的《数据结构(C++语言版)(第3版)》(ISBN:9787302330646)中,开始于第48页的“2.6.5 
二分查找(版本A)”内容在第50页详述了“成功查找长度”的递推式,但此递推式乍一看令人费解。故为了说明问题,进行一些约定并详述如下:
● 既然是二分查找,所以给定的序列必定是有序的。
● 不失一般性,约定有序序列的长度
\color{red} n=2^k-1,这样便可构建一个高度为 k 的的二分查找树。
● 设
C(k) 表示高度为 k 的满的二分查找树中所有元素的查找长度总和。此时,问题就可以用递归方法求解。即 k 层的满二叉树,可以转化为左右两个 k-1 层的满二叉树。 依据邓俊辉《数据结构(C++语言版)(第3版)》(ISBN:9787302330646)中“2.6.5 二分查找(版本A)”的算法陈述,可知:
(1)第 k 层的查找长度为2(也即 \color{red} C(1)=2);
(2)且稍加观察会发现左面的 k-1 层的子树所有元素的查找长度都会相对于以第 k-1 层为顶层时的查找长度多1(
左子树共多 \color{red} 2^{k-1}-1)。
(3)同样右面的 k-1 层的子树所有元素的查找长度都会相对于以第 k-1 层为顶层时的查找长度多2(
右子树共多 \color{red} 2\times (2^{k-1}-1))。
所以,根据递归算法的设计思想,需要把这些长度补上,共同构成 C(k)。


综上,可得 C(k) 的递推公式如下:
C(k)=[C(k-1)+(2^{k-1}-1)]+2+[C(k-1)+2\cdot (2^{k-1}-1)]
化简得:\color{red} C(k)=2\cdot C(k-1)+3\cdot 2^{k-1}-1

若令,\color{red} F(k)=C(k)-3k\cdot 2^{k-1}-1
则有:
F(1)=C(1)-3\cdot 1\cdot 2^{1-1}-1=2-3-1=-2 \\ F(k)=C(k)-3k\cdot 2^{k-1}-1=2\cdot C(k-1)+3\cdot 2^{k-1}-1-3k\cdot 2^{k-1}-1 \\ =2\cdot C(k-1)-2\cdot(3k\cdot2^{k-2}-3\cdot 2^{k-2})-2 \\ =2\cdot C(k-1)-2\cdot 3 \cdot (k-1) \cdot 2^{k-2}-2 \\ =2[C(k-1)-3 \cdot (k-1) \cdot 2^{k-2}-1] \\ =2\cdot F(k-1)

故利用上文得出的 \color{red} F(k)=2\cdot F(k-1),可进一步得出:
F(k)=2\cdot F(k-1)=2^2\cdot F(k-2)=2^3\cdot F(k-3)=\cdots \\ =2^{k-1}\cdot F(1)=-2^k

于是将 F(k)=-2^k 代入 F(k)=C(k)-3k\cdot 2^{k-1}-1 可得:
C(k)=F(k)+3k\cdot 2^{k-1}+1 \\ =-2^k+3k\cdot 2^{k-1}+1 \\ =(3k/2-1)\cdot (2^k-1)+3k/2

从而可得平均查找长度为:C(k)/(2^k-1)=3k/2-1+3k/2/(2^k-1)=3k/2-1+O(\varepsilon )
忽略掉低阶项、常数项、系数项,可得本版本的二分查找的平均查找长度的时间复杂度为:\color{red} O(1.5k)
​​​​​​​



【参考文献】
https://ask.csdn.net/questions/699067
https://www.bilibili.com/video/BV1C54y1L7JM/
https://www.bilibili.com/video/BV1C54y1L7JM/?p=76&vd_source=fea4f130ba05b1c873be1db0c639fc56
https://blog.csdn.net/hnjzsyjyj/article/details/133100051
https://blog.csdn.net/qq_33499861/article/details/105103708




 

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

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

相关文章

uniapp 点击事件-防重复点击

uniapp 点击事件-防重复点击 1、common文件并创建anti-shake.js文件 // 防止处理多次点击 function noMoreClicks(methods, info) {// methods是需要点击后需要执行的函数, info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick f…

vue循环滚动字幕

在Vue.js中创建一个循环滚动字幕的效果通常需要使用一些CSS和JavaScript来实现。以下是一个简单的示例,展示如何使用Vue.js创建一个循环滚动字幕的效果: 首先,在HTML中创建一个Vue实例,并添加一个包含滚动字幕的容器元素&#xff…

vue消息订阅与发布

1.知识点 是一种组件间通信的方式,适用于任意组件间通信 2.使用步骤 “消息订阅与发布”可依赖的第三方很多,这里使用pubsub-js库 1.安装pubsub:npm i pubsub-js 2.引入:import pubsub from pubsub-js 3.接收数据:A组件…

【数据结构】排序合集(万字详解)

文章目录 前言插入排序希尔排序选择排序堆排序快速排序hoare原生版本挖坑法前后指针法三数取中优化随机数取key优化三路划分版非递归 归并排序递归非递归调整边界单次归并单次拷贝 总结 前言 排序,以字面意思来说就是通过特定的算法将一组或多组无序或者接近有序的…

02Redis的命令行客户端和桌面客户端的下载和安装

Redis桌面客户端 安装完成Redis服务,我们就可以在Redis的客户端操作Redis的数据库实现数据的CRUD了,客户端分为三类命令行客户端, 图形化桌面客户端,编程客户端 命令行客户端 Redis安装完成后就自带了命令行客户端: redis-cli [options] [commonds] -h选项:指定…

矢量图形编辑软件illustrator 2023 mac软件特点

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软件&am…

计算机网络 实验二 交换机的基本配置

实验二 交换机的基本配置 实验目的 • 掌握交换机的配置方式及切换命令; • 掌握交换机端口的基本配置; • 掌握交换机mac地址的查看与管理方法。 实验设备 以太网交换机一台服务器一台PC机五台配置电缆、网线若干 网络拓扑及IP地址分配 给计算…

题目 1065: 二级C语言-最小绝对值

输入格式 十个数 输出格式 交换后的十个数 样例输入 10 2 30 40 50 60 70 80 90 100 样例输出 10 100 30 40 50 60 70 80 90 2 我对这题用了两个数组,一个存储原来的值,一个是镜像的绝对值。 找最小的数和序号就在镜像里,遍历寻找就行 #i…

Docker部署ActiveMQ消息中间件

1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…

服务器补丁管理软件

随着漏洞的不断上升,服务器修补是增强企业网络安全的典型特征。作为业务关键型机器,计划服务器维护的停机时间无疑是一件麻烦事。但是,借助高效的服务器补丁管理软件(如 Patch Manager Plus),管理员可以利用…

UE5读取json文件

一、下载插件 在工程中启用 二、定义读取外部json文件的函数,参考我之前的文章 ue5读取外部文件_艺菲的博客-CSDN博客 三、读取文件并解析为json对象 这里Load Text就是自己定义的函数,ResourceBundle为一个字符串常量,通常是读取的文件夹…

UML活动图

在UML中,活动图本质上就是流程图,它描述系统的活动、判定点和分支等,因此它对开发人员来说是一种重要工具。 活动图 活动是某件事情正在进行的状态,既可以是现实生活中正在进行的某一项工作,也可以是软件系统中某个类…

[Linux] 1.Linux的简介

Linux是一套免费使用和自由传播的类Unix操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。 Linux发行版:基于Linux内核定制不同风格的Linux ubuntu:嵌入式开发 …

题目 1069: 二级C语言-寻找矩阵最值

输入一个正整数n (1≤ n ≤6),再输入一个n 行n列的矩阵,找出该矩阵中绝对值最大的元素以及它的行下标和列下标。 输入格式 n nxn (矩阵的数据) 输出格式 数 行 列 样例输入 2 1 2 3 4样例输出 4 2 2 二维矩阵的创建cpp代码实现&a…

Linux实验一

#include <stdio.h> #include <stdlib.h> int main() { printf("hello ,\n"); printf("world\n"); // 使用 exit(0) 结束进程 exit(0); } #include <stdio.h> #include <unistd.h> int main() { printf("hello ,\n")…

Ubuntu上通过源码方式安装Redis

上一篇文章Ubuntu上安装、使用Redis的详细教程已经介绍了再Ubuntu操作系统上安装Redis的详细过程&#xff0c;但是因为安装的Redis只有最主要的配置文件和redis-server&#xff0c;为了更深入地学习Redis和进行更复杂的操作&#xff0c;需要安装一个完整的Redis服务。 这篇文章…

day-53 代码随想录算法训练营(19)动态规划 part 14

1143.最长公共子序列&#xff08;坐牢&#xff09; class Solution { public:int longestCommonSubsequence(string text1, string text2) {int ntext1.size(),mtext2.size();vector<vector<int>>dp(n1,vector<int>(m1,0));for(int i1;i<n;i){for(int j1…

SEO方案尝试--Nuxtjs项目基础配置

Nuxtjs 最新版 Nuxt3 项目配置 安装nuxtjs 最新版 Nuxt3 参考官网安装安装插件安装ElementPlus页面怎么跳转&#xff0c;路由怎么实现404页面该怎么配置配置 网页的title 安装nuxtjs 最新版 Nuxt3 参考官网安装 安装插件 安装ElementPlus 安装 Element Plus 和图标库 # 首先&…

Opencv源码解析(2)算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 目录 一&#xff0c;直方图均衡 1&#xff0c;直方图统计 2&#xff0c;灰度变换 3&#xff0c;直方图均衡 二&#xff0c;可分离…

EasyWindow - Android 悬浮窗框架

官网 https://github.com/getActivity/EasyWindow 项目介绍 本框架意在解决一些极端需求&#xff0c;如果是普通的 Toast 封装推荐使用 Toaster 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下&#xff0c;需要在 build.gradle 文件中加入 allprojects {repositories {/…