码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 邓俊辉《数据结构》→ “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




     

  • 相关阅读:
    HttpServlet源码分析及HttpServletRequest接口
    前缀++与后缀++
    【C++】unordered_map与unorder_set的封装(哈希桶)
    notepad++堆缓冲区溢出漏洞CVE-2023-40031分析与复现
    如何安装 Elasticsearch
    电脑壁纸怎么设置?简单3步,让你的电脑桌面变得更合心意
    Web Worker实现前端的“多线程”
    SpringBoot实现集成Mybatis-Plus和SwaggerUI——基于SpringBoot和Vue的后台管理系统项目系列博客(八)
    安全协议内涵
    目标检测YOLO实战应用案例100讲-基于YOLOv5的船舶检测(续)
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/133132746
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号