我有一个家庭作业,我需要计算两个字符串之间的编辑距离。我得到了初始功能,但我一直遇到这个部分的问题
现在将截止值添加到编辑距离中。这不应该改变产生的结果,但会大大加快性能。
这是我原来的功能:
static unsigned int compute_edit_distance(const char *const a,
const char *const b)
{
if (strcmp(a, b) == 0) return 0;
if (a[0] == '\0') return strlen(b);
if (b[0] == '\0') return strlen(a);
unsigned int remove_from_a =
compute_edit_distance(a + 1, b) + 1;
unsigned int remove_from_b =
compute_edit_distance(a, b + 1) + 1;
unsigned int remove_from_both =
compute_edit_distance(a + 1, b + 1);
if (tolower(a[0]) != tolower(b[0])) ++remove_from_both;
return get_min(get_min(remove_from_a, remove_from_b),
remove_from_both);
}
我尝试了一些东西,但没有一个能奏效。我的最新变化是
if (depth == MAX_EDIT_DISTANCE_DEPTH)
{
size_t a_length = strlen(a);
size_t b_length = strlen(b);
size_t max_length = (a_length > b_length) ? a_length : b_length;
return MAX_EDIT_DISTANCE_DEPTH + max_length;
}
带有新的功能签名
static unsigned int compute_edit_distance(const char *const a,
const char *const b, unsigned int depth)
但这也不起作用。
我可以提示如何做到这一点吗?谢谢!
答案 0 :(得分:2)
最简单的方法是将“深度剩余”作为参数传递。也就是说,第一个调用会传递截止深度,并且所有递归调用都会传递一个较小的数字,您可以根据编辑类型来确定。
基本思想是在第一个解决方案中,在递归探索分支之后计算深度。也就是说,调用都是在分支上进行的,然后在返回分支的路上将数字加在一起。
你仍然可以这样做来计算深度,但是为了防止分支走得太远,你可以在分支的路上传入已经在调用中使用过的编辑预算的总计,或者相当于编辑剩余的预算。
你需要一些技巧来从失败的分支传回一个号码,以确保号码被拒绝。例如,返回一个你知道太大的数字,然后检查结果。例如,返回MAX_DEPTH + 1或类似的。