Pierwsza myśl. Możesz określić długość n
ciągu w O(log2(n))
.
- Sprawdź
Z*
gdzie Z
reprezentuje k
znaki zapytania zaczynające się od 0, 1, a następnie podwojenie liczby znaków zapytania z każdego czeku, dopóki nie nastąpi dopasowanie. n
musi znajdować się pomiędzy k/2
i k
- Znajdź dokładną długość, używając tego samego wzorca zmieniającego
k
w taki sam sposób, jak w przypadku wyszukiwania binarnego.
Znajomość dokładnej długości może pomóc w dokonaniu pewnego rodzaju podział-et-impera w dziedzinie przestrzeni.
UPDATE
Jeśli znasz długość, można użyć tego samego wzorca, aby prawidłowo zlokalizować symbol.
Przykład:
..X. ..XX (spaces added for readability)
+ symbol may be X
- symbol is not X
X symbol is X
*X* => MATCH ++++ ++++
*X* ???? => MATCH ++++ ++++
*X*?? ???? => NO MATCH --++ ++++
??X? ???? => MATCH --X+ ++++
??XX ???? => NO MATCH --X- ++++
??X? *X*?? => NO MATCH --X- --++
??X? ??X? => MATCH --X- --X+
??X? ??XX => MATCH --X- --XX
Dla długości n
i alfabetu strun wielkości m
zajmie to około O(log2(n))
znaleźć długość łańcucha, o O(n • log2(n))
prawidłowo umieszczać n
symbole i O(m)
znaleźć używane symbole - sumując wszystkie razem plony O(n • log2(n) + m)
.
Mogę sobie wyobrazić, że można to przyspieszyć, łącząc kilka kroków - może przetestować używane symbole podczas określania długości ciągu lub jednocześnie lokalizując dwa (lub nawet więcej?) Symbole w pierwszej i drugiej połowie ciągu . Będzie to wymagało ponownego sprawdzenia połączonych kroków w izolacji, jeśli sprawdzenie nie powiedzie się, aby ustalić, który z testów zakończył się niepowodzeniem. Ale tak długo, jak sprawdza się fuzja połączona, zyskujesz informacje na temat obu.
Może policzę to jutro, żeby sprawdzić, czy to naprawdę przyspieszy.
Kilka różnych pytań dotyczących ciągu znaków: Co to może być zestaw znaków? Tylko litery lub są dozwolone inne znaki? Jak długo może być sznur? Czy ma mniejsze/większe znaczenie? – schnaader
Naprawdę nie rozumiem, w jaki sposób te informacje pomogą ci znaleźć skuteczny algorytm, ale ponieważ zapytałeś - w moim konkretnym przypadku, ciąg jest nazwą hosta internetowego, więc jest to alfanumeryczny i kilka takich symboli. i -. –
Obudowa nie ma znaczenia -? dopasowuje dokładnie jeden symbol, * dopasowuje zero lub więcej symboli, a każdy inny symbol pasuje dokładnie do tego symbolu (jeśli nie jest rozróżniana wielkość liter, można traktować symbole małych i wielkich liter jako równe). Alfabet również nie ma znaczenia (z wyjątkiem tego, jak sobie poradzić? I * w alfabecie). Interesujące może być, jeśli istnieją jakieś założenia dotyczące rozmiaru alfabetu, długości struny, częstotliwości symboli lub stosunku rozmiaru alfabetu do długości napisu. –