Как выбрать между картой и неупорядоченной картой?
предположим, я хотел бы сопоставить данные со строкой в качестве ключа.
Какой контейнер я должен был выбрать,map или unordered_map? unordered_map занимает больше памяти, поэтому предположим, что память не является проблемой, и проблемой является скорость.
unordered_map обычно должно давать среднюю сложность O(1) с наихудшим случаем O (n).
В каких случаях он попадет в O(n)?
Когда map получить более эффективное время, чем unordered_map? Это происходит, когда n мало?
предполагая, что я буду использовать STL unordered_map С haser по умолчанию Vs. map. строку-ключ.
если я собираюсь перебирать элементы, а не обращаться к отдельному элементу каждый раз, должен ли я предпочесть map?
4 ответов:
на практике, если память не вопрос,
unordered_mapвсегда быстрее, если вы хотите получить доступ к одному элементу.худший случай является теоретическим и связан с одним хэшем, учитывающим все элементы. Это не имеет практического значения. Элемент
unordered_mapстановится медленнее, как только у вас есть по крайней мере журнал n элементов, принадлежащих к тому же хэшу. Это также не имеет практического значения. В некоторых особых случаях может использовать определенный алгоритм хэширования, который обеспечивает более равномерное распределение. Для обычных строк, которые не используют определенный шаблон, общие хэш-функции поставляются сunordered_mapТак же хорошо.если вы хотите пересечь карту (используя итераторы) в отсортированном виде, вы не можете использовать
unordered_map. Наоборот,mapне только позволяет это, но и может предоставить вам следующий элемент на карте, основанный на приближении ключа (см.lower_boundиupper_boundметодов).
| map | unordered_map --------------------------------------------------------- element ordering | strict weak | n/a | | common implementation | balanced tree | hash table | or red-black tree| | | search time | log(n) | O(1) if there are no hash collisions | | Up to O(n) if there are hash collisions | | O(n) when hash is the same for any key | | Insertion time | log(n)+rebalance | Same as search | | Deletion time | log(n)+rebalance | Same as search | | needs comparators | only operator < | only operator == | | needs hash function | no | yes | | common use case | when good hash is| In most other cases. | not possible or | | too slow. Or when| | order is required|
какой контейнер я должен был выбрать, map или unordered_map? unordered_map занимает больше памяти, поэтому предположим, что память не является проблемой, и проблемой является скорость.
профиль, а затем решить.
unordered_mapобычно быстрее, но это зависит от случая.в каких случаях он доберется до O (n)?
когда хэширование не очень хорошо, и куча элементов назначаются в одни и те же бункеры.
когда является ли карта более эффективной по времени, чем unordered_map? Это происходит, когда n мал?
наверное, нет, но профиль его, если вы действительно заботитесь. Наличие контейнера с небольшим размером является узким местом вашей программы, кажется крайне маловероятным. Во всяком случае, простой
vectorС линейный поиск может быть быстрее для таких случаев.
самое главное при принятии решения-это требования к порядку и отсутствие недействительности итератора. Если вам нужно, вы красивая многое придется использовать
map. В противном случае,unordered_map.
в каких случаях он доберется до O(n)?
если у вас есть такой плохо хэш-функция, которая производит одно и то же значение хэша для всех входных stirngs (т. е. производит столкновения)...
какой контейнер я должен был выбрать, map или unordered_map?
это всегда вопросы требований и вид / количество данных у вас есть.
когда карта становится более эффективной по времени, чем unordered_map?
Это просто разные структуры. Вам лучше сделать chiose, чтобы использовать один из них в зависимости от ваших типичных случаев использования (принимая во внимание, какие данные у вас есть и их количество)
Это hppaen, когда n мало?
в случае небольшого объема данных все зависит от конкретной реализации STL... Поэтому иногда даже простой вектор / массив может быть быстрее, чем ассоциативные контейнеры...
Comments