为什么要在解决方案中添加+1

时间:2019-03-21 07:04:35

标签: python algorithm dynamic-programming insertion-sort

我正在研究一些算法。在审查时,我有一个疑问,为什么我们在返回最终解决方案的同时在下面的代码中添加1。

import sys 

# Recursive function to find minimum  
# number of insertions 
def findMinInsertions(str, l, h): 

    # Base Cases 
    if (l > h): 
        return sys.maxsize 
    if (l == h): 
        return 0
    if (l == h - 1): 
        return 0 if(str[l] == str[h]) else 1

    # Check if the first and last characters are 
    # same. On the basis of the comparison result,  
    # decide which subrpoblem(s) to call 

    if(str[l] == str[h]): 
        return findMinInsertions(str, l + 1, h - 1) 
    else: 

        **return (min(findMinInsertions(str, l, h - 1), 
                findMinInsertions(str, l + 1, h)) + 1)** 

# Driver Code 
if __name__ == "__main__": 

    str = "abc"
    print(findMinInsertions(str, 0, len(str) - 1)) 

3 个答案:

答案 0 :(得分:0)

+1用于计数。我们需要在返回父节点时添加(从0 {return 0} +1开始)。 然后至少进行两次递归调用。

答案 1 :(得分:0)

findMinInsertions(str, l, h - 1)

是插入最后一个字符后的最小插入次数。

findMinInsertions(str, l + 1, h)

是插入第一个字符后的最小插入次数。

min(findMinInsertions(str, l, h - 1), findMinInsertions(str, l + 1, h)) # (a)

是插入第一个字符或最后一个字符后的最小插入次数。要获得最少的插入次数,您可以在插入一个字符后采用最小插入次数(a)并添加一个插入(因为已经插入了一个字符)。

答案 2 :(得分:0)

该算法无法在插入排序期间找到最小插入次数,而仅给出插入次数的上限。只需在字符串“ abc”上运行算法即可很容易地进行检查,并看到结果为2,而实际的最小插入量为0。

让我们看一下递归步骤:

if(str[l] == str[h]): 
    return findMinInsertions(str, l + 1, h - 1) 
else: 

    return (min(findMinInsertions(str, l, h - 1), 
            findMinInsertions(str, l + 1, h)) + 1)

如果str [l] == str [h],则最小插入量由它们之间的字符值决定,因为str [l]和str [h]可以停留在它们的相对位置(意思是str [ h]将保持在str [l]的右侧,因此我们将仅在索引l和h之间移动/插入字符。

一旦意识到在相同情况下会发生什么,就可以理解,在不等式的情况下,移动字符str [l]或str [h]的机会。< / p>

注意,由于这只是移动字符的机会,因此该算法会产生插入次数的上限,而不是最小值。