Haskell 函数 nub 效率低下

2023-12-22

我对 Haskell 标准库中“nub”(选择唯一值)函数的实现感到困惑数据列表。 GHC 的实施是

nub l                   = nub' l []
  where
    nub' [] _           = []
    nub' (x:xs) ls
        | x `elem` ls   = nub' xs ls
        | otherwise     = x : nub' xs (x:ls)

据我所知,最坏情况的时间复杂度为 O(n^2),因为对于唯一值列表,它必须将它们全部比较一次才能看到它们实际上是唯一的。

如果使用哈希表,则构建表的复杂度可以降低到 O(n) + 针对哈希表中的先前值检查每个值的复杂度为 O(1)。当然,这不会产生有序列表,但如果有必要,使用 GHC 自己的有序 Data.Map 也可以在 O(n log n) 中产生有序列表。

为什么要为一个重要的库函数选择如此低效的实现呢?我知道效率不是 Haskell 的主要关注点,但至少标准库可以努力为工作选择(渐近)最佳的数据结构。


在 Haskell 中,效率是一个相当令人担忧的问题,毕竟该语言的性能与 Java 相当,并且在内存消耗方面胜过 Java,但它当然不是 C。

你的问题的答案很简单:前奏曲nub只需要一个Eq约束,而任何基于的实现Map or Set还需要一个Ord or Hashable.

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

Haskell 函数 nub 效率低下 的相关文章

随机推荐

  • 接口{}是什么意思?

    我对接口不熟悉 并尝试通过以下方式执行 SOAP 请求github https github com webconnex xmlutil blob master xmlutil go 我不明白的意思 Msg interface 在这段代码中
  • UITableView:将一行拖到另一行上

    我有一个代表对象列表的 UITableView 我希望用户触摸一个对象 将其拖动到另一个对象上 以便将它们组合起来 然后看到两个对象消失并出现一个新对象 我想我无法使用标准表视图编辑方法来做到这一点 不能将一行拖到另一行上 对吗 我应该写我
  • Sqlplus oracle:如何在 bash 上以 1 行运行 sql 命令?

    我可以将其转换为 sqlplus 中 bash 上的 1 个命令行吗 因为我想自动化它 sqlplus as sysdba SQL gt EXEC DBMS XDB SETLISTENERLOCALACCESS FALSE exit 您不需
  • 获取二维数组每一列的最大值

    我有一个数组中的数组 例如 0 20 5 5 0 15 5 10 0 我需要获取每列中的最大数字 最大为 0 5 5 is 5 以便进入结果数组 最大为 20 0 10 is 20 以便进入结果数组 最大为 5 15 0 is 15 以便进
  • 如何从 ThreadPool.QueueUserWorkItem 捕获异常?

    我有以下抛出异常的代码 ThreadPool QueueUserWorkItem state gt action 当操作抛出异常时 我的程序崩溃了 处理这种情况的最佳做法是什么 有关的 Net ThreadPool 线程上的异常 https
  • 在 Matplotlib 中使用日期时间作为刻度

    我基本上是想绘制一个图表 其中 x 轴代表一年中的月份 数据存储在 numpy array 中 具有维度k x months 下面是一个最小的例子 我的数据没那么疯狂 import numpy import matplotlib impor
  • 在wpf中,有没有办法在卸载控件之前执行代码...?比如卸货活动?

    我需要在卸载 wpf 用户控件之前执行代码 并在满足某些条件时取消卸载 并使控件在 ui 中保持当前状态打开 我有什么办法可以做到这一点吗 我看不到像卸载事件这样的东西 谢谢 Unloaded当从 WPF 可视化树中删除控件时触发 据我所知
  • 如何让markdown文本对齐

    我用这个 p align left Some plain texts will be aligned justify p 当我只有纯文本时 这真的很棒 但是 如果我想证明这样的事情是合理的 它就无法正常工作 网址和列表将消失 Lorem i
  • REST 具有可空类型?

    我碰壁了 我的 REST 实现不接受 Nullable 值 OperationContract WebInvoke ResponseFormat WebMessageFormat Json UriTemplate Transactions
  • “如何在 Microsoft Visual Studio 中使用 OpenCV 构建应用程序”示例代码中未声明 CAP_PROP_FRAME_WIDTH

    我正在按照中的说明进行操作如何在 Microsoft Visual Studio 中使用 OpenCV 构建应用程序 http docs opencv org trunk doc tutorials introduction windows
  • 如何使用JavaScript显示金字塔?

    这是显示金字塔的代码 但它并不完全产生所需的输出 function generatePyramid var totalNumberofRows 5 var arr new Array for var i 1 i lt totalNumber
  • 确保模板参数是枚举类[重复]

    这个问题在这里已经有答案了 有没有办法确保模板参数是枚举类类型 I know type traits has std is enum 但我不希望它匹配常规枚举 而只是匹配 enum classes 想要的效果示例 enum class En
  • AndroidRunTime 异常 NoClassDefFoundError 在模拟器 API17 上,但不在 API22 上

    Android Studio 1 3 1 Gradle 构建插件 1 1 2 Gradle 1 3 0 在 Android Studio 上 我有一个应用程序可以在 Android API22 上完美运行 Lollipop 在模拟器 API
  • TestNG:全局设置调用计数

    我希望多个包中的所有测试 假设 100 个测试 每个类 1 个 运行 3 次 我可以设置 Test invocationCount SOME CONSTANT 但这仍然需要一百次改变 有没有一种方法可以在单个抽象类中设置调用计数 或其他参数
  • 为什么我的 MPI 程序输出不正确

    我是 MPI 的初学者 我有作业 我不是要求你解决它 我只需要提示我的程序出现故障的原因 这是问题所在 编写一个模拟乒乓球桌游戏的 MPI C 程序 只能使用 2 个进程 进程使用 MPI Send 和 MPI Recv 不断地向彼此退回消
  • 使用 Database First 模型 (EF 5) 添加验证到模型

    我知道如何向模型状态添加验证错误 我知道如何将验证注释添加到我的模型类中 问题是 首先使用数据库 我不想触及生成的代码 因为当我重新生成时 我将丢失我的自定义 我总是尝试在部分中进行自定义 但是您无法向部分中的现有属性添加注释 这里的最佳实
  • 正则表达式允许 A-z、0-9 以及中间的横线,而不是两端的横线?

    我正在努力创建一个满足以下条件的 ruby 正则表达式 支持的 A Z a z 0 9 破折号在中间 但绝不以破折号开始或结束 至少 5 个字符 不超过 500 个字符 到目前为止我有 0 9a z 5 500 关于如何更新以满足上述标准有
  • AutoCompletionBinding 无法访问类 com.sun.javafx.event.EventHandlerManager

    我有一些问题javafx and org controlsfx control textfield TextFields 我正在尝试实现一个功能 该功能可以从数据库中获取可能的用户输入预测 以便用户只能选择 授权 选项 在与controls
  • JavaScript 中的 setTimeout 和“this”

    我有一个使用的方法setTimeout https developer mozilla org en window setTimeout函数并调用另一个方法 在初始加载时 方法 2 工作正常 但是 超时后 我收到一条错误消息method2未
  • Haskell 函数 nub 效率低下

    我对 Haskell 标准库中 nub 选择唯一值 函数的实现感到困惑数据列表 GHC 的实施是 nub l nub l where nub nub x xs ls x elem ls nub xs ls otherwise x nub x