在向量中找到相同整数的数量

时间:2016-10-28 06:55:26

标签: c++ vector mod

我有一个整数向量。我想在向量中计算相同的整数。我需要一个简单的算法。但是不需要使用太多的头文件或内置函数,只需要一个简单的算法。 非常感谢 例如:

std::v={1,1,1,2,2,3} 1:3----2:2----3:1

3 个答案:

答案 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更快。你不会使用一个额外的遍历。并且您有结构,其中包含有关数字出现的信息