Functional programming 函数式编程语言中多字符串连接(join)的时间复杂度

Functional programming 函数式编程语言中多字符串连接(join)的时间复杂度,functional-programming,time-complexity,string-concatenation,Functional Programming,Time Complexity,String Concatenation,我说的对吗?在Haskell这样的函数式编程语言中,唯一可以实现的连接多个字符串的算法(即实现join,它将[“一”、“二”、“三”]行列表转换为一行“一对三”)的时间复杂度为O(n^2),如中所述 例如,如果我在Python中使用不可变字符串,并尝试实现join,我会得到如下结果 def myjoin(list_of_strings): return list_of_strings[0] + myjoin(list_of_strings[1:]) 例如,在Haskell中,不可能使它更

我说的对吗?在Haskell这样的函数式编程语言中,唯一可以实现的连接多个字符串的算法(即实现
join
,它将
[“一”、“二”、“三”]
行列表转换为一行
“一对三”
)的时间复杂度为O(n^2),如中所述

例如,如果我在Python中使用不可变字符串,并尝试实现
join
,我会得到如下结果

def myjoin(list_of_strings):
   return list_of_strings[0] + myjoin(list_of_strings[1:])

例如,在Haskell中,不可能使它更快吗?

首先,Haskell是懒惰的:这意味着如果您编写:

concat ["foo", "bar", "qux"]
在您请求(例如)结果的第一个字符之前,它不会执行此操作。在这种情况下,它通常不会将所有字符串连接在一起,但根据函数实现的智能程度,目标是完成获得第一个字符所需的最小工作量。如果您请求第一个字符,但不检查它,那么您可能会得到
succi'f'
而不是
'g'
,因为Haskell也是懒惰的

但是让我们假设我们对结果字符串感兴趣,并且想知道每个字符。我们可以将
concat
实现为:

concat :: [[a]] -> [a]
concat [] = []
concat (x:xs) = x ++ concat xs
(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : (xs ++ ys)
(++)
如下:

concat :: [[a]] -> [a]
concat [] = []
concat (x:xs) = x ++ concat xs
(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : (xs ++ ys)
这意味着-given
(:)
在O(1)中起作用-
(++)
在O(a)中起作用,a是第一个列表的长度,b(注意,这不是在大oh表达式中)是第二个列表的长度


现在,如果我们检查
concat
,我们会看到,如果我们输入k个字符串,我们将执行k
(++)
操作。在每次
(++)
操作中,左字符串等于字符串的长度。这意味着如果字符串的长度之和为n,
concat
是一个O(n)算法。

连接两个字符串需要Haskell中的
O(0)
时间。(直到你真正重复这个列表)。在链接的博客文章中,哪里有关于Haskell这样的函数式编程语言的评论,以及他们使用了这个愚蠢的算法?不,
concat
是以线性复杂度实现的,使用另一种类型比list更好。我想问的是如何加入字符串列表(即
[“一”、“二”、“三”]→ “一对三”
)。这个操作的时间复杂度是多少?@IlyaV.Schurov在Haskell中,字符串是一个列表;ie
“你好”::[Char]
谢谢!为什么
(:)
是O(1)?如果我们有一个长字符串(长度为n)并想在它前面加上一个字符,那么我们必须从头创建一个长度为n+1的新字符串(假设字符串与函数式编程中的任何其他字符串一样是不可变的),那么它就是O(n)@IlyaV.Schurov:不,在Haskell中,列表是一个链表<代码>(:)是一个构造函数:它是一个包含两个引用的构造函数:一个指向头部,一个指向尾部。啊,好吧,这是我的主要错误,我主要考虑Python字符串和列表。所以,如果列表是链表,那么连接确实很便宜。但是元素检索可能很昂贵。…@IlyaV.Schurov:随机元素检索确实很昂贵。这就是为什么大多数Haskell算法的目标是利用随机访问上的枚举。此外,还有一些数据结构,比如允许随机访问的数组。