1
9
为什么这样做和为什么它优于特拉维斯·布朗的解决方案的解释是相当技术性的,需要一些耐心才能完全理解。
对数字19的一种非常低效的表示。只有当你在地图上要求这个元素时,才会计算出巨大的总和。这些“thunks”(延迟计算表达式)将随着输入的大小线性增长。
为了防止这种情况,我们使用
另一个将在添加之前对其进行评估,这样您将得到:
所以现在至少地图的值是常数空间。 我们需要做的最后一件事是将右折叠改为左折叠,因为Map.insert在第二个参数中是严格的。下面演示右折叠的含义。
使用
因此,如果有一个1000000元素数组,我们必须一直到第1000000个元素开始插入,因此我们需要将前面的999999个元素保留在内存中,以便知道接下来要做什么。左折可以解决这个问题:
|
2
3
因此,您有无限数量的可能结果,并希望计算每个结果在常量内存中出现的次数。这显然是不可能做到的,但是数据结构称为 count-min sketch 可以用来做一个很好的近似。在您的示例中,将结果存储在count min草图中,同时分别跟踪最小值和最大值,并在最后查询从最小到最大的每个整数的count min草图。 |
3
3
我通常处理这类问题的方法是跟踪地图上的计数。
此时,您可以请求范围的端点(
luqui's answer 为了得到更好的代码版本。 |
4
0
正如Jouni已经提到的,持续记忆是不可能的,但是这个CountMin草图听起来像炸弹!(虽然我以前没听说过)。但我想你可能需要的是将它存储在一个数组中,并且只更新每个频率。这可以在haskell中用可变数组实现。下面是一个例子:
用+RTS-s运行程序,输入1000000我们得到输出
|
Javran · 在IO内使用读取器“-->r”的意外行为? 7 年前 |
Andrzej Gis · getLine懒惰吗? 7 年前 |
toadly · 在新的YouTube设计中看到的延迟加载样式的文本? 7 年前 |
Varun Risbud · Scala lazy val解释 7 年前 |
Shersh · 解码和来自aeson软件包的解码功能之间有什么区别? 7 年前 |
Konrad · 在自定义dplyr函数中更改结果变量的名称 7 年前 |
Michael Jones · 在这个评论中,懒惰评估的含义是什么? 8 年前 |