【发布时间】:2016-08-01 16:28:55
【问题描述】:
我有一百万个 ASCII 字符串,没有重复,每个最多 7 个字节长。我需要将每个字符串映射到一个正整数。这些 int 中最大的应该不超过一百万。虽然初始化可能很慢,但查找应该很快:给定一个字符串,返回相应的 int(或 -1,如果未找到)。如何在 C++11 中实现这一点?
一种解决方案:将字符串累积成一个std::unordered_map<string,int>;然后遍历地图,从递增计数器分配整数。然后查找,只需unordered_map::find("foo")->second。但它闻起来像其他容器会更快并且开销更少(内置索引,而不是手动编码)。也许unordered_set 和指针算法??
范围限制似乎使完美的哈希变得困难。
(int 的范围受到限制,因为它索引到传递给svm_light 的特征向量。该软件不使用稀疏存储,因此具有数万亿(大部分为零)元素的向量使其内存不足。所以这种从字符串到整数的预处理实现了一种稀疏数据结构。)
【问题讨论】:
-
你能举一个这样的映射例子吗?
-
我错过了什么?
10^6字符串,每个不超过 7 个字节,并且没有重复? -
这不是一个解决方案,但我会将它们放在一个向量中,对其进行排序并使用二进制搜索。
-
马克,O(n) 查找太慢了。 Fran,O(log n) 更好,但仍然比
unordered_map的 O(1) 慢。
标签: string c++11 dictionary svm sparse-matrix