вот такой код Код (Text): #include <Windows.h> #include <hash_map> int main() { stdext::hash_map<size_t, size_t> hm; for (int i = 0; i < 1024; ++ i) { hm.insert(stdext::hash_map<size_t, size_t>::value_type(my_rand(), i)); } } даёт 330 коллизий. my_rand() - возвращает рандомное 32 битное число. на 1000 элементов 300 коллизий!
Коллизии вообще ни при чем, нужно смотреть среднюю длину списка. hash_map к тому же меняет свой размер при таком добавлении. А вдруг там получилось 400 списков из одного элемента и 300 списков из двух элементов, вот вам и 300 коллизий. А средняя длина списка ~1.5 P.S. Вот такой код налабал у себя: Код (Text): stdext::hash_map<size_t, size_t> hm; for (int i = 0; i < 1024; ++i) { rnd_next(); hm.insert(stdext::hash_map<size_t, size_t>::value_type(rnd_seed, i)); } printf( "Buckets count: %d\r\n", hm.bucket_count() ); int k = 0; int n = 0; for (int i = 0; i < hm.bucket_count(); ++i ) { if (hm.bucket_size( i ) > 0) { n += hm.bucket_size( i ); ++k; } printf( "Bucket %d: %d elements\r\n", i, hm.bucket_size( i ) ); } printf( "Average list length: %.3f", double( n ) / k ); Получилось на 1024 элемента он сделал 256 ячеек таблицы, средняя длина списка - чуть больше 4. P.P.S. Хотя если в самом начале добавить вызов Код (Text): hm.rehash(1024); то средняя длина списков уменьшается до 1.5. И таблица не будет лишний раз перестраиваться при добавлении элементов.
в данной задаче хашмапа всё-равно не подходит, т.к. элементы должны быть отсортированы. можно, конечно, что-то напрядумывать с сортированным массивом вместо списка.. хз..