折半查找的平均查找长度公式推导

看严蔚敏版《数据结构》写出了折半查找的平均查找长度公式(如下图),但没有具体推导过程

所以我自己推导了一遍,用这篇文章把思路写下来

假设折半查找判定树为满二叉树,结点数 n n n,高度 h h h

由满二叉树的性质可知 n = 2 h − 1 n=2^{h}-1 n=2h1,移项得 2 h = n + 1 , 2^{h}=n+1, 2h=n+1取对数得高度 h = l o g 2 ( n + 1 ) h=log_{2}{(n+1)} h=log2(n+1)

根据满二叉树的性质,第1层有 2 1 − 1 = 1 2^{1-1}=1 211=1个结点(根节点),第2层有 2 2 − 1 = 2 2^{2-1}=2 221=2个结点,第3层有 2 3 − 1 = 4 2^{3-1}=4 231=4个结点 …… 第h层有 2 h − 1 2^{h-1} 2h1个结点

先假设查找各结点是等概率的,那么计算平均查找长度其实上就是计算总比较次数,然后乘以概率

因为折半查找判定树查找成功的过程刚好是从根节点到被查结点的路径

所以折半查找判定树中 结点的比较次数 = 结点所在层数 结点的比较次数=结点所在层数 结点的比较次数=结点所在层数

既然 结点的比较次数 = 结点所在层数 结点的比较次数=结点所在层数 结点的比较次数=结点所在层数,那么一层中所有结点的比较次数都相等(等于层数),所以可以逐层计算并相加得出 总比较次数

第1层,有 2 1 − 1 = 1 2^{1-1}=1 211=1个结点。所以第1层的比较次数=层数 × \times ×该层结点个数= 1 × 2 1 − 1 1 \times 2^{1-1} 1×211

第2层,有 2 2 − 1 = 2 2^{2-1}=2 221=2个结点。所以第2层的比较次数=层数 × \times ×该层结点个数= 2 × 2 2 − 1 2 \times 2^{2-1} 2×221

第3层,有 2 3 − 1 = 4 2^{3-1}=4 231=4个结点。所以第3层的比较次数=层数 × \times ×该层结点个数= 3 × 2 3 − 1 3 \times 2^{3-1} 3×231

……

第h层,有 2 h − 1 2^{h-1} 2h1个结点。所以第h层的比较次数=层数 × \times ×该层结点个数= h × 2 h − 1 h \times 2^{h-1} h×2h1

将所有层的比较次数相加可得,总比较次数= 1 × 2 1 − 1 + 2 × 2 2 − 1 + 3 × 2 3 − 1 + … … + h × 2 h − 1 {\color{Black} 1 \times 2^{1-1}+2 \times 2^{2-1}+3 \times 2^{3-1}+……+h \times 2^{h-1}} 1×211+2×221+3×231+……+h×2h1,可写为累加式 ∑ j = 1 h j ⋅ 2 j − 1 {\color{Black} \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1}} j=1hj2j1

因为等概率且有 n n n个结点,所以概率就是 n n n的倒数= 1 n {\Large{\color{Black} \frac{1}{n}}} n1

所以平均查找长度=概率 × \times ×总比较次数= 1 n ∑ j = 1 h j ⋅ 2 j − 1 {\color{Black} {\Large \frac{1}{n}} \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1}} n1j=1hj2j1

再看《数据结构》给出的公式,平均查找长度 A S L = ∑ i = 1 n p i ⋅ c i {\color{Black} ASL=\displaystyle \sum_{i=1}^{n}p_{i}\cdot c_{i}} ASL=i=1npici

这个累加式是按每个结点来计算,从1到 n n n个结点,用结点的概率 × \times × 该结点的比较次数,但缺点是不方便计算

所以前面的推导其实是转换思路,改为按每层计算,两种计算方式都会把结点过一遍,二者是等价的

A S L = ∑ i = 1 n p i ⋅ c i = 1 n ∑ j = 1 h j ⋅ 2 j − 1 {\color{Black} ASL=\displaystyle \sum_{i=1}^{n}p_{i}\cdot c_{i}=\frac{1}{n} \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1}} ASL=i=1npici=n1j=1hj2j1

现在重点就转到如何计算总比较次数 ∑ j = 1 h j ⋅ 2 j − 1 \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1} j=1hj2j1

其实这就是高中数学的复合数列 { h ⋅ 2 h − 1 } \{h \cdot 2^{h-1}\} {h2h1}求和

前面是首项为1,公差为1的等差数列,乘以后面首项为1,公比为2的等比数列

* 等比数列求和公式 S n = a 1 ( 1 − q n ) 1 − q {\color{Black} S_{n}=\frac{a_{1}(1-q^{n})}{1-q}} Sn=1qa1(1qn)

复合数列求和的计算思路与等比数列相同(乘公比,错位相减)

S h = 1 × 2 1 − 1 + 2 × 2 2 − 1 + 3 × 2 3 − 1 + … … + h × 2 h − 1 2 S h = 1 × 2 2 − 1 + 2 × 2 3 − 1 + … … + ( h − 1 ) × 2 h − 1 + h × 2 h 2 S h − S h = ( − 1 ) × 2 1 − 1 + ( 1 − 2 ) × 2 2 − 1 + ( 2 − 3 ) × 2 3 − 1 + … … + ( h − 1 − h ) × 2 h − 1 + h × 2 h = ( − 1 ) × 2 0 + ( − 1 ) × 2 1 + ( − 1 ) × 2 2 + … … + ( − 1 ) × 2 h − 1 + h × 2 h = ( − 1 ) × ( 2 0 + 2 1 + 2 2 + … … + 2 h − 1 ) + h × 2 h = ( − 1 ) × 2 0 ( 1 − 2 h ) 1 − 2 + h × 2 h = ( − 1 ) × 1 ⋅ ( 1 − 2 h ) − 1 + h × 2 h = 1 − 2 h + h × 2 h = 1 + ( − 1 + h ) × 2 h S h = ( h − 1 ) 2 h + 1 {\color{Black} \begin{align*}S_{h}&=1 \times 2^{1-1}+2 \times 2^{2-1}+3 \times 2^{3-1}+……+h \times 2^{h-1} \\2S_{h}&=\qquad \qquad \; \; \; 1 \times 2^{2-1}+2 \times 2^{3-1}+……+(h-1) \times 2^{h-1}+h\times 2^{h} \\\\2S_{h}-S_{h} &=(-1) \times 2^{1-1}+(1-2)\times 2^{2-1}+(2-3)\times 2^{3-1}+……+(h-1-h)\times 2^{h-1}+h\times 2^{h}\\&= (-1) \times 2^{0}+(-1) \times 2^{1}+(-1) \times 2^{2}+……+(-1)\times 2^{h-1}+h\times 2^{h}\\ &=(-1)\times(2^{0}+2^{1}+2^{2}+……+2^{h-1})+h\times 2^{h} \\ &=(-1)\times \frac{2^{0}(1-2^{h})}{1-2}+h\times 2^{h} \\ &= (-1)\times \frac{1\cdot (1-2^{h})}{-1}+h\times 2^{h} \\ &=1-2^{h}+h\times 2^{h} \\ &=1+(-1+h)\times 2^{h}\\ S_{h}&=(h-1)2^{h}+1 \end{align*}} Sh2Sh2ShShSh=1×211+2×221+3×231+……+h×2h1=1×221+2×231+……+(h1)×2h1+h×2h=(1)×211+(12)×221+(23)×231+……+(h1h)×2h1+h×2h=(1)×20+(1)×21+(1)×22+……+(1)×2h1+h×2h=(1)×(20+21+22+……+2h1)+h×2h=(1)×1220(12h)+h×2h=(1)×11(12h)+h×2h=12h+h×2h=1+(1+h)×2h=(h1)2h+1

所以得出总比较次数 S h = ( h − 1 ) 2 h + 1 S_{h}=(h-1)2^{h}+1 Sh=(h1)2h+1

但是题目一般给出的是结点数 n n n,并不会给高度 h h h,所以还需要把 h h h替换掉

本文最前面已经得出 h = l o g 2 ( n + 1 ) h=log_{2}{(n+1)} h=log2(n+1),所以可以用这个表达式替换 h h h

* 解释一下如何替换,根据对数定义 a l o g a b = b a^{log_{a}{b}}=b alogab=b,所以 2 l o g 2 ( n + 1 ) = n + 1 2^{log_{2}{(n+1)}}=n+1 2log2(n+1)=n+1

S h = ( h − 1 ) 2 h + 1 = [ l o g 2 ( n + 1 ) − 1 ] 2 l o g 2 ( n + 1 ) + 1 = [ l o g 2 ( n + 1 ) − 1 ] ( n + 1 ) + 1 = ( n + 1 ) l o g 2 ( n + 1 ) − ( n + 1 ) + 1 = ( n + 1 ) l o g 2 ( n + 1 ) − n − 1 + 1 = ( n + 1 ) l o g 2 ( n + 1 ) − n {\color{Black} \begin{align*} S_{h}&=(h-1)2^{h}+1\\ &={\Large[}log_{2}{(n+1)}-1{\Large]}2^{log_{2}{(n+1)}}+1 \\ &={\Large[}log_{2}{(n+1)}-1{\Large]}(n+1)+1\\ &=(n+1)log_{2}{(n+1)}-(n+1)+1\\ &=(n+1)log_{2}{(n+1)}-n-1+1\\ &=(n+1)log_{2}{(n+1)}-n \end{align*}} Sh=(h1)2h+1=[log2(n+1)1]2log2(n+1)+1=[log2(n+1)1](n+1)+1=(n+1)log2(n+1)(n+1)+1=(n+1)log2(n+1)n1+1=(n+1)log2(n+1)n

所以总比较次数 ∑ j = 1 h j ⋅ 2 j − 1 = ( h − 1 ) 2 h + 1 = ( n + 1 ) l o g 2 ( n + 1 ) − n {\color{Black} \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1}=(h-1)2^{h}+1=(n+1)log_{2}{(n+1)}-n} j=1hj2j1=(h1)2h+1=(n+1)log2(n+1)n

所以平均查找长度=概率 × \times ×总比较次数 A S L = ∑ i = 1 n p i ⋅ c i = 1 n ∑ j = 1 h j ⋅ 2 j − 1 = 1 n [ ( n + 1 ) l o g 2 ( n + 1 ) − n ] = n + 1 n l o g 2 ( n + 1 ) − n n = n + 1 n l o g 2 ( n + 1 ) − 1 {\color{Black} \begin{align*} ASL=\displaystyle \sum_{i=1}^{n}p_{i}\cdot c_{i}=\frac{1}{n} \displaystyle \sum_{j=1}^{h} j\cdot 2^{j-1} &=\frac{1}{n}{\Large[}(n+1)log_{2}{(n+1)}-n{\Large]} \\ &=\frac{n+1}{n}log_{2}{(n+1)}-\frac{n}{n}\\ &=\frac{n+1}{n}log_{2}{(n+1)} -1\end{align*}} ASL=i=1npici=n1j=1hj2j1=n1[(n+1)log2(n+1)n]=nn+1log2(n+1)nn=nn+1log2(n+1)1

折半查找的平均查找长度 A S L = n + 1 n l o g 2 ( n + 1 ) − 1 {\color{Black} ASL= {\Large \frac{n+1}{n}}log_{2}{(n+1)}- 1 } ASL=nn+1log2(n+1)1

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

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

相关文章

C/S医学影像PACS系统源码主要应用是什么?

C/S医学影像PACS系统源码主要应用是什么? 一套基于VC MSSQL开发的PACS系统源代码,医学影像PACS系统,全称为Picture Archiving and Communication Systems,即医学影像归档和通信系统。它是应用在医院影像科室的系统,主…

网络:HTTP协议

目录 序列化与反序列化 守护进程 网络计算器的实现 HTTP协议 http的代码演示 HTTPS 初步理解三次握手,四次挥手 ①tcp是面向连接的通信协议,在通信之前,需要进行3次握手,来进行连接的建立(谁connect谁握手) ②当tcp在断开…

昇腾训练执行与推理部署系列 入门: 1.开启异腾AI之旅

一、1认识CANN 1、昇腾AI基础软硬件平台介绍2、CANN逻辑架构介绍 1、昇腾AI基础软硬件平台介绍 2、CANN逻辑架构介绍

Linux_进程信号_7

文章目录 1.什么是信号2.信号列表3.信号处理常见方式4.信号的存储5.信号产生前-中-后1.信号产生前2.信号产生中 6产生信号1.signal2.kill3.raise4.abort5.alarm6.硬件异常 7.core dump8.信号产生中1. sigset_t(数据类型)2.信号集操作函数1.sigprocmask2.…

书生浦语训练营2期-第二节课笔记作业

目录 一、前置准备 1.1 电脑操作系统:windows 11 1.2 前置服务安装(避免访问127.0.0.1被拒绝) 1.2.1 iis安装并重启 1.2.2 openssh安装 1.2.3 openssh服务更改为自动模式 1.2.4 书生浦语平台 ssh配置 1.3 补充(前置服务ok…

八数码(bfs做法)非常详细,适合新手服用

题目描述: 在一个 33 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如: 1 2 3 x 4 6 7 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。 我…

注解(Annotation)

文章目录 1 注解概述1.1 什么是注解1.2 注解与注释1.3 注解的重要性 2 常见的Annotation作用3 三个最基本的注解3.1 Override3.2 Deprecated3.3 SuppressWarnings 4 元注解5 自定义注解的使用5.1 声明自定义注解5.2 使用自定义注解5.3 读取和处理自定义注解 6 JUnit单元测试6.1…

【图论】【基环内向树】【广度优先】【深度优先】2127. 参加会议的最多员工数

作者推荐 视频算法专题 本文涉及知识点 图论 基环内向树 LeetCode2127. 参加会议的最多员工数 一个公司准备组织一场会议,邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。每位员工都有一位…

设计模式——工厂模式01

工厂模式 定义:工厂模式是创建子类实例化对象的一种方式,屏蔽了创造工厂的内部细节。把创建对象与使用对象进行拆分,满足单一职责。如果需要向工厂中添加新商品, 只需要扩展子类再重写其工厂方法,满足开闭原则。 设计…

【科研笔记】知识星球不可选择内容爬虫

知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…

LeetCode-207. 课程表【深度优先搜索 广度优先搜索 图 拓扑排序】

LeetCode-207. 课程表【深度优先搜索 广度优先搜索 图 拓扑排序】 题目描述:解题思路一:拓扑排序,检查图是否有环。有环代表不能完成,返回False。解题思路二:深度优先遍历解题思路三:广度优先搜索&#xff…

Pillow教程10:设计博文的文字背景封面图,再也不担心找不到不素材了

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…