Potrzebuję szybkiej metody do określenia, czy dany ciąg znajduje się na liście ciągów.Szybkie porównywanie ciągów z listą
Lista ciągów znaków nie jest znana do czasu wykonania, ale po tym czasie nie ulegnie zmianie.
I może po prostu mieć List<String>
nazywa strings
a następnie wykonaj:
if (strings.Contains(item))
Jednak to będzie działać źle, jeśli istnieje wiele ciągi w wykazie.
Mogę również użyć HashSet<String>
, ale wymagałoby to wywołania GetHashCode
na każdym przychodzącym łańcuchu, a także Equals
, który byłby stratą, gdyby istniały np. tylko 3 ciągi na liście. Czy wspomniałem, że musi to być szybko?
mogę podczas konfigurowania zdecyduje się użyć List
lub HashSet
zależności od liczby łańcuchów (na przykład wykorzystanie listy mniej niż 10 Ciągi HashSet inaczej), a jak logika HybridDictionary
.
Ponieważ łańcuchy są w formacie Unicode, standardowa struktura Trie nie zadziała, chociaż może być to drzewo Radix/Patricia. Czy są jakieś dobre implementacje C# z benchmarkami?
Niektórzy wspomnieli o obejściu String
GetHashCode
i użyciu szybciej działającej funkcji skrótu. Czy są tam jakieś testy porównawcze?
Używanie wyrażeń LINQ do stworzenia zoptymalizowanego przełącznika jest nowatorskim podejściem, które wygląda bardzo interesująco.
Co jeszcze by zadziałało? Koszt instalacji nie jest ważny, tylko prędkość wyszukiwania.
Jeśli to ma znaczenie, przychodzące wartości ciągów rzadko pojawią się na liście.
Zaktualizowałem swoją odpowiedź, dodając linki do informacji o złożonych próbach dla Unicode. –