查找数组中一组数字的起点和终点

时间:2014-02-19 08:28:46

标签: c++ arrays algorithm search

我有一个包含288个值的数组。它包含任意组合中的1和0。

例如

[0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0.1]
[1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0...]
[1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1....]

它可以由一组零或一组一组开始和结束。但是保证在数组中它至少有一组零或一组。我的兴趣是在数组中存储一组的开始和结束的索引。例如,start_index中的第一个例子中的6,16,23(假设这是要存储的向量)和end_index中的11,19。

我希望这是通用的。因为我的数组可以从任何组开始。

我正在使用以下代码来实现这一点,但是我没有成功实现完整的逻辑。每当我认为我被困在如何制作算法时。下面的代码是我写的一小部分,只涉及一种可能性。

std::vector<float>start_index
std::vector<float>end_index

float alter_value = array[0];
for (int i = 0; i < array.size(); i++)
{
    if (alter_value == 0)
    {
        if(array[i+1] != alter_value)
        {
                start_index.push_back(array[i+1]);
                alter_value = array[i+1]; // this makes my alter_value = 1
        }
    }
}

可能我不可能以更好的方式传达我想要的东西。但我希望你明白。

4 个答案:

答案 0 :(得分:1)

您希望存储索引,但是存储数组值。指数是整数,因此您的指数向量必须为vector<int>,而不是

start_index.push_back(array[i+1])

你必须这样做

start_index.push_back(i+1)

答案 1 :(得分:1)

您可以在数组中查找1,找到它后,记录其位置并跳过所有相邻的1。一旦你达到零,你可以继续做同样的事情(寻找下一个1)。

编辑后的代码如下所示。还要注意声明中的一些变化。

std::vector<int> start_index
std::vector<end> end_index
    for (int i = 0; i < array.size(); i++)
    {
        if (array[i] == 1)
        {
                    start_index.push_back(i);
                    while(array[i] == 1 && i < array.size()) {
                       i++;
                    }
                    //will reach here if array[i] == 0 or array is exhausted
                    end_index.push_back(i - 1);
        }
    }

答案 2 :(得分:0)

最简单的方法:)

    int last = array[0];
    start_index.push_back(0);
    for (int i = 1; i < array.size(); i++) {
        if (array[i] != last) {
            start_index.push_back(i);
            last = array[i];
        }
    }   

答案 3 :(得分:0)

您可以考虑以下算法。这是伪代码 - 我不是C ++的粉丝,但将其重写为任何语言应该是微不足道的:

它循环遍历整个输入并检测组的边缘,将它们存储在result *数组中。

array; // input array
resultStarts; // array of indexes of starts of groups
resultEnds; // array of indexes of ends of groups
searchFor = 1; // element of groups

inGroup = false;

for(i=0;i<length(array);i++) {
 if((array[i] == searchFor) && ! inGroup) {
  // it's start of group
  inGroup = true; // mark it
  push(resultStarts, i);
 }
 if(inGroup && ((array[i] != searchFor) || i == length(array))) {
  // end of group (of the input)
  inGroup = false;
  push(resultEnds, i);
 }
}