Functional programming 在相同的空间和时间复杂度类别中,每个命令式算法是否都有一个纯函数等价物?

Functional programming 在相同的空间和时间复杂度类别中,每个命令式算法是否都有一个纯函数等价物?,functional-programming,f#,time-complexity,space-complexity,Functional Programming,F#,Time Complexity,Space Complexity,根据我个人的经验,我想答案是否定的。 以可变数组为例。似乎,通过使用具有随机访问的可变数据结构(即数组),可以最有效地解决某些问题。您可以使用与函数方法兼容的不同数据结构,如字典(F#中的映射),但这样您就不会有随机访问,并且您的算法的效率将因因子logn而降低。 在一些非常罕见的情况下,使用别名以不同的方式访问相同的数据结构不仅方便,而且效率更高。但别名也与函数方法的不变性不兼容 这样的例子表明,纯功能性方法不可能在所有情况下都像命令式方法那样有效。当然我知道,函数式语言是图灵完备的,但我记不

根据我个人的经验,我想答案是否定的。 以可变数组为例。似乎,通过使用具有随机访问的可变数据结构(即数组),可以最有效地解决某些问题。您可以使用与函数方法兼容的不同数据结构,如字典(F#中的映射),但这样您就不会有随机访问,并且您的算法的效率将因因子logn而降低。 在一些非常罕见的情况下,使用别名以不同的方式访问相同的数据结构不仅方便,而且效率更高。但别名也与函数方法的不变性不兼容


这样的例子表明,纯功能性方法不可能在所有情况下都像命令式方法那样有效。当然我知道,函数式语言是图灵完备的,但我记不太清楚证明是否也告诉我们时间和空间的复杂性。那么,从理论角度来看,我们对此了解多少呢?我的假设正确吗

简短的回答是肯定的。功能数据结构效率较低:

  • Map
    Set
    是树,依赖于比较,而不是hashcode。因此
    log(n)
  • List
    确实提供了与可变数组相同的API,但它是一个链表。因此,
    log(n)
    用于随机访问
然而,这是不变性的一个已知权衡——在不可变链表中“替换”1个元素更便宜,因为您只需更新1个元素并重用其余元素,而如果您想要一个不可变数组,则必须完全复制它

所以FP更多的是关于稳定的代码、可预测的行为和高开发速度。然而,系统的大多数部分在性能方面并不关键,所以您不会真正注意到两者之间的资源消耗差异,而关键部分可以进行优化以使用可变结构

既然您对它进行了标记,
F#
是一种很好的语言,因为它对FP和OOP都有很好的支持。

显示了这一点

  • 与以n步运行的纯程序相比,一个不纯程序最多有一个log(n)乘法开销(在大O意义上)
  • 确实存在某些问题,对数(n)因子实际上是必要的

  • 然而,有一些有趣的问题,对数(n)因子是不必要的,同时也要记住,常数因子在现实世界的用例中可能也很重要。

    问题很好,但我认为这样问是错误的。不过,通过一些简单的修改,这可能是StackExchange的一个好问题:quora.com可能是解决此类问题的更好地方。