C++检查一行中有多少相同的元素在向量中

Son*_*ath 6 c++ algorithm stl vector

我有一个24.000元素的大矢量,如:

(1,1,1,1,3,3,3,3,3,3,5,5,5,...etc)
Run Code Online (Sandbox Code Playgroud)

我想检查一行中有多少相同的元素如下:4-6-3..etc我使用这段代码:

static int counter=1;
vector<int>numbers;

for(int n=0;n<numbers.size()-1;n++)
{
  if(numbers[n]==numbers[n+1])
  {
    counter++;
  }
  else if(numbers[n]!=numbers[n+1])
  {
   cout<<counter<<endl;
   counter=1;
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何算法更快地做同样的事情;

And*_*owl 10

@rhalbersma基本上给了你正确的答案.作为附录,如果您想以更标准的方式重写算法:

#include <algorithm>
#include <vector>
#include <iterator>
#include <functional>
#include <iostream>

int main()
{
    std::vector<int> v { 1, 1, 2, 3, 3, 5, 5, 5 }; // or whatever...

    auto i = begin(v);
    while (i != end(v))
    {
        auto j = adjacent_find(i, end(v), std::not_equal_to<int>());
        if (j == end(v)) { std::cout << distance(i, j); break; }
        std::cout << distance(i, j) + 1 << std::endl;
        i = next(j);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.

此外,当向量排序时,这将为您提供更好的最佳案例复杂性:

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v { 1, 1, 2, 3, 3, 5, 5, 5 }; // must be sorted...

    auto i = begin(v);
    while (i != end(v))
    {
        auto ub = upper_bound(i, end(v), *i);
        std::cout << distance(i, ub) << std::endl;
        i = ub;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.


Tem*_*Rex 6

你的算法是O(N)及时的,这似乎对我来说非常理想,因为你必须访问每个独特的元素进行比较.您可能仍然会在这里和那里刮掉几个周期,例如通过消除内部条件else()或打开一些编译器设置,但在算法上您处于良好状态.

如果输入已经排序,您可以进行一系列二进制搜​​索.这将给出O(N lg N)最坏情况的复杂性,但平均情况可能会相当低,具体取决于相等元素序列的平均长度.

顺便说一下,正如@AndyProwl在他的回答中所表明的那样:即使是这种低级别的算法,标准库真的很棒.这些adjacent_findupper_bound算法具有详细记录的复杂性,迭代器约定将保护您自己的代码中存在的边缘情况.一旦你学习了这个词汇表,你就可以在你自己的例程中轻松使用它们(当Ranges来到C++时,希望它们也更容易组合它们).