Algorithm 不同编程范式算法的复杂性

Algorithm 不同编程范式算法的复杂性,algorithm,language-agnostic,programming-languages,functional-programming,complexity-theory,Algorithm,Language Agnostic,Programming Languages,Functional Programming,Complexity Theory,我知道大多数编程语言都是图灵完备的,但我想知道是否可以用与任何编程语言(尤其是任何编程范式)具有相同复杂性的算法来解决问题 通过一个例子让我的答案更加明确:是否有任何问题可以用复杂度为x(比如O(n))的命令式算法解决,但不能用同样复杂度的函数式算法解决(反之亦然) 编辑:算法本身可能不同。问题是关于解决问题的复杂性——使用语言中可用的任何方法。一个算法有一个可测量的运行时,例如O(n)。正如您所说,算法的实现必须遵循相同的运行时,否则它们不会实现算法。根据定义,语言或实现不会更改算法,因此不会

我知道大多数编程语言都是图灵完备的,但我想知道是否可以用与任何编程语言(尤其是任何编程范式)具有相同复杂性的算法来解决问题

通过一个例子让我的答案更加明确:是否有任何问题可以用复杂度为
x
(比如
O(n)
)的命令式算法解决,但不能用同样复杂度的函数式算法解决(反之亦然)


编辑:算法本身可能不同。问题是关于解决问题的复杂性——使用语言中可用的任何方法。

一个算法有一个可测量的运行时,例如O(n)。正如您所说,算法的实现必须遵循相同的运行时,否则它们不会实现算法。根据定义,语言或实现不会更改算法,因此不会更改渐近运行时


也就是说,某些语言和技术可能会使表达算法变得更容易,并由于语言的编译或执行方式而不断加速(或减慢)

一般来说,不是所有的算法都可以在所有语言中以相同的复杂度顺序实现。例如,可以用一种不允许O(1)访问数组的假设语言来证明这一点。然而,据我所知,在函数式语言中没有任何算法不能以最佳的复杂度顺序实现。算法伪代码的复杂性分析对哪些操作是合法的,哪些操作是O(1)做出了某些假设。如果您打破其中一个假设,您可以改变算法实现的复杂性,即使该语言是图灵完整的。图阿纳尔席席的完备性不能保证任何操作的复杂性。

< P>如果你考虑图灵机本身,有一个基本操作,它需要O(n)时间,尽管在大多数其他语言中,它可以在O(1)中完成-索引数组。
我不能完全确定这一点,但我认为在函数式编程中也不可能有真正的数组(O(1)“在位置上获取元素”和O(1)“在位置上设置元素”)。由于不变性,您可以拥有一个可以快速更改的结构,但访问它需要时间,或者您必须在每次更改时复制结构的大部分以获得快速访问。但是我想你可以用单子来回避这个问题。

看看函数式和命令式,我怀疑你会发现任何真正的区别

但是,查看单个语言和实现是另一回事。暂时忽略Brainfuck之类的例子,仍然有一些相当不错的例子可以找到

我仍然记得多年前的一个例子,在大型机上编写APL。任务是在排序的数字数组中查找(并消除)重复项。当时,我所做的大部分编程都是用Fortran编写的,还有一些是用Pascal(在当时仍然是最新最伟大的东西)或BASIC编写的。我做了看起来很明显的事情:编写了一个循环,逐步遍历数组,将
array[I]
array[I+1]
进行比较,并跟踪几个索引,根据已删除的元素数量,将每个唯一的元素复制回适当的位置

虽然这在我所习惯的语言中可以很好地工作,但在APL中几乎是一场灾难。工作得更好的解决方案更多地基于APL中简单的东西,而不是计算复杂性。具体来说,您所做的是将数组的第一个元素与数组的第一个元素“旋转”一个元素后进行比较。然后,要么保持数组的原样,要么删除最后一个元素。重复这一步骤,直到遍历整个数组(我记得,当第一个元素小于旋转数组中的第一个元素时检测到)


区别相当简单:与大多数APL实现(至少在当时)一样,这是一个纯解释器。单个操作(即使是相当复杂的操作)通常速度相当快,但解释输入文件需要相当长的时间。改进后的版本解释起来更短更快(例如,APL将“旋转数组”作为一个单一的原始操作提供,因此只能解释一两个字符而不是一个循环)。

我认为一种语言可以有不同的基本操作,成本为O(1),例如数学运算(+、-、*,/),或者变量/数组访问(a[i])、函数调用以及您能想到的一切

如果一种语言没有这样的O(1)操作(如大脑弯曲,没有O(1)数组访问),它就不能以同样的复杂度完成C所能做的一切,但如果一种语言有更多的O(1)操作(例如一种有O(1)数组搜索的语言),它就可以做得比C更多


我认为所有“严肃”语言都有相同的基本O(1)运算,因此它们可以以相同的复杂性解决问题。

我认为你的第一段是错误的。我认为你的编辑并没有改变这一点

假设您要求实现的观察行为符合算法的时间复杂度,那么

在计算算法的复杂度时,假设什么操作是常数时间。这些假设就是你要找到线索的地方

一些更常见的假设是常数时间数组访问、函数调用和算术运算

如果不能在固定时间内以一种语言提供这些操作,则无法以保持时间复杂性的方式再现算法

合理的