我一直在考虑Haskell - 所以仍然是一个初学者。
我一直在考虑计算列表中项目的频率。在具有可变数据结构的语言中,这通常使用哈希表来解决 - 例如,Python中的dict或Java中的HashMap。这种解决方案的复杂性是O(n) - 假设哈希表完全适合内存。
在Haskell中,似乎有两种(主流)选择 - 对数据进行排序,然后对其进行分组和计数,或者使用Data.Map。如果使用排序,它将主导解决方案的运行时,因此复杂度为O(n log n)。同样,Data.Map使用平衡树,因此在其中插入n个元素也将具有复杂度O(n log n)。
如果我的分析是正确的,那么我认为通过使用可变数据结构可以最有效地解决这个特定问题。还有其他类型的问题吗?一般来说,使用Haskell的人会如何处理这样的事情?
答案 0 :(得分:4)
我们是否可以在纯语言中实现具有最佳复杂度的任何算法的问题目前尚不清楚。 Nicholas Pippenger has proven与最优算法相比,存在一个必须在纯严格语言中具有log(n)惩罚的问题。但是,有一个followup paper表明此问题在 lazy 语言中具有最佳解决方案。所以在一天结束时我们真的不知道。虽然看起来大多数人认为某些问题存在固有的log(n)惩罚,即使对于懒惰的语言也是如此。