Sprawdziłem wiele literatury, ale nie znalazłem żadnych informacji o usuwaniu lub wstawianiu podciągów do drzewa sufiksów. Istnieją tylko algorytmy Ukkonena lub McCreighta do budowania drzewa.
Najbiedniejszym sposobem jest odbudowanie drzewa po usunięciu lub wstawieniu podciągu. Ale myślę, że jest to najlepszy sposób na zrobienie tego.
Na przykład (pozycje są liczone od 0):
Mam drzewo przyrostków z "abcdef" i muszę usunąć symbole od 1 do 3. A potem będę mieć drzewo przyrostków z "aef". A następnie muszę dodać z pozycji 1 ciąg "jak". A potem będę miał drzewo przyrostków z "aasef". Czy możesz mi pomóc?Jak usunąć podciągi z drzewa sufiksów?
Odpowiedz
mieszacie dwa zadania w pytaniu, najpierw szukacie bohatera, a następnie zastępujecie go. Drzewo przyrostków wykonuje pierwszą część szukania dla ciebie, teraz potrzebujesz drugiego algorytmu, który zastąpi tę postać nowym znakiem. Gdy znaki zostaną zastąpione, oryginalne drzewo sufiksu staje się nieważne, więc drzewo musi zostać ponownie zamapowane, aby wykonać drugie zastąpienie.
Potrzebne są dwie rzeczy, pierwsza "tablica sufiksów" da ci większą kontrolę nad wyszukiwaniem znaków i ich lokalizacją, druga to "algorytm pamięci podręcznej", który pomoże ci w zastąpieniu.
Dopiero co zacząłem pracować z drzewkami przyrostków, więc mogę się mylić, ale wygląda na to, że wstawienia lub usunięcia mogą zmienić drzewo na dość radykalny sposób.
„abcdef” jest naprawdę trywialne drzewo przyrostek:
abcdef
├a..$
├b..$
├c..$
├d..$
├e..$
└f$
Dodawanie „g” na końcu lub usuwając „a” na początku jest niezwykle łatwe.
Ale powiedzieć, że wpakować kolejny „a” w środku:
abcadef
├a
│├b..$
│└d..$
├b
├c
├...
Musimy wrócić i sprawdzić każdy list od samego początku, aby zobaczyć czy musimy wstawić węzeł na podstawie tego. Samo, jeśli mamy znak od końca:
abafef
├a
│├bafef$
│└fef$
├bafef$
├f
│├ef$
│└$
└ef$
Jeśli teraz dodaje coś jak „ef” do końca, trzeba przejść i dodać nowe węzły w każdym miejscu!
Wstawienie postaci wygląda tak, jakby wymagało ponownego rozpatrzenia każdego znaku w ciągu, tj. Czasu liniowego. Ponieważ algorytm Ukkonena zajmuje już czas liniowy, nie powinien być wart wykorzystania algorytmu dynamicznego wstawiania, powinieneś tylko zregenerować drzewo od początku za każdym razem z przekonaniem, że jest to wciąż całkiem dobre.
Jeśli nie dbasz o przestrzeń, zawsze możesz buforować każdy krok algorytmu generowania drzewa, a następnie, gdy przychodzi czas na wstawienie lub usunięcie w punkcie x, po prostu załaduj drzewo jako skonstruowane do punktu x .
- 1. Szukasz implementacji drzewa sufiksów w języku C#?
- 2. Jak usunąć elementy z drzewa
- 3. python: biblioteka dla uogólnionych drzewek sufiksów
- 4. Jak usunąć określone podciągi ze zbioru ciągów w języku Python?
- 5. git: usunąć zdalną gałąź drzewa z lustrem
- 6. Znalezienie powtarzające podciągi
- 7. Jak usunąć klucz z drzewa clojure za pomocą widma?
- 8. Jak mogę usunąć przestrzenie nazw z drzewa lxml?
- 9. Kierownice - podciągi
- 10. Jak przekazać podciągi przez odniesienie?
- 11. Wyciąg podciągi w Pythonie
- 12. Usuwanie podciągi „dynamicznie” z linii w C#
- 13. wydobywające podciągi w C
- 14. Jak znaleźć wszystkie podciągi z ciągu znaków w PHP
- 15. Jak mogę wyodrębnić podciągi z łańcucha w Perlu?
- 16. Jak wyciąć podciągi z ciągu znaków w tcl
- 17. Jak usunąć podciągi po określonym znaku w łańcuchu za pomocą Ruby?
- 18. Jak usunąć/usunąć push z Bitbucket?
- 19. Jak usunąć/usunąć aplikację z projektu Firebase?
- 20. Jak zrobić interaktywny wykres drzewa z d3?
- 21. Jak obliczyć współczynnik błędów z drzewa decyzyjnego?
- 22. Jak zbudować dendrogram z drzewa katalogów?
- 23. Jak wyodrębnić strukturę drzewa z funkcji Ctree?
- 24. Implementacja drzewa binarnego drzewa javascript
- 25. SQL: Dołącz do tabel na podciągi
- 26. Wyjście z drzewa wiersza poleceń
- 27. Jak podzielić ciąg na podciągi w systemie iOS?
- 28. Sprawdź, czy ciąg zawiera jakiekolwiek podciągi z tablicy
- 29. zastępcze podciągi używania słownika w Pythonie
- 30. Widok drzewa jQuery z sortowalnym
Cn być bardziej szczegółowy? Z tego co widzę wstawiłeś ciąg "abdc", a teraz chcesz go "abd" (usunąć podłańcuch) lub "abced" (wstawić podciąg), prawda? – ElKamina
tak, masz rację. – user2386656
Możesz dodawać/usuwać podciągi podczas aktualizacji tablicy przyrostków korespondencji: ["Dynamiczne rozszerzone tablice przyrostków"] (http://www-igm.univ-mlv.fr/~lecroq/articles/jda2009. pdf) (pdf). Nie można jednak nic powiedzieć o drzewkach sufiksów. –