我有一个整数向量。我想在向量中计算相同的整数。我需要一个简单的算法。但是不需要使用太多的头文件或内置函数,只需要一个简单的算法。 非常感谢 例如:
std::v={1,1,1,2,2,3} 1:3----2:2----3:1
答案 0 :(得分:2)
Sort他们,然后计算以下数字的每个更改。
可选:将计数保存到输出数组。
在排序后尝试:
int count = 1;
for(int i = 1; i < v.size(); i++)
{
if(v[i-1] == v[i])
{
count++;
}
else
{
std::cout << v[i-1] << count << std::endl;
count = 0;
}
}
std::cout << v[v.size()-1] << count << std::endl;
答案 1 :(得分:1)
至少有两种方法,最常见的解决方案是在O(n log n)时间内运行,这需要您对数组进行排序,然后迭代它以计算最长的运行时间,如@ yd1所述。
另一种方法是使用哈希表来生成频率表。这在O(n)时间内运行(假设O(1)哈希表插入和查找)但由于设置哈希表并需要重新分配哈希表(以及冲突等)的开销,因此对于小输入向量长度来说是次优的。 / p>
你不需要#include <unordered_map>
使用散列表:自己实现一个是本科生练习:)但你必须做很多工作才能获得最低限度的必要功能。< / p>
但是,如果您可以保证向量中的值范围在某个合适的范围内(例如0 <= i < 256
),那么您可以将数组用作映射:
vector<int> values = ...
int table[256] = {0};
for( auto i = values.begin(); i != values.end(); ++i ) {
assert( 0 <= i && i < 256 );
table[*i]++;
}
然后迭代table
以获得相同的值:
for( size_t i = 0; i < 256; ++i ) {
if( table[i] > 1 ) cout << i << " appeared " << table[i] << " times." << endl;
}
答案 2 :(得分:0)
另一个解决方案是创建从int到int的附加字典。并将数字(作为键)从向量插入到字典中。如果存在数字,则应增加相应给定密钥的值。
请注意。这个字典(map)保持你向量的整数出现次数
方法的缺点(从您的角度来看) - 您应该包含地图标题。
这种算法的总体复杂性是O(N log N)。也许这种算法比使用sort更快。你不会使用一个额外的遍历。并且您有结构,其中包含有关数字出现的信息