伪快速排序时间复杂度

2024-02-23

我知道快速排序有O(n log n)平均时间复杂度。经常用于演示函数式语言的简洁性的伪快速排序(仅当您从足够远的地方看时,具有适当高的抽象级别时,它才是快速排序)如下(在 Haskell 中给出):

quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = quicksort [y | y<-xs, y<p] ++ [p] ++ quicksort [y | y<-xs, y>=p]

好吧,我知道这件事有问题。最大的问题是它没有就地排序,这通常是快速排序的一大优势。即使这并不重要,它仍然比典型的快速排序需要更长的时间,因为它在对列表进行分区时必须对列表进行两次遍历,并且之后会执行昂贵的追加操作以将其拼接在一起。此外,选择第一个元素作为枢轴并不是最佳选择。

But 即使考虑到所有这些, 不是平均值time此快速排序的复杂度与标准快速排序相同吗?即,O(n log n)?因为追加和分区仍然具有线性时间复杂度,即使它们效率低下。


这种“快速排序”实际上是森林砍伐的树排序:http://www.reddit.com/r/programming/comments/2h0j2/real_quicksort_in_haskell http://www.reddit.com/r/programming/comments/2h0j2/real_quicksort_in_haskell

data Tree a = Leaf | Node a (Tree a) (Tree a)

mkTree [] = Leaf
mkTree (x:xs) = Node x (mkTree (filter (<= x) xs)) (mkTree (filter (x <) xs))

二叉树是不平衡的,因此构建搜索树的最坏情况复杂度为 O(N^2),平均情况复杂度为 O(N*Log N)。

foldTree f g Leaf = g
foldTree f g (Node x l r) = f x (foldTree f g l) (foldTree f g r)

treeSort l = foldTree (\x lft rht -> lft++[x]++rht) [] (mkTree l)

检索算法的最坏情况复杂度为 O(N^2),平均情况复杂度为 O(N*Log N)。

平衡良好:

Prelude> let rnds = iterate step where step x = (75*x) `mod` 65537
Prelude> length . quicksort . take 4000 . rnds $ 1
4000
(0.08 secs, 10859016 bytes)
Prelude> length . quicksort . take 8000 . rnds $ 1
8000
(0.12 secs, 21183208 bytes)
Prelude> length . quicksort . take 16000 . rnds $ 1
16000
(0.25 secs, 42322744 bytes)

不太平衡:

Prelude> length . quicksort . map (`mod` 10) $ [1..4000]
4000
(0.62 secs, 65024528 bytes)
Prelude> length . quicksort . map (`mod` 10) $ [1..8000]
8000
(2.45 secs, 241906856 bytes)
Prelude> length . quicksort . map (`mod` 10) $ [1..16000]
16000
(9.52 secs, 941667704 bytes)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

伪快速排序时间复杂度 的相关文章

  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 表达式“ap zip tail”如何工作

    我想知道怎么写f x zip x tail x 点免费 所以我使用了pointfree程序 结果是f ap zip tail ap作为 Control Monad 的函数 我不明白点自由定义是如何工作的 如果我能从类型的角度去理解的话 希望
  • Haskell 中的常量变量声明

    要声明常量变量 我可以在 Ruby 中执行以下操作 class COLOR RED 10 BLUE 20 GREEM 30 end COLOR RED回报10 COLOR BLUE回报20 等等 我如何在 Haskell 中实现这一点 我想
  • JavaScript switch 语句是线性的还是恒定时间的?

    我的网站上有以下 JavaScript 以便在执行某些特定搜索时 答案会被硬编码到特定页面 function redirect var input document getElementById searchBox value toLowe
  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • Haskell 中的相互递归求值器

    Update 我已经添加一个答案 https stackoverflow com questions 3524485 mutually recursive evaluator in haskell 4504200 4504200这描述了我的
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • 嵌套在其他 monad 中的 IO 操作未执行

    我有一个 foobar IO ParseResult String String ParseResult 是一个在这里定义的 monad https hackage haskell org package haskell src exts
  • 有什么方法可以在 do / while / let 块中打印出变量的类型吗?

    有没有办法打印出嵌套变量的推断类型ghci 考虑代码 let f g where g x Int x 那么 最好查询一下类型g e g t f g会打印出Int gt Int 您可以通过给出适当的错误类型注释并检查错误消息来诱骗此信息 Ma
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • 如何处理或避免BlockedIndefinitelyOnSTM异常?

    我花了很多时间来解决我正在处理的应用程序中遇到的问题 该应用程序是一个 Web 应用程序 使用 scotty 公开 REST 端点 它使用一个TVar保持其更新的状态STM a由前端层触发的动作 由于该应用程序基于事件溯源原则 因此业务层生
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • Haskell cabal:我刚刚安装了软件包,但现在找不到软件包

    在这里 http haskell org haskellwiki Cabal Install I just installed packages 2C but now the packages are not found这是我可以找到我正在
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n

随机推荐

  • apache 如何知道 SAML 响应已通过身份验证

    我是 Apache 和 SAML 的新手 我的 my app httpd conf 文件中有以下配置 它将未经身份验证的请求重定向到正常工作的 OKTA
  • 为什么此查询会在 Oracle 中产生 MERGE JOIN CARTESIAN?

    这是我的查询 select count from email prod junc j inner join trckd prod t5 on j trckd prod sk t5 trckd prod sk inner join prod
  • 如何在 Xamarin.Forms 中的网格中启用边框

    我正在 Xamarin Forms 中构建网格 我想添加像表格一样的边框 我以为可以在定义行和列时添加边框 但失败了 谁能帮我 这是我当前的代码 Grid grid new Grid VerticalOptions LayoutOption
  • 如何在 C# 中使用 FILE_ATTRIBUTE_TEMPORARY 创建文件?

    如何在 C 中使用 FILE ATTRIBUTE TEMPORARY 创建文件 所以将数据存储在Ram中但能够将其用作普通文件 我相信你必须使用 P Invoke 来调用本机CreateFile然后使用文件流 安全文件句柄 文件访问 htt
  • SQL Server 返回意外的周数

    我的表中有一些订单 2011 年的最后订单日期是 12 月 20 日 我使用 sql 命令来计算给定一周内的订单数 SELECT CONVERT VARCHAR 3 DATENAME week convert datetime order
  • ASP.NET 如何知道在回发期间触发哪个事件?

    在回发期间 EVENTTARGET表单变量保存name of the control发出回发 如果控件支持多个服务器端事件 ASP NET 如何知道要为该控件触发哪个事件 正如 Wiktor 提到的 ASP Net 中的许多控件已经为您以某
  • Inno Setup - 如何本地化组件和类型名称?

    如何本地化组件和类型名称 例如 Languages Name eng MessagesFile Idiomas English isl Name spa MessagesFile Idiomas Spanish isl 如果我选择英语 Ty
  • iOS CPU 配置文件:为什么这个线程会占用 99.9% 的 CPU?

    有时 当我加载表视图时 除了让表视图显示之外 我没有故意执行任何活动 我会等待几秒钟 然后 CPU 使用率就会飙升 我怎样才能找到原因 为什么这个线程会占用 99 9 的 CPU 我不知道 但这里有一些想法 负责的图书馆是UIKit 所以看
  • 暴露 Google Container Engine 中的两个端口

    是否可以在 Google 容器引擎中创建一个公开两个端口的 Pod 端口 8080 正在侦听传入内容 端口 80 将此内容分发给客户端 Google 给出了以下创建 Pod 的命令作为示例 kubectl run hello node im
  • JavaScript JSON 解析器告诉错误位置

    我在解析通过 WebSocket 接收的 JSON 时遇到了一些麻烦 原始问题 解析通过 WebSocket 接收到的 JSON 会导致错误 https stackoverflow com questions 7116035 parse j
  • 枚举类型的复选框列表 MVC Razor

    在我的 c net MVC 应用程序中 我想显示枚举类型的复选框列表 我有一个枚举类型 Flags public enum ModeType Undefined 0 Read 1 Edit 2 我的模型是 Public TrainingMo
  • https 设置后 django 站点 ERR_SSL_PROTOCOL_ERROR

    所以我正在尝试部署我的网站并且基本上尝试过 python manage py check deploy 并遵循它告诉我的一切 WARNINGS security W004 You have not set a value for the S
  • 使用部分字符串 lua 查找完整字符串

    我试图在表中查找整个字符串而不编写完整的字符串 Example maintable SecondString FirstString c First 我怎样才能使用字符串c无需输入整个字符串名称即可查找 FirstString 的完整名称
  • 带有 Bootstrap 布局的 jQuery UI 可拖动

    jQuery 可拖动元素位于引导样式列 col 下 例如 我有两个 row每列分为 4 列 col md 3 我试图将第一行列拖动到第二行可放置列上 但是当我拖动 Drag 元素时 它们总是位于 可放置 元素下方 我无法使用 Bootstr
  • Flutter ScreenState Dispose 方法异常

    当我尝试在颤动中从一个屏幕导航到另一个屏幕时 我收到一个异常 指出我要更改的 ScreenState 不会调用super dispose in its dispose方法 然而 被覆盖的dispose方法明确调用super dispose
  • 使用 l20n 本地化属性

    我想本地化一个placeholder具有 L20N 属性 我在他们的文档中找不到任何内容 并且这样做 毫不奇怪 不起作用
  • Dropzone上传的文件同名

    我有一个带有 dropzone 的普通表单 所有值和文件都上传到服务器 但是当我通过打印 FILES 变量检查它时 所有上传的文件与最后上传的文件具有相同的名称和扩展名 但具有正确的 mime 每个文件的类型 因此 当我上传具有不同文件类型
  • OpenCV 读取不起作用

    I have loop in my C code to open and process a set of images One of those is https i stack imgur com rUJnp gif https i s
  • 如何在 Python 中将表示二进制分数的字符串转换为数字

    假设我们有一个表示二进制分数的字符串 例如 1 以十进制数表示为 0 5 Python 中是否有一种标准方法可以将此类字符串转换为数字类型 无论是二进制还是十进制并不严格重要 对于整数 解决方案很简单 int 101 2 gt gt gt
  • 伪快速排序时间复杂度

    我知道快速排序有O n log n 平均时间复杂度 经常用于演示函数式语言的简洁性的伪快速排序 仅当您从足够远的地方看时 具有适当高的抽象级别时 它才是快速排序 如下 在 Haskell 中给出 quicksort Ord a gt a g