优化二进制增量循环

时间:2014-06-09 21:07:35

标签: c++ optimization

今天早些时候我提出了一个关于获得所有可能组合的问题,并且我对使用二进制循环给出了一个很好的暗示,在对它进行了一些思考后,我在C ++中提出了以下代码:

    vector<bool>binary(size,0);

bool filled=false;
while(filled==false)
{

    bool setdigit=true;
    for(int k=0;k<size;k++)
    {
        if(setdigit==true)
        {
            if(binary[k]==false) 
            {
                    binary[k]=true;
                    setdigit=false;
            }
            else //when the digit is already true
            {
                binary[k]=false;
            }
        }
    }
    for(int i=0;i<size;i++)
    {
        if(binary[i]==false) 
            {
                filled=false;
                break;
        }
        else filled=true;
    }
}

代码似乎有效,但测试二进制增量是否完成的方法编码非常糟糕,我应该如何改进退出条件甚至循环过程?

3 个答案:

答案 0 :(得分:4)

伪代码:

for (i=0;i<2^size;i++)
   binary = std::bitset(i);  /* the bits of i are the bits you are looking for */

答案 1 :(得分:1)

你的setdigit没用。 您可以删除它,删除条件,并通过break将赋值替换为false。 所以循环将是

for(int k = 0; k < size; k++)
{
    if (binary[k] == false) 
    {
        binary[k] = true;
        break;
    }
    else // when the digit is already true
    {
        binary[k] = false;
    }
}

然后,您可以更改while (filled /* has only true */) 通过do {} while(binary_is_false /* has only false */)
允许直接在增量内部进行检查。

您最终可能会将代码拆分为函数以获取类似:(https://ideone.com/dmQwFc

bool increase(std::vector<bool>& v)
{
    for (std::size_t i = 0; i != v.size(); ++i) {
        v[i] = !v[i];
        if (v[i] == true) {
            return true;
        }
    }
    return false; // v contains only false values now.
}

int main()
{
    std::vector<bool> v(5);

    do {
        // Do some job as printing vector content:
        for (std::size_t i = 0; i != v.size(); ++i) {
            std::cout << v[i] << " ";
        }
        std::cout << std::endl;
    } while (increase(v));
    return 0;
}

答案 2 :(得分:0)

您可以更改代码:

for(int i=0;i<size;i++)
    {
        if(binary[i]==false) 
            {
                filled=false;
                break;
        }
        else filled=true;
    }

通过

filled = (find(binary.begin(), binary.end(), false) == binary.end())

您需要为此工作添加<algorithm>