Potrzebuję skutecznego algorytmu do znalezienia następnej większej permutacji danego ciągu.Algorytm znajdowania następnej większej permutacji danego ciągu znaków
Odpowiedz
Wikipedia ma ładne article generowanie kolejności leksykograficznych. Opisano również algorytm generowania następnej permutacji.
Cytowanie:
następujący algorytm generuje następne permutacji leksykograficznie po danym permutacji. Zmienia daną permutację w miejscu.
- Znajdź najwyższy wskaźnik
i
takie, żes[i] < s[i+1]
. Jeśli taki indeks nie istnieje, permutacja jest ostatnią permutacją.- Znajdź najwyższy indeks
j > i
taki, żes[j] > s[i]
. Takich musi byćj
, ponieważ taki indeks jesti+1
.- Zamień
s[i]
zs[j]
.- Odwróć kolejność wszystkich elementów po indeksie
i
aż do ostatniego elementu.
dla tych, którzy zastanawiają się, dlaczego krok 4 nie jest sortowany: krok 1 już sugeruje, że od s [i + 1] do końca jest już w porządku malejącym, dlatego zwrot jest równoznaczny z sortowaniem –
Praca domowa? W każdym razie, można spojrzeć na C++ funkcja std :: next_permutation czy to:
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
Możemy znaleźć następną największą leksykograficzny ciąg dla danego łańcucha S stosując następujący krok.
1. Iterate over every character, we will get the last value i (starting from the first character) that satisfies the given condition S[i] < S[i + 1]
2. Now, we will get the last value j such that S[i] < S[j]
3. We now interchange S[i] and S[j]. And for every character from i+1 till the end, we sort the characters. i.e., sort(S[i+1]..S[len(S) - 1])
Podany ciąg jest następna największa leksykograficzny ciąg S
. Można również użyć wywołania funkcji next_permutation
w C++.
Mam nadzieję, że ten kod może być pomocny.
int main() {
char str[100];
cin>>str;
int len=strlen(len);
int f=next_permutation(str,str+len);
if(f>0) {
print the string
} else {
cout<<"no answer";
}
}
Doskonałe rozwiązanie, które działa, jest opisane tutaj: https://www.nayuki.io/page/next-lexicographical-permutation-algorithm. I rozwiązanie, które, w razie następnego permutacji istnieje, zwraca go, powraca inaczej false
:
function nextPermutation(array) {
var i = array.length - 1;
while (i > 0 && array[i - 1] >= array[i]) {
i--;
}
if (i <= 0) {
return false;
}
var j = array.length - 1;
while (array[j] <= array[i - 1]) {
j--;
}
var temp = array[i - 1];
array[i - 1] = array[j];
array[j] = temp;
j = array.length - 1;
while (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
return array;
}
nextperm (A, n)
1. find an index j such that a[j….n - 1] forms a monotonically decreasing sequence.
2. If j == 0 next perm not possible
3. Else
1. Reverse the array a[j…n - 1]
2. Binary search for index of a[j - 1] in a[j….n - 1]
3. Let i be the returned index
4. Increment i until a[j - 1] < a[i]
5. Swap a[j - 1] and a[i]
O(n) for each permutation.
- 1. Iteracyjne rozwiązanie dla: - Znajdowania permutacji String
- 2. Algorytm znajdowania symetrii drzewa
- 3. Algorytm znajdowania czynników danej liczby. Najkrótsza metoda?
- 4. Algorytm znajdowania "minimalnej ścieżki oparcia"?
- 5. Algorytm lokalizowania niezbalansowanych nawiasów w ciągu znaków
- 6. Najlepszy algorytm liczenia permutacji w rubinie
- 7. rekurencyjne generator permutacji dla znaków
- 8. Najlepszy sposób na powrót języka danego ciągu znaków
- 9. Algorytm znajdowania pokrewnych słów w tekście
- 10. Algorytm unikalnego znajdowania krawędzi z siatki wielokątnej
- 11. Algorytm znajdowania kwadratowego kształtu na obrazie?
- 12. Najlepszy algorytm do znajdowania krawędzi (wielokątów) wierzchołków
- 13. Algorytm znajdowania "dobrych" sąsiadów - kolorowanie wykresu?
- 14. Algorytm znajdowania ścieżki Hamiltona w DAG
- 15. Algorytm szukania długości najdłuższej sekwencji spacji w danym ciągu znaków
- 16. Najdłuższy algorytm aproksymacji ścieżki z danego węzła
- 17. Bash: wyodrębnianie części ciągu znaków
- 18. Algorytm wykrywania kodowania znaków
- 19. Algorytm wyrównania znaków Java
- 20. Algorytm szukania permutacji numerycznej o podanym indeksie leksykograficznym
- 21. Obliczanie permutacji w F #
- 22. Dodaj unikalne litery danego ciągu do listy
- 23. Efektywny algorytm znajdowania wspólnego dzielnika najbliżej pewnej wartości?
- 24. Algorytm znajdowania najkrótszej ścieżki/odległości w systemie Android?
- 25. Algorytm znajdowania kombinacji liczb całkowitych większych niż określona wartość
- 26. Dobry algorytm znajdowania motywów w tweetach uszeregowanych według liczby obserwatorów?
- 27. Algorytm znajdowania 2 elementów z zadaną różnicą w tablicy
- 28. Usuwanie znaków z ciągu znaków
- 29. (Ruby) Czy istnieje funkcja do łatwego znajdowania pierwszej liczby w ciągu znaków?
- 30. Liczba zamiany w permutacji
http://stackoverflow.com/questions/352203/generating- permutacje-lazily –
Co oznacza "następna większa permutacja"? Pochodzę z Leetcode, chcę przeszukać znaczenie tej rzeczy. –