代码之家  ›  专栏  ›  技术社区  ›  Tobias Ribizel

大多数平衡二分的置换

  •  2
  • Tobias Ribizel  · 技术社区  · 7 年前

    1000101 {0,2,6} {1,3,4,5} .

    {0,1,2,3} ,我从 0001 1000 (独家)

    由于我的算法有时允许我在找到合适的二分时“快速失败”,因此我想对它们重新排序,以便首先查看更平衡的二分。

    仍然可以有效地计算 .

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tobias Ribizel    7 年前

    Rory的评论给了我正确的方向:

    • 从开始 0...01...1 第一个 k/2 一个,然后是 k/2 - 1 , k/2 - 2 等等

    • Gosper's Hack

    一个简单的实现可能如下所示(对于 k <= 63

    for (int i = k / 2; i > 0; --i) {
        // start with 0 ... 0 1 ... 1 (i times)
        unsigned int v = (1 << i) - 1;
        // first bitset that doesn't represent a valid bipartition
        unsigned int end = 1 << k;
        // without this, we would count some bipartitions twice for k even
        if (k % 2 == 0 && i == k / 2) end >>= 1;
        while(v < end) {
            // do something with v...
            // iterate to the lexicographically next permutation
            unsigned int t = v | (v - 1);
            v = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz(v) + 1));
        }
    }