Зачем добавлять 1 в решение

#python #algorithm #dynamic-programming #insertion-sort

#python #алгоритм #динамическое программирование #вставка-сортировка

Вопрос:

Я собираюсь просмотреть некоторые сообщения об алгоритме. При просмотре у меня возникли сомнения, почему мы добавили 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)) 
  

Комментарии:

1. Аргументы l и h , похоже, являются индексами в строке str . Вам нужно добавить 1 , чтобы перейти к следующему символу.

2. Я отредактировал сообщение, пожалуйста, проверьте еще раз @Someprogrammerdude . Почему мы добавили 1 в конец инструкции return return (min(findMinInsertions(str, l, h — 1),findMinInsertions(str, l 1, h)) 1)

3. Что делает эта программа, мне кажется, что добавляется 1, потому что текущее выполнение рекурсии должно учитываться как 1. Например, если str [l] != str [h], необходимо выполнить операцию, которая считается равной 1, прежде чем сводить текущую проблему к подзадачам.

4. Этот алгоритм используется для нахождения минимального количества вставок в строку, чтобы сделать ее палиндромной.

Ответ №1:

 findMinInsertions(str, l, h - 1)
  

это минимальное количество вставок после вставки последнего символа.

 findMinInsertions(str, l   1, h)
  

это минимальное количество вставок после вставки первого символа.

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

это минимальное количество вставок после вставки первого или последнего символа. Чтобы получить минимальное количество вставок, вы можете взять минимальное количество вставок после того, как был вставлен один символ (a) и добавить одну вставку (поскольку один символ уже был вставлен).

Ответ №2:

1 используется для подсчета. нам нужно добавить при возврате обратно к родительскому узлу (начать с 0 { вернуть 0 } 1 ). а затем выполнить минимум два рекурсивных вызова.

Комментарии:

1. При возврате минимальных значений из рекурсии подсчитывается минимальное количество кортежей, которое у нас есть. Тогда зачем нужно добавлять 1 в ответ.

Ответ №3:

Алгоритм не находит минимальное количество вставок во время сортировки вставок, а просто дает верхнюю границу количества вставок. Это легко проверить, просто запустив алгоритм для строки «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].

Обратите внимание, что, поскольку это всего лишь вероятность перемещения символа, алгоритм выдает верхнюю границу количества вставок, а не минимальную.

Комментарии:

1. Этот алгоритм не предназначен для сортировки по вставке. На самом деле этот алгоритм подсчитывает, сколько минимальных вставок нам понадобилось, чтобы создать палиндром строки.

2. @ParulGarg вы должны упомянуть цель алгоритма в своем вопросе.