Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要添加+;1在溶液中_Python_Algorithm_Dynamic Programming_Insertion Sort - Fatal编程技术网

Python 为什么要添加+;1在溶液中

Python 为什么要添加+;1在溶液中,python,algorithm,dynamic-programming,insertion-sort,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):

我正在浏览一些算法帖子。在回顾时,我怀疑为什么我们在返回最终解决方案时在下面的代码中添加了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)) 

+我过去常数数。我们需要在返回父节点时添加(从0{return 0}+1开始)。 然后取两个递归调用的最小值

findMinInsertions(str, l, h - 1)
插入最后一个字符后的最小插入次数

findMinInsertions(str, l + 1, h)
min(findMinInsertions(str, l, h - 1), findMinInsertions(str, l + 1, h)) # (a)
插入第一个字符后的最小插入次数

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

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

该算法在插入排序期间没有找到最小插入次数,只是给出了插入次数的上限。通过简单地在字符串“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]


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

参数
l
h
似乎是字符串
str
的索引。你需要添加
1
才能进入下一个角色。我已经编辑了帖子,请再次检查@Someprogrammerdude。为什么我们在return语句return(min(findmininstertions(str,l,h-1),findmininstertions(str,l+1,h))+1)的末尾添加1这个程序在我看来好像添加了1,因为递归的当前执行应该计为1。就像str[l]!=str[h],在将当前问题简化为子问题之前,需要完成一个计算为1的操作。此算法用于查找字符串中插入的最小次数,使其成为回文。当从递归返回最小值时,它将计算我们拥有的最小元组数。那么为什么需要在答案中加1呢?这个算法不是用于插入排序的。实际上,这个算法计算了使字符串具有回文性所需的最小插入次数。@ParulGarg您应该在问题中提到算法的用途。