2013-05-23 2 views
-2

Предположим, что sizeof(void*) == sizeof(size_t) и что хэширование указателя просто отливает его в size_t. Поэтому я хочу знать, содержит ли мой набор элемент, который будет быстрее std::set<void*> или std::unordered_set<void*>?Для операции count(). Что быстрее std :: set <void*> или std :: unordered_set <void*>?

Я знаю, как работает std::set, но я не знаком с std::unordered_set. Ну, я знаю, что неупорядоченный набор использует хеширование и ведра и что, если пересечение не происходит (это мой случай), сложность O (1). Но я не знаю, насколько это постоянная сложность.

Если количество дней в контейнере имеет значение, в моем фактическом сценарии используется менее ста¹. Но мое любопытство касается обоих случаев с несколькими элементами и множеством элементов.

¹ Количество элементов настолько мало, что даже std::vector будет выполнять штраф.

+0

Хэш-таблицы, как правило, используют больше памяти для обеспечения доступа за меньшее время. –

+0

http://stackoverflow.com/questions/1349734/why-on-earth-would-anyone-use-set-instead-of-unordered-set –

+2

Почему бы вам просто не сравнить сложность интересующих вас операций и решите в соответствии с этим? См. ['Unordered_set'] (http://en.cppreference.com/w/cpp/container/unordered_set), [' set'] (http://en.cppreference.com/w/cpp/container/set) , и, возможно, также ['vector'] (http://en.cppreference.com/w/cpp/container/vector). – syam

ответ

8

Я думаю, что важно немного в маленьком примечании:

Количество элементов настолько мало, что даже std::vector будет выполнять хорошо.

std::vector больше кэша дружественный чем std::set и std::unordered_set, поскольку она выделяет его элементы в непрерывной области памяти (это предусмотрено в стандарте).

И хотя поиск и сложность вставки хуже для std::vector чем для std::set или std::unordered_set (линейный по сравнению с O (журнал N) и амортизируется O (1), соответственно), расположение данных и более высокая скорость хит кэш вероятно, будут доминировать над вычислительной сложностью и повысить производительность.

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

Как всегда, измеряет различные альтернативы до того, как вы совершите сделку, и всегда предпочитаете более простой дизайн, если у вас нет доказательств того, что оно представляет собой узкое место, препятствующее выполнению вашим заявлением требований к производительности.

+1

+1 для «меры» - это то, что люди должны понимать. Еще один момент, который вы, возможно, захотите добавить, состоит в том, что если вставки встречаются редко и часто встречаются, сортируемый std :: vector может быть способом, используя std :: binary_search, искать и вставлять вещи; таким образом вы получаете O (log n) и локальность кеша для поиска и O (n) для вставок. – cristicbz

+0

@cristicbz: Хорошая точка. Я думаю, что ваш комментарий, будучи первым после ответа и имеющим мой +1, будет замечен и учтен даже без редактирования ответа;) –

2

unordered_set имеет большую локальность кэша, чем set во многих реализациях. Но так как количество элементов настолько мало в вашем случае, то vector, вероятно, полностью впишется в кеш, что делает его лучшим выбором, несмотря на сложность поиска элементов (O).

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