映射比稀疏向量更好?

Posted

技术标签:

【中文标题】映射比稀疏向量更好?【英文标题】:map better than sparse vector? 【发布时间】:2013-01-16 00:43:48 【问题描述】:

我有 2 个对象:

vector<string> v(999999);
map<int, string> m;

我需要存储一些索引字符串对,尽管它非常稀疏(比如只有 20 对)。我想知道 vector 是否比 ma​​p 占用更多的内存?如果是这样,向量占用了多少内存?为什么在这种情况下使用矢量不好?

【问题讨论】:

那不是稀疏向量 【参考方案1】:

是的,向量在实践中至少会占用999999 * (sizeof(string) + C) + sizeof(vector) 字节(其中Cstring 自动执行的任何动态分配)。 map 会有开销,但绝对不会接近 999999 的顺序。

【讨论】:

您可能无法按关键顺序访问该地图的元素,具体取决于其实现。 @Peter Wooster 如果有要求,可以保留一个单独的向量,其中包含正确顺序的映射迭代器。 我同意需要单独的键列表,我相信这是第三方稀疏数组系统通常会做的事情。它需要允许插入,因此需要链表而不是数组。 @PeterWooster:std::map 要求键以键/谓词顺序迭代。【参考方案2】:

如果查找时间绝对很关键,我想你可以使用向量,因为它在向量上是常数,有效的指针算术,因为你已经知道索引,但随着地图上的大小而增长(O(log n))。不过,这种折衷的情况确实很糟糕。

【讨论】:

【参考方案3】:

对于大约 20 个元素,创建一个包含 10^6 个元素的向量是没有意义的。使用地图将有更好的内存占用,甚至可能比矢量更快。您还可以考虑使用包含键/值对的向量 std::pair&lt;int,std::string&gt; 的混合方法,并对向量进行线性搜索(20 个元素非常少,足够少,您可以将成本视为常数,并且更简单的算法可能会补偿额外的操作数)。

【讨论】:

以上是关于映射比稀疏向量更好?的主要内容,如果未能解决你的问题,请参考以下文章

将 alloca() 用于可变长度数组是不是比在堆上使用向量更好?

获取向量的最后 n 个元素。有没有比使用 length() 函数更好的方法?

密集向量与稀疏向量

稀疏向量与密集向量

spark 类标签的稀疏 特征向量

稀疏向量的一些内容