Это проблема 9.6 из Крекинг Кодирование интервью (5 й издание)Какова пространственная сложность этого алгоритма?
реализовать алгоритм, чтобы напечатать все допустимые комбинации п-пар скобок
Пример
Входной сигнал: 3
Выход: «(()),()()()()()(),() (()),()()()«
Вот алгоритм, который я реализовал (на Java)
private static Set<String> getAllComb(int n) {
Set<String> allPoss = new HashSet<String>();
if(n>0) {
if(n==1) {
allPoss.add("()");
} else {
Set<String> before = getAllComb(n-1);
for(String phrase: before) {
int length = phrase.length();
for(int start = length - 2; start>=0; start--) {
if(phrase.charAt(start) == '(') {
String phraseToConsider = phrase.substring(0, start+1) + "()" +
phrase.substring(start + 1);
if(!allPoss.contains(phraseToConsider)){
allPoss.add(phraseToConsider);
}
}
}
String phraseToConsider = "()" + phrase.substring(0);
if(!allPoss.contains(phraseToConsider)){
allPoss.add(phraseToConsider);
}
}
}
}
return allPoss;
}
Это дает правильный выход. Я знаю, что интервьюеры (по крайней мере, в Amazon) любят задавать вам сложность времени и пространства вашего решения. Для временной сложности я смог показать, что алгоритм работает в O (n) с рекуррентным соотношением. У меня возникают проблемы с анализом сложности пространства. I это рекурсивное решение, поэтому должно быть не менее O (n) Но при каждом рекурсивном вызове я также генерирую множество, ограниченное n. Будет ли общее пространство O (n) из-за n рекурсивных вызовов или оно O (n) из-за установленного размера связанного n для каждого рекурсивного вызова n?
Некоторые подсказки на стороне, которые не имеют прямого отношения к вашей проблеме: 1) Вы должны иметь возможность использовать N = 0 в качестве базового футляра; его общее в рекурсивных проблемах не нужно рассматривать N = 1 специально 2) Если вы используете буфер длиной 2n, который рекурсивные вызовы «заполняют», вы должны иметь возможность свести сложность пространства до O (n). – hugomg
Для n = 4 существует 14 возможных способов записи правильно скопированных скобок. Буфер длиной 2n (или kn для любого k) слишком мал, чтобы удерживать выход в целом. – chepner
как бы вы использовали буфер длиной 2n? Вы не можете предопределить размер набора. – committedandroider