【问题标题】:Finding if binary matrix exists given the row and column sums在给定行和列总和的情况下查找二进制矩阵是否存在
【发布时间】:2014-01-08 02:22:14
【问题描述】:

如何确定是否可以构造具有给定行和列总和的二进制矩阵。

输入:

输入的第一行包含两个数字1≤m,n≤1000,矩阵的行数和列数。下一行包含 m 个数字 0≤ri≤n – 矩阵中每一行的总和。第三行包含 n 个数字 0≤cj≤m - 矩阵中每一列的总和。

输出:

如果存在 m×n 矩阵 A,则输出“YES”,每个元素为 0 或 1。否则为“NO”。

我尝试阅读有关断层扫描算法但无法找到答案,因为所有与断层扫描算法相关的论文都非常复杂。

谁能帮帮我..

【问题讨论】:

    标签: math tomography-reconstruction


    【解决方案1】:

    我已经成功地使用基于network flow 的建模为 R 随机生成此类矩阵。我打算有一天把这些想法写下来,但还没有找到时间。为此,我阅读了 Miklós 和 Podani 的 Randomization of Presence–absence Matrices: Comments and New Algorithms

    Havel-Hakimi 定理 (Havel 1955, Hakimi 1962) 指出存在一个矩阵 Xn,m sub> 个 0 和 1,行总计 a0=(a1, a i>2,... , an) 和列总计 b0=(b1, b2,…, b i>m) 使得 bib i>i+1 对于每个 0 i m 当且仅当另一个矩阵 X n−1,m 个 0 和 1,行总计 a1=(a2, a3,… , an) 和列总数 b1=(b1 sub>-1, b2-1,… ,ba1-1, ba1+1,… , b m) 也存在。

    我想这应该是递归决定您的问题的最佳方法。

    用我自己的话来说:选择任意行,将其从总计列表中删除。调用删除的号码k。还要从 k 列中减去一个总和。你得到一个较小矩阵的描述,然后递归。如果在任何时候您都没有 k 列的和非零,那么就不会存在这样的矩阵。否则,您可以使用相反的过程递归地构建匹配矩阵:获取递归调用返回的矩阵,然后再添加一行 k 个,放置在您最初从其计数中减去一个的列中。

    实施

    bool satisfiable(std::vector<int> a, std::vector<int> b) {
      while (!a.empty()) {
        std::sort(b.begin(), b.end(), std::greater<int>());
        int k = a.back();
        a.pop_back();
        if (k > b.size()) return false;
        if (k == 0) continue;
        if (b[k - 1] == 0) return false;
        for (int i = 0; i < k; i++)
          b[i]--;
      }
      for (std::vector<int>::iterator i = b.begin(); i != b.end(); i++)
        if (*i != 0)
          return false;
      return true;
    }
    

    【讨论】:

    • 感谢您的回答。我可以部分理解您的答案,尽管它看起来对我来说是正确的。所以,你能用任何语言 C、C++ 或 java 的小代码解释一下吗?还是举个例子?
    • 有什么最佳的方法吗?在每次迭代中,列的数组都会被排序,如果输入量为 10^9 的巨大,则每次传递都会花费大量时间。有没有可以帮助我们在 o(n) 中实现这一目标的二进制矩阵的方式或属性?我对此摸不着头脑,但我还没有找到任何方法。提前感谢您的帮助。
    • @Hitesh 在每次迭代结束时,您会得到两个有序子集。然后通过使用归并排序,新的排序可以在 O(n) 中执行,而不是 O(nlogn)。但全球复杂性仍然很大
    • 大家好我在这个线程stackoverflow.com/questions/56308347/…找到了解决这个问题的有效算法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2015-10-28
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多