QuickSort对递归深度的估计

2024-02-28

递归深度是 QuickSort 达到其基本情况之前连续递归调用的最大数量,并注意它(递归深度)是一个随机变量,因为它取决于所选的主元。

我想要的是估计快速排序的最小可能和最大可能递归深度。

以下过程描述了 QuickSort 通常实现的方式:

QUICKSORT(A,p,r)
    if p<r
        q ← PARTITION(A,p,r)
        QUICKSORT(A,p,q−1)
        QUICKSORT(A,q+1,r)
    return A

PARTITION(A,p,r)
    x←A[r]
    i←p−1
    for j ←p to r−1
        if A[j] ≤ x
            i ← i +1
            exchange A[i] ↔ A[j]
    exchange A[i +1] ↔ A[r]
    return i +1

QuickSort 中的第二次递归调用并不是真正必要的;可以通过使用迭代控制结构来避免这种情况。这种技术也称为尾递归,其实现方式如下:

QUICKSORT_tail(A,p,r)
    while p<r
        q ← PARTITION(A,p,r)
        QUICKSORT(A,p,q−1)
        p ← q+1
    return A

在此版本中,最近一次调用的信息位于堆栈顶部,初始调用的信息位于堆栈底部。当一个过程被调用时,它的信息被压入堆栈;当它终止时,它的信息被弹出。由于我假设数组参数由指针表示,因此堆栈上每个过程调用的信息都需要 O(1) 堆栈空间。我还相信这个版本的最大可能堆栈空间应该是 θ(n)。

那么,说了这么多,我如何估计每个 QuickSort 版本的最小可能和最大可能递归深度?我的上述推论正确吗?

提前致谢。


最坏的情况下

当分区例程产生一个包含 n -1 个元素的子问题和一个包含 0 个元素的子问题时,就会发生快速排序的最坏情况。分区花费 θ(n) 时间。如果分区在算法的每个递归级别上都最大程度地不平衡,则树的深度为 n,最坏情况为 θ(n),快速排序的最坏情况行为为 θ(n^2),如您所见最坏情况下相应递归树最后一层的值是θ(n)。

最好的情况

在最均匀的划分中,PARTITION 产生两个子问题,每个子问题 大小不超过n=2,因为一个的大小为floor(n/2),另一个的大小为floor(n/2) -1。在这种情况下,快速排序运行得更快。这种情况下的递归树就是所谓的完全二叉树,它可以有 1 到 2h 个节点,尽可能左边,在最后一层 h,则 h = log n,那么快速排序的最佳情况行为为 θ(nlog n),如您所见,最佳情况下相应递归树的最后一级的编号为 θ(log n)。

结论

最小值:θ(log(n))

最大值:θ(n)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QuickSort对递归深度的估计 的相关文章

  • 如何找到最长的回文子序列(不是它的长度)

    我想找出字符串中最长的回文子序列 我到处都找到了找出子序列长度的算法 并声明该算法也可以扩展以返回子序列 但我没有找到如何实现的 有人能解释一下我怎样才能得到序列吗 既然你提到了链接最长回文子序列 http www geeksforgeek
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 稀疏矩阵中的最大和子矩形

    求一个子矩形中的最大和NxN矩阵可以完成O n 3 正如其他帖子中指出的 使用 2 d kadane 算法的时间 然而 如果矩阵是稀疏的 具体来说O n 非零条目 可以O n 3 时间被打败了吗 如果有帮助的话 对于我感兴趣的当前应用程序
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 使用快速排序查找数组中第 k 个最小的项 => 预期运行时间?

    如果我使用快速排序的修改版本来查找数组中第 k 个最小的项目 为什么预期运行时间是 O n 如 Programming Pearls 一书中所述 我正在使用的算法执行以下操作 1 Runs quick sort on the array 2
  • 如何从二叉搜索树中均匀随机地返回节点?

    给定一个 BST 可能平衡也可能不平衡 如何能够均匀地随机返回 任何 节点 一个限制是您不能使用外部索引数据结构 您必须以每个节点都有平等被访问的机会的方式遍历树 这个问题让我困惑了好一阵子 如果我们确实可以使用外部哈希表 指针 我们可以对
  • 使用reduce方法的斐波那契数列

    于是 我看到有人用reduce方法来计算斐波那契数列 这是他的想法 1 0 1 1 2 1 3 2 5 3 对应于 1 1 2 3 5 8 13 21 代码如下所示 def fib reduce n initial 1 0 dummy ra
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何求解:T(n) = T(n - 1) + n

    我已经解决了以下问题 T n T n 1 n O n 2 现在 当我解决这个问题时 我发现界限非常松散 我是否做错了什么 或者只是这样 您还需要一个递归关系的基本情况 T 1 c T n T n 1 n 为了解决这个问题 您可以首先猜测一个
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • Java中的递归排列生成错误结果

    问题是生成字典排列 起初 我的代码是这样的 public class Problem24 public static void main String args permutation 123 public static void perm
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • php 删除特定文件夹及其所有内容

    我正在使用 php 删除包含已删除帖子图像的文件夹 我正在使用下面的代码 这是我在网上找到的并且做得很好 我想知道当一个文件夹中有其他文件夹时 如何只删除其中的特定文件夹 当我使用下面的代码时 如何才能做到这一点 使用 dev images

随机推荐

  • org-mode取消\hypersetup后有什么影响?

    我用自己的序言在 org 模式下制作 pdf 但生成的 PDF 或 tex 文件始终显示以下信息 format hypersetup n pdfkeywords s n pdfsubject s n pdfcreator s n org e
  • 如何创建具有延迟的可观察对象

    Question 出于测试目的 我正在创建Observable替换实际 http 调用返回的可观察对象的对象Http 我的可观察对象是使用以下代码创建的 fakeObservable Observable create obs gt obs
  • 什么是 gitlab runner

    我想我从根本上错过了一些东西 我是 CI CD 新手 正在尝试使用 gitlab 建立我的第一个管道 该项目是一个预先存在的 PHP 项目 我还不想清理它 目前我已经将整个东西推入了 docker 容器 并且它与谷歌云的 mysql 数据库
  • 模拟跨上下文连接--LINQ/C#

    问题是这样的 我有 2 个数据上下文 我想对其进行联接 现在我知道 LINQ 不允许从一个上下文连接到另一个上下文 并且我知道有 2 种可能的解决方案是创建单个数据上下文或有 2 个单独的查询 这就是我现在正在做的事情 然而我想做的是 模拟
  • 如何管理 git 中的重叠存储库,包括同一目录中的文件?

    我有一个复杂的存储库 有时代码段之间的逻辑边界跨越目录边界 有时目录 X 中的单个文件确实需要与目录 Y 中的文件一起使用 例如 假设我有一个如下所示的中央存储库 a foo a bar b baz1 b baz2 我希望我的本地存储库最终
  • 如何通过 Curl 和 PHP 发送 SOAP XML?

    这已经困扰我好几天了 我正在尝试通过 Curl 发送 SOAP 帖子 但我总是收到 无法连接到主机 错误 但是 我真的不知道如何解决 我有一个 ASP 版本 它可以在相同的 URL 和数据下正常工作 我认为这只是 PHP Curl 的事情
  • AWS Lambda Python 3.7 运行时异常日志记录

    使用 Python 3 7 运行时时引发的未处理异常似乎不会像在 Python 3 6 中那样记录到 CloudWatch 如何在 Python 3 7 中设置记录器来捕获此信息 还发布在 AWS 论坛上 https forums aws
  • pytorch index_put_给出运行时错误:“索引”的导数未实现

    这是后续问题这个问题 https stackoverflow com q 65584330 3337089 我尝试使用index put 如建议的答案 https stackoverflow com a 65584479 3337089 但
  • 当有很多要发送的值时,将值传递给函数的最佳方法是什么?

    当您必须将许多值传递给函数并且其中一些值可能是可选的时 定义方法签名的最佳方法是什么 将来 我可能必须传递更多变量或减去一些传递给函数的值 例如 电话和地址可选 function addInfo name dob phone address
  • 针对 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐

    我正在尝试将 android 目标 API 从 29 更新到 30 我已更新 compileSdkVersion 30 targetSdkVersion 30 buildToolsVersion 30 0 2 该应用程序与zipalign
  • cocoa 应用程序中提示 root 访问权限

    我希望我的程序以要求 root 访问权限的提示 警报开始 用户必须输入密码 然后应用程序就会启动 我一直在环顾四周 但我不太确定该怎么做 非常感谢您的帮助 Thanks 这是苹果公司关于此事的文档 http developer apple
  • 如何消除TPaintBox右边缘的闪烁(例如调整大小时)

    总结 假设我有一个 TForm 和两个面板 面板对齐 alTop 和 alClient alClient面板包含一个TPaintBox 其OnPaint涉及绘图代码 组件上 DoubleBuffered 的默认值为 false 在绘制过程中
  • 为什么 Icon Composer 2.4 不再支持 1024x1024 尺寸的图标?

    Xcode 4 3 3中的图标编辑器2 2支持1024x1024的icns 然而 对于 Icon Composer 2 4 它不再支持这一点 这很讽刺 因为苹果推动了视网膜显示屏mbp 并要求新提交的应用程序使用1024x1024图标 但图
  • Android 手风琴/手风琴/折叠动画

    我正在尝试创建一个交互式手风琴 手风琴 折叠动画 以便视图在交互时自行折叠 展开 以同样的方式折叠视图 但两侧都折叠 我认为我可以做到的方法是重写 onDraw 方法 以某种方式复制画布或画布上的信息 然后绘制以一种方式旋转的画布的前半部分
  • 不支持表/列名称中的方括号?

    postgresql 是否不支持表名 列名或数据类型中的方括号 在 pgadmin 中运行查询时出现以下错误 CREATE TABLE Test ERROR syntax error at or near SQL状态 42601 在 Pos
  • 模板继承的 UML 图

    在我的库的文件中 我有一个继承自模板的类 我的代码示例 class data class dataA public data class dataB public data inheritance from a template templ
  • 获取 div 中锚点的 href 并将其应用到图像?

    我有一个 div 其中有图像和链接 是否有可能在页面加载时 我可以以某种方式找到链接的 href 并应用图像的锚标记 我知道这似乎是一个奇怪的请求 我只是问是否可以做到 如果可以 怎么做 http jsfiddle net fFgwb ht
  • R 中 beanplot 上的多种颜色

    我使用以下命令在 R 中创建了豆图 beanplot windA side both border NA col list gray c red white ylab Wind Speed m s what c 1 1 1 0 xaxt n
  • 无法在 Nginx 服务器中使用 LetsEncrypt 设置 HTTPS

    我按照以下教程在 DigitalOcean 上为我的网站设置 https https www digitalocean com community tutorials how to deploy a laravel application
  • QuickSort对递归深度的估计

    递归深度是 QuickSort 达到其基本情况之前连续递归调用的最大数量 并注意它 递归深度 是一个随机变量 因为它取决于所选的主元 我想要的是估计快速排序的最小可能和最大可能递归深度 以下过程描述了 QuickSort 通常实现的方式 Q