Какви са действителните компромиси от използването на колекция тип хеш таблица като std::unordered_map срещу std::set?
За нещо случайно, върху което работя (в C++), имам зададен проблем с пресичане на идентифициране на дублирани елементи от двойка големи списъци.
Първото ми предположение беше да премина през първия списък и да вмъкна всеки в std::unordered_map<T, bool>
или (std::hash_map), където стойността на параметъра при вмъкване винаги е true
. След това направете справки в hash_map за всеки елемент във втория списък. Работното предположение е, че всяко вмъкване е O(1) и всяко търсене също е O(1).
Тогава започнах да мисля, че може би std::set е по-подходящ. Някои повърхностни търсения онлайн разкриват, че реализацията на std::set е червено/черно истина и че вмъкванията и/или търсенето може да са във време на изпълнение O(lg n) вместо O(1). (Вярно ли е?)
Предполагам, че компромисите между всеки може да са използването на паметта и използването на функция за хеширане (срещу директно сравнение). Действителният тип на данните, които използвам, е просто unsigned int. Мога да си представя, че динамиката на този проблем може да се промени въз основа на по-сложен тип с различна функция за хеширане.
std::unordered_set
? - person T.C.   schedule 13.06.2014bool
, което трябва да бъдеtrue
, за да може елементът да се брои. Колко допълнителните записи, допълнителните тестове и допълнителното пространство заbool
биха попречили на производителността, зависи от точните числа и точното изпълнение. - person Deduplicator   schedule 13.06.2014std::set_intersection
или нещо подобно? Ако трябва да бъда честен, както хеш-таблиците и двоичните дървета за търсене се използват прекалено много. Нямате нужда от тях в много случаи, които си мислите, че имате. Също така: какъв тип данни еT
? - person user541686   schedule 13.06.2014