2013-10-25 4 views
0

У меня есть 300 строк, которые нужно хранить и искать, и что большинство из них идентичны по характеру и длине. Например, у меня есть строки «ABC1», «ABC2», «ABC3» и т. Д. и другой набор, подобный sample1, sample2, sample3. Поэтому я немного смущен, как хранить их, как использовать массив или хеш-таблицу. Моя основная забота - время, которое я беру для поиска строки, когда мне нужно вытащить ее из хранилища. Если я использую массив, мне нужно будет провести сравнение строк по всему индексу для меня, чтобы достигнуть одного. Теперь, если я пойду и внедряю хэш-таблицу, мне придется позаботиться о столкновениях (очевидно) и что мне придется внедрить цепочку для хранения идентичных строк.Самый быстрый способ поиска строки

Так я вроде ищу некоторые предложения взвешивая плюсы и минусы каждого из них и прийти к лучшей практике

+2

Любые причины, по которым вы хотите реализовать свой собственный контейнер, а не использовать стандартный? – benjymous

+1

Зачем вам * реализовать * хэш-карту?!? –

+0

Если вам не нужно выполнять сравнение несколько тысяч раз в секунду, используя обычную 'std :: string', в стандартном контейнере, и их просто должно быть достаточно. Ключевое слово здесь: * benchmarking! * –

ответ

1

Это зависит от того, насколько меняются ваши данные. С этим я имею в виду, если у вас есть 300 индексных строк, которые ссылаются на другую строку, как часто эти 300 строк индекса меняются?

Вы можете использовать std :: map для быстрого поиска, но карта будет требовать больше ресурсов, когда она будет создана в первый раз (по сравнению с массивом, вектором или списком).

Я использую карты в основном для каких-то динамических таблиц поиска (например: ip to socket).

Так что в вашем случае это будет выглядеть следующим образом:

std::map<std::string, std::string> my_map; 
my_map["ABC1"] = "sample1"; 
my_map["ABC2"] = "sample2"; 

std::string looked_up = my_map["ABC1"]; 
+0

Я использовал unordered_maps в linux. его довольно легко. Но теперь я встраиваюсь туда, где есть ограничения памяти. Я не уверен в том, что над головами участвуют в использовании карты. Lik – payyans4u

+0

При разработке встроенного программного обеспечения хорошо подумать о будущем. Но, прежде чем тратить дни на запись реализации с небольшим размером, вы должны попробовать перейти на STL и только оптимизировать, если узнаете, что у вас/будет нехватка ресурсов. Но это сильно зависит от того, какой SOC вы используете. –

2

Поскольку ключи короткие как правило, имеет общий префикс, который следует рассмотреть Radix структуру данных, такие как синтаксическое дерево Patricia троичного дерево поиска (Google этих , вы найдете множество примеров). Время для поиска этих структур имеет тенденцию быть O (1) по отношению к # элементам и O (n) по длине ключей. Остерегайтесь, однако, что длинные строки могут использовать много памяти.

Время поиска похоже на хэш-карты, если вы не рассматриваете разрешение столкновений, что не является проблемой при поиске по методу радикса. Обратите внимание, что я рассматриваю время, чтобы вычислить хэш как часть стоимости хэш-карты. Люди склонны его забывать.

Один недостаток - это структуры счисления, не имеющие кэш-памяти, если ваши ключи имеют тенденцию отображаться в случайном порядке. Как уже упоминалось, если время поиска действительно важно: измерьте производительность некоторых альтернативных подходов.

+0

Я не хочу динамически выделять память, если у меня есть опция. Похоже, что у меня есть структура и строка, которую я хочу найти, является частью структуры вроде ...struct details {std :: string strX} .... так что вроде как я должен хранить «abc» в структуре и использовать то же самое, что и ключ для поиска имеет смысл. Но тогда сколько потребуется дополнительной памяти, если i перейдите с картой, где в моем ключе будет строка th, а затем значение будет внутри структуры. – payyans4u

+0

Если ваша программа загружает строки в структуру во время запуска и новые клавиши не добавляются «на лету», нет необходимости выделять память ПОСЛЕ создания таблицы поиска. Если вы хотите избежать выделения памяти во время запуска, вам также придется наложить некоторые серьезные ограничения на ваши данные (независимо от того, какой метод вы используете) и выделить необходимое пространство во время компиляции. –

Смежные вопросы