解决方案的复杂性分析,以最大程度地降低连带成本

神经突

这是关于分析热门面试问题的解决方案的复杂性。

问题

有一个concat(str1, str2)连接两个字符串的函数函数的成本由两个输入字符串的长度来衡量len(str1) + len(str2)实现concat_all(strs)仅使用concat(str1, str2)函数连接字符串列表的实现目标是使总的连接成本最小化。

警告事项

通常在实践中,对于在循环中连接成对的字符串会非常谨慎。这里这里可以找到一些很好的解释实际上,我亲眼目睹了由此类代码引起的严重性为1的事故。除了警告,我们可以说这是一个面试问题。对我来说真正有趣的是围绕各种解决方案的复杂性分析。

如果您想考虑这个问题,可以在这里暂停。我将在下面介绍一些解决方案。

解决方案

  1. 天真的解决方案。遍历列表并连接 def concat_all(strs): result = '' for str in strs: result = concat(result, str) return result
  2. 最小堆解决方案。这个想法是首先连接较短的字符串。根据字符串的长度,保持字符串的最小堆。每个串联从最小堆连接2个字符串,并将结果推回最小堆。直到在堆上只剩下一个字符串为止。 def concat_all(strs): heap = MinHeap(strs, key_func=len) while len(heap) > 1: str1 = heap.pop() str2 = heap.pop() heap.push(concat(str1, str2)) return heap.pop()
  3. 二进制连接。可能不直观。但是另一个好的解决方案是将列表递归地分成两半并进行连接。 def concat_all(strs): if len(strs) == 1: return strs[0] if len(strs) == 2: return concat(strs[0], strs[1]) mid = len(strs) // 2 str1 = concat_all(strs[:mid]) str2 = concat_all(strs[mid:]) return concat(str1, str2)

复杂

我在这里真正苦苦挣扎的是上面使用最小堆的第二种方法的复杂性。

假设列表n中的字符串数为,所有字符串中的字符总数为m天真的解决方案的上限是O(mn)binary-concat的精确界限为theta(mlog(n))这是我无法实现的最小堆方法。

我有点猜测它的上限是O(mlog(n) + nlog(n))第二项,nlog(n)与维护堆有关。nconcat,每个concat都会更新中的堆log(n)如果我们只关注级联的开销,而忽略维护最小堆的开销,则最小堆方法的总体复杂度可以降低到O(mlog(n))然后,min-heap是比bina​​ry-concat更理想的方法,因为前者mlog(n)是上限,而后者是精确界限。

但是我似乎无法证明这一点,甚至无法找到一个很好的直觉来支持这个猜测的上限。上限可以低于O(mlog(n))吗?

达米安·普罗

让我们将在此处输入图片说明字符串1的长度称为n,将m称为所有这些值的总和。

  1. 对于幼稚的解决方案,很明显,如果m1它几乎等于m,则会出现最坏的情况,并且您O(nm)会指出复杂度。

  2. 对于最小堆,最坏的情况有所不同,它在于任何字符串的长度都相同。在这种情况下,它将完全按照您的二进制concat的情况3.进行工作,但是您还必须维护min-heap结构。因此,是的,这将比实际情况下的情况3贵一些。但是,从复杂性的角度来看,两者都将存在,O(m log n)因为我们拥有m > n并且O(m log n + n log n)可以简化为O(m log n)

为了更严格地证明最小堆复杂度,我们可以证明,当我们将一组k个字符串中的两个最小字符串取并用两个最小字符串S的总和表示时,我们得到:((m-S)/(k-1) >= S/2这仅表示均值最小的两个字符串的平均值小于k-2其他字符串的平均值)。重新制定导致S <= 2m/(k+1)让我们将其应用于最小堆算法:

  • 第一步,我们可以证明我们取出的两个弦的总长度最大为2m /(n + 1)
  • 第一步,我们可以证明我们取出的两个弦的总长度最大为2m /(n)
  • ...
  • 在最后一步,我们可以证明我们取出的两个弦的总长度最大为2m /(1)

因此最小堆的计算时间2m*[1/(n+1) + 1/n + ... + 1/2 + 1]是在O(m log n)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章