Отказ от ответственности: я понимаю, что совершенно очевидный ответ на этот вопрос HashSet<string>
. Это абсурдно быстро, оно неупорядочено, и его значения уникальны.
Но мне просто интересно, потому что HashSet<T>
является изменяемым классом, поэтому он имеет Add
, Remove
и т. Д .; и поэтому я не уверен, что базовая структура данных, которая делает эти операции возможными, приводит к определенным потерям производительности, когда речь идет о read операциях - в частности, я обеспокоен Contains
.
По сути, мне интересно, каковы абсолютные быстродействующие -образующие структуры данных, которые могут предоставить метод Contains
для объектов типа string
. Внутри или за пределами самой .NET Framework.
Мне интересны все виды ответов, независимо от их ограничений. Например, я могу представить, что некоторая структура может быть ограничена строками определенной длины или может быть оптимизирована в зависимости от проблемной области (например, диапазона возможных входных значений) и т. Д. Если она существует, я хочу услышать об этом.
И последнее: я не ограничиваю это только структурами данных, доступными только для чтения. Очевидно, что любая структура данных для чтения и записи может быть встроена в оболочку только для чтения. Единственная причина, по которой я даже упомянул слово «только для чтения», заключается в том, что у меня нет требования для структуры данных, позволяющей добавлять, удалять и т. Д. Однако, если она имеет эти функции, я выиграл не жалуюсь.
UPDATE
Ответ Морон является отличным примером того, что я ищу. A Trie * определенно выглядит как большая возможность по следующей причине: HashSet<T>.Contains
зависит от GetHashCode
функции некоторого IEqualityComparer<string>
, которая, , насколько Я могу сказать , это O (n) ** по умолчанию в .NET. Другими словами, каждый символ в строке должен быть проверен на HashSet<string>.Contains
, чтобы получить или true
или false
. Для Trie
, только возвращаемое значение true
потребует O (n) для определения ; возвращаемое значение false
потенциально может вернуть намного быстрее.
Это, конечно, гипотетически. До сих пор я не писал и не сталкивался с реализацией Trie в .NET, которая может побить HashSet<string>
при Contains
(хотя реализация, которую я сам написал, довольно близко подошла к алфавиту «a» - «z»). Я просто говорю, это кажется возможным.
* Эта ссылка, кстати, также привела меня к другой интригующей / похожей возможности: DAWG .
** Здесь «n» относится к длине строки.