#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 вы должны упомянуть цель алгоритма в своем вопросе.