如果我们给出n个字符串及其长度和一个add(字符串s1,字符串s2)函数,它将字符串s2与s1连接并返回s3。我们如何优化将所有这些字符串连接成一个大字符串的成本。
如果没有给出这样的函数,我们可以简单地创建大小为(n1 + n2 + ... nn)的输出字符串,并保持每个字符串的字符附加。但是,有了这个函数,我们必须遍历输入字符串s1才能找到它的结尾,然后开始将字符串s2连接到它。
所以如果字符串的长度是2,6,1,3,4 ..
add (s1, s2) traversal for length 2, op string of length 8
add (s1, s3) traversal for length (2+6) op string of length 9
add (s1, s4) traversal for length (2+6+1) op string of length 12
add (s1, s5) traversal for length (2+6+1+3) op string of length 16...and so on..
答案 0 :(得分:1)
"with this function given we'd have to traverse input string s1
to find it's end and then start concatenating string s2 to it. "
您可以在遍历字符串时逐字符串地连接字符串。在结果字符串中附加一个小字符串后,您可以获取指向结果字符串末尾的指针。因此,在添加下一个小字符串时,使用它以便您不必再次遍历该位置。
答案 1 :(得分:0)
Thera有两种方法可以做到。
对数组进行排序,然后保持连接,这样可以最大限度地降低成本。
时间复杂度O(nlogn)其中n是数组的大小。 (假设您使用了快速排序) 空间复杂度O(logn)
创建array的最小堆。现在从堆中删除前两分钟,添加它们 并再次添加到堆中,需要多少钱?
创建Min-Heap将需要O(n)。 删除第1和第2分钟将采用O(n)+ O(n),等待如何? ,用最后一个元素替换root 并调用heapify,它需要O(logn),所以删除。现在我们必须做同样的事情 剩下的n-2个元素因此需要总O(n-2(logn))才是最差的, 添加两个元素取O(1)并插回并再次调整堆将取O(logn) 总的来说,它将是O(nlogn)的顺序,我们还可以看到更多的调用和指令 在这种情况下。
整体问题只需要对数组进行排序,我们可以最大限度地降低连接成本,但如果我们考虑时间空间,我们需要更多地考虑选择正确的排序算法