Давайте рассмотрим компромиссы перед любыми предложениями.
Вы говорите, что вам нужно хранить «миллионы» путей.Я возьму миллион, потому что это облегчает вычисления (и даже на серверах я не видел больше миллиона каталогов).
Как долго эти пути?Вы показали пример с очень короткими путями, поэтому мы ищем около ста мегабайт для хранения этих миллионов путей.У меня нет ссылки на максимальную длину пути, но 256 символов запоминаются.Таким образом, ваши пути займут максимум 512 Мб памяти.У вас так много памяти?
Насколько равномерно распределены пути?Другими словами, соблюдаете ли вы правило 80:20, когда 80% путей находятся в 20% каталогов?Причина, по которой я спрашиваю, состоит в том, что структуре три требует некоторой формы индекса между уровнями.Если у вас много каталогов с несколькими путями под ними, у вас будет много накладных расходов для поддержки дерева.
Рекомендации: если бы у меня было достаточно памяти, я бы использовалHashSet<String>
и покончим с этим.
Если у меня не было много памяти и структуры каталогов, которая следовала правилу 80:20 (или, скорее, 95: 5), я 'Я думаю о HashMap<String,Set<String>>
.Ключом этой карты будет самая длинная строка начального пути с «разумным» количеством дубликатов, а значениями будут оставшиеся строки.Вы будете исследовать эту карту с постепенно сокращающимися ведущими компонентами, пока не найдете совпадение, а затем исследовать набор для остатка.
Это оставляет открытым вопрос о "разумном" дублировании.Это объем дублирования, при котором издержки двухэлементной структуры данных преодолеваются за счет сокращения дублирования.Например, /usr/bin/
может быть допустимым (потому что он содержит тысячи файлов и вы сохраняете 9 символов или 18 байтов от каждого), но /usr/local/bin/
, вероятно, не будет (по крайней мере, в моей системе, он содержит только один файл).