【问题标题】:Haskell :: Slower Function as List Getting BiggerHaskell :: 随着列表变大,函数变慢
【发布时间】:2017-09-28 13:13:23
【问题描述】:

我正在寻找一个列表的最大值(通过使用maximum),我知道这个函数需要处理整个列表才能达到它的目标,随着列表变大,这显然会变慢。不幸的是,我的名单很大(数亿)。

这是唯一的方法吗?或者有更快的方法来做到这一点?我发现 Haskell 很快,但在这一点上(越来越慢),我想知道是否有其他选择可以找到 maximum

【问题讨论】:

  • 如何在不检查每个数字的情况下找到不相关数字列表的最大值?只有两个选项:(a)要么数字有一些相关性,你可以利用;或(b)您也许可以使用数组,因为这通常遍历起来更快。但是在 (b) 的情况下,它仍然需要 O(n) 时间。
  • 你是如何生成列表的?
  • 最大值是可交换约简,因此如果您有合适的并行节点可以处理,您可以分配作业。但这假设您的大量数据已经可以被分块;如果它只是一个你懒惰地生成的列表,那么简单地使用它仍然更快。 stackoverflow.com/questions/4028210/… 可能有一些线索。
  • 我认为,如果您编辑问题以包含更多详细信息,您可能会更快地获得更有帮助的答案。您所做的几个 cmets(对一个现已删除的答案)表明该列表位于一个大文本文件中,并且您需要对各种分组执行多个最大/最小计算,但这些信息均不在原始问题中。查看文件中记录的外观示例以及您尝试为其查找最小值/最大值的“分组”类型会很有帮助。
  • 如果不进一步了解列表的“结构”,就无法绕过O(n) 问题的复杂性。

标签: list function haskell


【解决方案1】:

我知道这个函数需要处理整个列表才能达到它的目标,而且随着列表变大,这显然会变慢。

在 Haskell 中找到最大值是 O(n)(大概其他所有语言也是如此)。除非您有一些具体的基准和代码,否则这似乎是完全可以预料的。

【讨论】:

    【解决方案2】:

    由于您需要“查看”每个值并选择最高的 O(n) 是最好的解决方案(没有任何其他可以使用的信息)。如果您必须多次执行该功能,那么您可能需要对列表进行排序(升序或降序)并使用时间复杂度为O(1) 的函数headlast,而haskells sort是具有O(n log n) 最坏情况和平均情况性能的合并排序。

    【讨论】:

    • Haskell 的列表是 lisp 风格的,表现得可能是无限的单链表。 last 可能是 O(n)。提取数组的最后一个元素是 O(1)。
    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 2013-01-19
    • 2023-02-07
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多