![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| afx33sd |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 20.8.2013 Репутация: нет Всего: нет |
Стоит задача быстрого нахождения элемента по ключу. Использую stl. Для реальной задачи он должен быть достаточно большой.
Стоит ли делать такой большой ключ или лучше сделать хэш-таблицу для этого случая, или map, где в качестве значения список c разными id. Тут надо сказать, что различных id планируется немного, а в большинстве случаев это будет массив нулей. Мне кажется, что в большом ключе страшного ничего нет, если значения в общей массе будут различаться в начале области памяти, a less делать каким-нибудь memcmp. + Еще такой вопрос: как сыграет на производительности, если сделать в качестве ключа структуру с двумя конструкторами - ну очень уж удобно. Я пока не понимаю как это все в памяти лежит, где указатели на методы и т.п. Читаю ABI, но пока понимая нет.
Спасибо. |
||||
|
|||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
||||
|
|||||
| afx33sd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 20.8.2013 Репутация: нет Всего: нет |
Количество элементов не больше 65535.
Это да. Если нет полиморфизма, то размер ключа будет размер величине данных, так? Это я все думаю о размере и как он будет влиять на сложность поиска и вставки. Думаю, что фактически размер ключа влияет только на скорость сравнения элементов. Следовательно, если я буду сравнивать до первого расхождения и данные ключа расположить по степени редкости этого расхождения, то вполне можно оставить map с таким ключом. |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Максимальное количество не сильно интересно. Скорей интересно среднее-взвешенное (с вероятностью 80% количество элементов будет от 10-20 или от 10000 до 20000).
memcmp именно так и работает - до первого расхождения. |
||||
|
|||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А вот и не так. Для составных ключей, если мне память не изменяет, есть не map, а multimap. А иначе получится такая вещь. Для контейнеров существуют свои алгоритмы поиска и так далее по списку. В случае если вы закидываете в стандартный контейнер некую структуру с дополнительными условиями сортировки и поиска, для которого используете свой алгоритм (у которого есть примерный показатель затратности опреаций поиска и сортировки), это всё может наложиться на сопутствующие действия контейнера и привести к довольно неожиданным для разработчика результатам. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
ну не совсем скорость вставки и поиска в std::map зависит от алгоритма сравнение обьектов типа, который используется для ключа. Это сообщение отредактировал(а) SenkraD - 20.8.2013, 15:06 |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Во-во, а то я уже обрадовался, что что-то знаю) -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |