码农知识堂 - 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




     

  • 相关阅读:
    使用 JDBC 和 MySQL 进行Spring Boot Security 表单身份验证
    大促活动如何抵御大流量 DDoS 攻击?
    Android ViewBinding和DataBinding的几个使用方式 - 上
    【管理运筹学】第 9 章 | 网络计划(2,时间参数的计算 —— 工作的时间参数)
    真人踩过的坑,告诉你避免自动化测试常犯的10个错误
    In-batch negatives Embedding模型介绍与实践
    C# 成为2023年度编程语言之王
    Linux编程基础案例:第3章用户与用户组管理
    JWFD开源工作流-随机函数发生器最新进展
    echarts地图的散点,在时间轴上,为什么点击中国地图的江苏省,中国地图上的散点会散开
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/133132746
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号