簡體   English   中英

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

[英]C++ check how many same elements in a row are in a vector

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

(1,1,1,1,3,3,3,3,3,3,5,5,5,...etc)

我想檢查一行中有多少相同的元素如下: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;
  }
}

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

@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);
    }
}

這是一個實例

此外,當向量排序時,這將為您提供更好的最佳案例復雜性:

#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;
    }
}

這是一個實例

你的算法在時間上是O(N) ,這對我來說似乎非常理想,因為你必須訪問每個獨特的元素進行比較。 您可能仍然會在這里和那里刮掉幾個周期,例如通過消除else()的條件或打開一些編譯器設置,但在算法上你的狀態良好。

如果輸入已經排序 ,您可以進行一系列二進制搜​​索 這將給你O(N lg N)最壞情況的復雜性,但平均情況可能會相當低,這取決於相等元素序列的平均長度。

順便說一下,正如@AndyProwl在他的回答中所表明的那樣:即使是這種低級別的算法,標准庫真的很棒 adjacent_findupper_bound算法具有詳細記錄的復雜性,迭代器約定將保護您自己的代碼中存在的邊緣情況。 一旦你學會了這個詞匯表,就可以在你自己的例程中輕松使用它們(當Ranges來到C ++時,希望它們也更容易組合它們)。

有一些litle優化可能會給你幾毫秒:

int size = numbers.size()-1;
static int counter=1;
static int *num1 = &numbers[0];
static int *num2 = &numbers[1];
for(int n=0;n<size;n++)
{
  if(*num1==*num2) counter++;
  else
  {
   cout << counter << "\n";
   counter=1;
  }
  num1++;
  num2++;
}
cout<<counter<<endl; //Caution, this line is missing in your code!!

Basicaly:

  • 避免通過id訪問向量:numbers [n]表示計算機必須乘以n * sizeof(int)並將此結果添加到數字中。 使用指針並增加它更快,這意味着只是一個添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM