![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Stl: нужен контейнер для быстрого поиска по имени? map?
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
map обеспечивает поиск логаритмической сложности. В принципе да - ассоциативный контейнер (либо отсортированный обычный контейнер - даст возможность применить бинарный поиск). Добавлено через 2 минуты и 52 секунды В принципе можно немного ускорить саму операцию сравнения - хранить вместо имени - числовой хеш. Сравнение чисел быстрее чем сравнение строк. Все зависит от задачи. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
если не нужно получать элементы в определенном порядке, а нужно только быстро искать их по имени, то лучше использовать hash_map
![]() |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
У меня в файле храняться данные о пользователях:
надо организовать быстрый поиск по имени пользователя. |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Alca
Думаю тут можно применить хеш ![]() если нестандартные решения подходят если нет - хешируйте имя пользователя сами. http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%...%BD%D0%B8%D0%B5 Это сообщение отредактировал(а) azesmcar - 7.5.2009, 10:41 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
если известны данные, что имя может начинаться с буквы из определенного множества, то можно сделать массив map-ов, нечто вроде vector<map<string>> , где индексом в vector будет первая буква имени. Т.о. мы существенно уменьшим количество данных в отдельной карте и увеличим скорость, в ущерб, конечно, памяти.
Аналогично можно делать vector<vector<.....<map>>...> .... - главное фантазия. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Мне кажется, что при большом количестве имен при таком подходе получится кака, т.к. не получится равномерно распределить все имена. Они имеют подлую особенность начинаться с одинаковых букв. Может и не получиться "существенно уменьшить количество данных в одной карте". Или я неправ?
--------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Кол-во строк в файле порядка 1000 -1500.
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
двоичный поиск даст максимум 10-11 сравнений. это довольно быстро. думаю отсортированный массив вполне подойдет |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Получилось префиксное дерево (trie). Дальше фантазия может работать в сторону Patricia и ternary search tree. Впрочем, не думаю, что топикстартеру при такой постановке задачи нужно что-то кроме хэш-таблицы. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Типа эксесса? |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
для 1000-1500 записей? там мап и хэш таблица особой разницы не дадут. Там порядке 10 сравнений, для подсчета хэша потеряем больше чем получим прироста при поиске на мой взгляд..хотя надо проверить, но по любому отходить от стандарта ради пары десятка милисекунд думаю не стоит. Добавлено @ 13:04
почему? ну пусть каждая структура в среднем ..ну пусть будет 100 байт. Пусть будет 2000 записей, 2000*100=20000, делим на 1024 получаем где-то 20 килобайт..учитывая некоторые затраты памяти требуемые ассоциативными контейнерами, пусть будет 25 килобайт, не больше..это что, так страшно? на мой взгляд не очень ![]() Это сообщение отредактировал(а) azesmcar - 7.5.2009, 13:06 |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
задача мелкая, изобретений не стоит.
Alca, тестирование уже показало, что требуется оптимизация? если нет - возьми простейшую реализацию. Lazin,
не совсем. во-первых это не идеально сбаласированные деревья, во вторых там больше накладные расходы на одну проверку. да и памяти больше требует. Это сообщение отредактировал(а) baldina - 7.5.2009, 13:23 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |