弦数我有这样的载体获得矢量C++
vector <string> data
data = ["this is", "data that", "is in", "this is", "vector", "vector", "vector"]
我如何得到一个载体(或二维数组),去除重复,而是具有计数每第i个项目吗?
即
results = [("this is", 2), ("data that", 1), ("is in", 1), ("vector", 3)]
弦数我有这样的载体获得矢量C++
vector <string> data
data = ["this is", "data that", "is in", "this is", "vector", "vector", "vector"]
我如何得到一个载体(或二维数组),去除重复,而是具有计数每第i个项目吗?
即
results = [("this is", 2), ("data that", 1), ("is in", 1), ("vector", 3)]
直截了当的解决办法是,以独特的价值观和他们的计数积累到地图:
std::map<std::string, std::size_t> results;
std::for_each(begin(data), end(data), [&](std::string const& s)
{
++results[s];
});
这有linearithmic(N LG n)的时间复杂度,但因为它必须复制每个不同的字符串值,可能会相当昂贵。您也可以就地对列表进行排序,然后计算每个值的数量,如果您的移动感知实现为std::string
,那么该值可能会更好。
您也可以使用'std :: reference_wrapper
哈希表怎么样? http://en.wikipedia.org/wiki/Hash_table(复杂性O(n)) –
@MihaiTodor:只需将'std :: map'更改为'std :: unordered_map' – Blastfurnace
Xeo,我尝试了很多方法。即对于数据中的每个字符串s,查看数据中的其余元素,并且针对s的每次匹配增加计数。看起来像这是O(n^2),但我正在寻找更有效的东西 – CyberShot
您可能想尝试'std :: map'...您可以通过字符串进行索引,并将计数器增加为需要。 'map'按键(这里是字符串)排序,不能有重复。采取未排序的列表/字符串矢量并填充地图是O(N x log2N)操作。 –
这听起来像是一个碰撞(哈希)表给我。尝试查找它。 –