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

2023-09-22 09:23:07

【问题描述】
邓俊辉的《数据结构(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




 

更多推荐

触摸芯片在小功率音箱中的应用

音箱的基本组成部分包括扬声器单元和放大器。扬声器单元是产生声音的核心部件,而放大器则负责放大电信号,使其能够驱动扬声器单元。当我们使用音箱播放音乐时,音频信号首先通过音源设备(如音乐播放器、电视、电脑等)发送到音箱。这个音频信号是以电信号的形式存在的,无法直接被我们听到。喇叭的音质完全取决于喇叭本身的好坏,而不是功率,

关于header in Cpp

ctype.h是一个headerinCpp,什么是header?在C++中,头文件(headerfile)是一种用于包含预定义函数、变量和声明的文件。头文件通常具有.h扩展名,并包含了用于在C++程序中使用的函数原型、常量定义、类声明等信息。头文件的主要目的是为了在不同的源代码文件之间共享代码和声明,以便在程序中能够正

uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台

uvm白皮书练习ch221dut.sv这个DUT的功能非常简单,通过rxd接收数据,再通过txd发送出去。其中rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。moduledut(clk,rst_n,rxd,rx_dv,txd,tx_en);inputclk;inputrst_n;inputrxd;inp

nginx入门

文章目录nginx1.安装2.nginx常用命令及配置文件3.配置静态网页listenserver_namelocation4.HTTP反向代理设置代理请求headers5.负载均衡负载均衡策略1.轮循机制(round-robin)2.最小连接(least-connected)3.ip-hashnginx1.安装Cen

多平台兼容性:跑腿系统开发的移动端和Web端技术选项

随着移动设备和Web浏览器的广泛使用,跑腿系统的开发需要考虑多平台兼容性。本文将讨论一些在开发跑腿系统的移动端和Web端时可用的技术选项,并提供示例代码以帮助您入门。移动端技术选项:1.ReactNativeReactNative是一个流行的移动应用开发框架,可以使用JavaScript和React构建原生级别的移动应

CFCA企业版通配符SSL证书

CFCA是中国CFCA企业版通配符SSL证书金融认证中心的缩写,即ChinaFinancialCertificationAuthority。它是一家经过中国人民银行和国家信息安全机构批准成立的国家级权威安全认证机构,也是国际CA浏览器联盟组织(CA/BrowserForum)的成员,遵循全球统一鉴证标准。CFCA证书是

数据结构——红黑树

红黑树(Red-BlackTree)是一种自平衡的二叉查找树,它确保在插入和删除等基本操作后,树保持平衡,从而提供了快速的查找、插入和删除操作。红黑树之所以称为"红黑树",是因为每个节点都具有一个颜色属性,可以是红色或黑色,它们必须满足一些规则以保持树的平衡性。性质:1.树中的任何一个结点都带有颜色,每个结点的颜色要么

leetcode1537. 最大得分(动态规划-java)

最大得分题目描述动态规划代码演示题目描述难度-困难leetcode1537.最大得分你有两个有序且数组内元素互不相同的数组nums1和nums2。一条合法路径定义如下:选择数组nums1或者nums2开始遍历(从下标0处开始)。从左到右遍历当前数组。如果你遇到了nums1和nums2中都存在的值,那么你可以切换路径到另

长沙专业消费者调查公司:为你的市场决策提供强大支持

在当今竞争激烈的市场环境中,准确把握消费者需求是取得成功的关键。群狼调研(长沙口味测试)作为长沙专业消费者调查公司,以其专业的市场研究能力和丰富的行业经验,为众多企业提供高质量的消费者调查服务,帮助它们精准定位目标消费者,优化营销策略。群狼调研(长沙品牌传播效果测评)自成立以来,一直致力于打造一个集市场调查、数据分析、

嵌入式-C语言关系运算符

目录一.简介一.简介C语言关系运算符是用来比较两个值之间的关系并返回一个布尔值(真或假)的运算符。以下是C语言中常用的关系运算符:1.等于(==):检查两个值是否相等,如果相等则返回真(1),否则返回假(0)。例如10==5为false(0),2==2为true(1)2.不等于(!=):检查两个值是否不相等,如果不相等

UDP 的报文结构

1.UDP特点2.UDP协议报文结构1.UDP特点UDP特点分为:无连接:知道对端的IP和端口号就可以进行传输,即通信时不需要创建连接(发送数据结束时也没有连接可以释放)所以减小了开销和发送数据前的时延;比如:微信,微信发送信息时,不需要建立连接,可以直接发送信息;有连接就类似于打电话,必须对方接听了你的电话,才能进行

热文推荐