如果我们有任务:
给定一个二进制数据块,计算其中字节的频率。
你应该用C语言来解决这个问题,即使对于较大的二进制块来说,答案也是微不足道的,而且速度也是相当快的。如何在没有副作用的情况下用纯函数式语言实现这一点?
例如,如果您编写了一个函数,该函数接受每个字节和其余字节列表的频率计数,并返回修改过的频率计数,那么对于1亿字节的数据集,它必须做大量的工作。
另外,如果您对数据进行排序,然后以某种方式计算后续相同值字节的数量,则排序本身将花费大量时间。
是否有一个合理的方法来实现这一点?
发布于 2013-04-01 13:46:27
简单的方法确实是传入并返回数据结构,将字节映射为计数。这可能会实现为某种树(据我所知,这就是从标准库容器中得到的)。在纯函数式编程中,当您在树中传递并且需要返回一个只有一个节点不同的新树时,返回的树将与原始树共享其几乎所有的结构和数据。
遍历树以达到计数有一定的开销,但是由于计算字节,树的大小一直小于256个元素,因此开销是log(255),这是一个常量。对于大数据集,它不会变大--它不会改变算法的复杂性。这实际上是正确的,即使您使用最大的开销来复制一个完整的256项计数数组,而不需要共享。
如果您想优化这一点,您可以利用这样一个事实:除了作为下一组计数计算的一部分之外,从来不需要“中间”频率计数。这意味着您可以使用各种技术让实现使用破坏性更新,即使在编写功能代码时也是如此。Haskell中的STref
基本上允许您手动执行此操作。
理论上,编译器可能会注意到,您正在用一个新的值替换一个不需要的值,因此它可以为您进行适当的更新。我不知道目前是否有任何实际的现成的编译器能够进行这种优化。
https://stackoverflow.com/questions/15749878
复制相似问题