向量挑战:如何根据最大/最小条件分割向量

时间:2015-04-30 17:03:42

标签: vector minmax

我最近遇到了以下问题:

假设我有一个0和1随机长度(L)的向量随机分布(例如[0,1,1,1,0,0,1,0]),我需要将向量分开索引为K的两个子向量,因此以下条件有效:

  • 左子向量必须包含来自的最大元素数 K以相反的顺序,例如零的数量必须更大或 等于1的数量
  • 右侧子矢量必须包含从K + 1开始的最大元素数,例如1的数量必须大于或等于零的数量

例如,[1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0]分裂处于指数在图9中,左矢量是[1,0],右矢量[0,1]

我编写了以下解决方案,但复杂性为O(L ^ 2)。我认为可能有一个复杂的最坏情况O(L)的解决方案,但我找不到任何可以帮助我的东西。任何的想法?感谢

var max = 0;
var kMax = -1;

var firstZeroFound = false;

for (var i = 0; i < testVector.Length - 1; i++)
{
    if (!firstZeroFound)
    {
        if (testVector[i]) continue;
        firstZeroFound = true;
    }

    var maxZero = FindMax(testVector, i, -1, -1, false);
    if (maxZero == 0) continue;

    var maxOne = FindMax(testVector, i + 1, testVector.Length, 1, true);
    if (maxOne == 0) continue;

    if ((maxZero + maxOne) <= max)
        continue;

    max = maxOne + maxZero;
    kMax = i;

    if (max == testVector.Length)
        break;
}

Console.Write("The result is {0}", kMax); 

int FindMax(bool[] v, int start, int end, int increment, bool maximize)
{
    var max = 0;
    var sum = 0;
    var count = 0;
    var i = start;

    while (i != end)
    {
        count++;

        if (v[i])
            sum++;

        if (maximize)
        {
            if (sum * 2 >= count)
                max = count;
        }
        else if (sum * 2 <= count)
        {
            max = count;
        }

        i += increment;
    }

    return max;
}

1 个答案:

答案 0 :(得分:2)

我认为你应该看看rle

    y <- c(1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0)
    z <- rle(y)
    d <- cbind(z$values, z$lengths)
        [,1] [,2]
[1,]    1    9
[2,]    0    1
[3,]    1    1
[4,]    0    8

基本上,rle计算每个级别的0和1的长度。 从这里开始,事情可能会变得更容易。