gpt4 book ai didi

c++ - 以下递归解决方案的大O

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:11:14 26 4
gpt4 key购买 nike

我写了下面的代码来寻找两个字符串之间的最小删除距离

enter code here
#include <iostream>
#include <string>

using namespace std;
int DeletionDistance(const string& str1, const string& str2, int len1, int
len2){
int index1=0;
int index2=0;
int count=0;
int str1len=str1.length();
int str2len=str2.length();
//calculate the base case if a string is empty, the deletion distance is the
length of the other string
//since we need to delete all the other chars from the non empty string in
order to match the two strings
if(str1len<=0)
return str2len;
else if(str2len<=0)
return str1len;
else{
//the strings are non empty. Recursively calculate the min del distance
if(str1[index1]==str2[index2]){
//the chars match , hence the deletion distance would depend on the
remaining chars in both strings
return DeletionDistance(str1.substr(index1+1,len1),
str2.substr(index2+1,len2), len1, len2);
}
else
//the chars dont match
return (1+min(DeletionDistance(str1.substr(index1+1,len1),
str2.substr(index2,len2), len1, len2),
DeletionDistance(str1.substr(index1,len1),
str2.substr(index2+1,len2), len1,
len2)));
}
}

int deletionDistance( const string& str1, const string& str2 )
{
int len1 = str1.length();
int len2 = str2.length();
return DeletionDistance(str1, str2, len1, len2);

}

在这段代码中,我们递归地计算两个字符串之间的最小删除距离,如何计算时间和空间复杂度?有人告诉我这个解决方案的时间和空间复杂度是 O(ab) 其中, a = 字符串 1 的 len b = 字符串 2 的 len我真的很感激关于如何开始为这样的递归解决方案计算 Big O 的一些解释或指示。我能够为更简单的递归解决方案(如 Fibonacci 系列、阶乘等)计算 bigO,但这打败了我。

最佳答案

您的代码的复杂度为 O(2 ^ (|A| + |B|) ),其中 |A||B|分别是第一个和第二个字符串的大小。

这样做的原因是,在最坏的情况下,您的递归将在到达两个字符串中的最后一个字符时返回。在您的代码中,每次您在第一个或第二个字符串中前进一步。所以一般来说,您的递归深度为 (|A| + |B|),并且您的代码包含 2 递归调用。

如评论中所述,您可以使用动态规划实现 O(|A| * |B|) 的复杂度。这是一个不错的 tutorial这将引导您完成它。您的问题接近最长公共(public)子序列问题 (LCS)。

关于c++ - 以下递归解决方案的大O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com