【发布时间】:2015-10-10 18:17:22
【问题描述】:
我想对一个巨大的数组进行排序,比如 10^8 个 X 类型的条目,最多 N 不同的键,其中 N 约为 10^2。因为我不知道元素的范围或间距,所以计数排序不是一个选项。所以到目前为止我最好的猜测是使用哈希映射来计算这样的计数
std::unordered_map< X, unsigned > counts;
for (auto x : input)
counts[x]++;
这很好用,比 3 路快速排序快 4 倍,但我很紧张,仍然不够快。
我想知道:我错过了什么吗?我可以更好地利用N 提前知道的事实吗?或者是否可以根据我的需要调整哈希映射?
EDIT另外一个前提条件是输入的序列排序不好,并且按键的频率大致相同。
【问题讨论】:
-
在开始添加到哈希表之前可以调用reserve(N)吗?
-
键是否连续?你是只知道他们的数量,还是知道他们的价值观?
-
@IVlad 我试过了。但是,对我的地图实现几乎没有影响。
-
for (auto const& x : input)会避免复制它应该更快 -
你可以试试比
std::unordered_map更优化的哈希表,比如谷歌的dense_hash_map。有时使用比std::hash更好的哈希函数也有帮助。
标签: algorithm performance sorting c++11 stdvector