W jednym z wywiadów poproszono mnie o stworzenie struktury danych, która może pomieścić miliony wzorów i umożliwia szybkie wyszukiwanie, aby znaleźć najdłuższy pasujący.Struktura danych dla dużej liczby wzorów
Na przykład, wzory są jak:
1- 8876 8893 87 | true
2- 8876 889 | false
3- 8876 8 | false
4- 887 | true
Wejście jest liczbą z co najmniej 2 i co najwyżej 18 cyfr i musimy znaleźć najdłuższe dopasowanie wzorca ze struktury danych i wyodrębnić wartość logiczną na koniec.
Na przykład 8876 8893 9943 53
będzie pasować do 1
i zostanie zwrócona true
. 8876 8397 5430 74
zostanie dopasowany do 3
i zostanie zwrócona false
.
Moja odpowiedź polegała na używaniu drzewa i posiadaniu listy key value
pary na każdym poziomie. Klucz będący cyframi i wartościami ma wartość null lub jest równa wartości logicznej, w zależności od tego, czy jest to koniec wzorca, czy nie. Podobnie jak:
# matching 8875
# start the search by first digit
[..., (7, null), (8, null), (9, null)]
^
[..., (7, null), (8, null), (9, null)]
^
[..., (7, true), (8, null), ...]
# at the last step because we don't have a pattern
# to match the digit 5, we return the `true` from (7, true)
Najtrudniejszą częścią jest to, że wzory są całkiem spore. Miliony z nich. Czy to jest dobre? Jeśli nie, jaka jest Twoja sugestia.
wypróbuj prefiks trie – Alex
@Alex, czysty złoty człowiek. Kiedyś jedno słowo otwiera nowy świat. Wielkie dzięki. Zgodzę się nawet na odpowiedź, jeśli chcesz ją opublikować. – paytonpy
ok, dodam to jako odpowiedź, również po to, aby pytanie "zamknęło się" zaakceptowaną odpowiedzią. – Alex