匈牙利算法的最少行数

2024-04-16

我想知道匈牙利算法覆盖所有零的最少行数。 我已经关注了这个链接,但是那里的代码是一个贪婪的代码。

匈牙利算法:如何用最少的行数覆盖0个元素? https://stackoverflow.com/questions/14795111/hungarian-algorithm-how-to-cover-0-elements-with-minimum-lines

例如,

{0,0,1,1},
{1,0,0,1},
{1,0,1,0},
{1,1,1,1},

这个案子失败了。我应该得到输出 3。但是这个解决方案给出的输出是 4。

任何其他解决问题的方法都会有很大的帮助。

Thanks


介绍

我无法访问 CPP 编译器或 java 运行时。使用我的浏览器(使用 ES2017)编写此内容。至少它可以在您的浏览器中运行!如果您需要,我可以用其他语言(cpp、java、php、python)编写它。

我必须补充一点,我对此一无所知Hungarian Algorithm我刚刚创建了一个算法来找到最佳的最小优化线!

我正在推送这段代码并进行测试Github 仓库 https://github.com/alijvhr/HungarianAlgorithm。这样您就可以激发更多信息、代码、文档here https://github.com/alijvhr/HungarianAlgorithm

在矩阵数据表示中我使用:

index 0代表行和索引1代表列。

Step 1

经过input数组并计算零并将其存储在二维数组中。

The #matrixPower表示每列或行中零的数量。

Step 2

在下一步中,我们逐行检查。每行的值大于0 in #matrixPower[0]是一行包含零,我们称它们为powered今后。

循环通电行并检查与当前电流交叉的每一列powered row on 0!如果有任何柱子的功率为1所以我们在行上画线!并将每个交叉列的功率减少1。因为它被当前行覆盖了!

计算进度中的行数。

对所有行执行此操作!

Notice:当列与行交叉时zero功率至少是1因为zero在十字架上!

Step 3

If any powered列仍然存在,我们应该在他们身上划清界限!

就是这样!现在我们有了一张线路图和一些最小线路!

Note: inputMatrix是包含你的矩阵的变量!

let colLength = inputMatrix[0].length;
let rowLength = inputMatrix.length;
let matrixPower = [Array(rowLength).fill(0), Array(colLength).fill(0)];
let matrixLine = [Array(rowLength).fill(0), Array(colLength).fill(0)];

for (let row = 0; row < rowLength; row++) {
    for (let col = 0; col < colLength; col++) {
        if (inputMatrix[row][col] == 0) {
            matrixPower[0][row]++;
            matrixPower[1][col]++;
        }
    }
}
let minimum = 0;
let len = [matrixPower[0].length, matrixPower[1].length], cross;
for (let row = 0; row < len[0]; row++) {
    cross = [];
    for (let col = 0; col < len[0]; col++) {
        if (inputMatrix[row][col] == 0) {
            cross.push(col);
            if (matrixPower[1][col] < 2) {
                matrixLine[0][row] = 1;
            }
        }
    }
    if (matrixLine[0][row] == 1) {
        minimum++;
        for (let i = 0; i < cross.length; i++)
            matrixPower[1][cross[i]]--;
    }
}
for (let col = 0; col < len[1]; col++) {
    if (matrixPower[1][col] > 0) {
        matrixLine[1][col] = 1;
        minimum++;
    }
}

console.log(minimum);

我用随机的方式针对优化的强力函数测试了该算法 100 次12*10矩阵。结果100%OK!

平均暴力破解时间:0.036653s

优化算法平均时间:0.000019s

暴力破解总时间:3.9180s

优化算法总时间:0.0025s

我百测暴力工具〜4秒但该算法只需要2.5毫秒

我相信通过更多的工作可以进一步优化这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匈牙利算法的最少行数 的相关文章

  • 比 in_array 更快?

    我需要将一个值与一组数组进行比较 但是 我需要比较 foreach 中的多个值 如果使用 in array 它可能会很慢 非常慢 有没有更快的替代方案 我当前的代码是 foreach a as b in array b array 谢谢 你
  • Dijkstra 算法不生成最短路径?

    我正在使用 Dijkstra 算法解决最短路径问题 我遇到了麻烦 因为该算法应该提供最短路径 但运行该算法后 我手动得到了一条短路路径 这只是该算法的副产品吗 我尝试生成的路径是从 a gt z 这是我通过应用该算法得到的路径 在我访问的每
  • 什么是确定性快速排序?

    我一直在阅读有关快速排序的内容 发现有时它被称为 确定性快速排序 这是普通快速排序的替代版本吗 普通快速排序和确定性快速排序有什么区别 普通 确定性 快速排序在特定数据集上的行为可能非常差 例如 选择第一个未排序元素的实现在已排序数据上的时
  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • 求 Petersen 子图中的哈密顿路径

    我开始使用 IDE Jupyter Python 3 6 并出现了一个问题 我必须通过IDE绘制Petersen子图中的哈密顿路径 但我不知道该怎么做 我显示有关该图的信息 彼得森图 https en wikipedia org wiki
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 基于 Unix ASCII 的命令行图表/绘图工具

    有没有好的命令行 UNIX 图表 绘图 绘图工具 我正在寻找能够在 ASCII 图表上绘制 xy 点的东西 澄清一下 我正在寻找能够以 ASCII 格式输出图形 如 ascii art 风格 的东西 这样我就可以在交互式 shell 会话中
  • float:使所有 Y 轴的刻度线对齐

    我有一个流程图 除了第一个 Y 轴之外 还使用具有不同数字刻度的辅助 Y 轴 我的问题是辅助刻度标签与第一个浮动轴制作的网格线不对齐 Flot 似乎正在运行一些内部算法来决定为轴显示多少个刻度标签 它对每个轴分别执行此操作 从而产生了我遇到
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • 一种良好且简单的随机性测量方法

    获取一长整数序列 例如 100 000 个 并返回序列随机性的测量值的最佳算法是什么 该函数应返回单个结果 如果序列并非完全随机 则返回 0 如果完全随机 则返回 1 如果序列有点随机 它可以给出介于两者之间的东西 例如0 95 可能是一个
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4

随机推荐

  • 窗口调整大小处理事件

    我的应用程序的某些元素具有自定义调整大小事件 这些事件都有效 然而 他们却被一件事搞砸了 当将鼠标悬停在窗口边框上时 光标将成为调整大小手柄 然后单击 但不要拖动 元素的大小调整不正确 并且我的处理程序不会被触发 我已经寻找过这样的事件 但
  • 如何在下面给出的数字数组中找到锯齿状数组中的最大数字?

    如何在下面给出的数字数组中找到锯齿状数组中的最大数字 const array 2 4 10 12 4 100 99 4 3 2 99 0 如果您知道嵌套的最大深度 那么您可以flat数组并找到最大值 Math max array flat
  • JQ:如何将被识别为字符串的值相乘?

    我正在尝试从交换网络套接字获取一些贸易信息 在我从套接字获取的 JSON 中 值 p 和 q 都用双引号括起来 当我尝试将两个值相乘时 它表示我正在尝试将两个字符串相乘 因此 我通过 tonumber 过滤器传递这些字符串 并且错误消息发生
  • C# 中的内部设置属性是什么?

    我刚刚遇到了一个未知的 C 概念 谁能告诉我内部设置属性的目的是什么 它有什么用 我知道内部关键字用于在程序集中工作 如果您有一个带有内部 set 访问器 和公共 get 访问器 的属性 则意味着程序集中的代码可以读取 获取 和写入 设置
  • VS Code 突出显示了我所有的 WordPress 函数名称

    我正在使用 PHP Intelephense 版本 1 3 7 这是最新版本 我的 VS Code 是最新的 之前没有问题 但是几天前 它一直高亮我所有的wordpress函数名称 我尝试降级我的 PHP Intelephense 但情况仍
  • 对 div 进行动画处理并从中心展开

    我有一个简单的代码 可以从中心水平和垂直扩展 div 但它只扩展到左侧或底部 我希望它从中心扩展到两侧 左 50px 右 50px 或 顶部 50px 底部 50px 总计等于100px 这里是代码
  • 如何以 UTF-8 打开文件并以 UTF-16 写入另一个文件

    如何打开 UTF 8 格式的文件并写入 UTF 16 格式的另一个文件 我需要一个例子 因为我对 和 a 等某些字符有疑问 当写 m dic 时 我发现文件中写着 m dic 您可以按如下方式创建阅读器 InputStream is new
  • Android - ViewRootImpl$CalledFromWrongThreadException

    我正在使用this http savagelook com blog android display images from the internet in android 显示来自互联网的图像 但它会抛出如下错误 04 12 13 45
  • Kafka Streams 在 HDFS 上查找数据

    我正在使用 Kafka Streams v0 10 0 1 编写一个应用程序 并希望通过查找数据来丰富我正在处理的记录 该数据 带时间戳的文件 每天 或每天 2 3 次 写入 HDFS 目录 我怎样才能将其加载到Kafka Streams应
  • FROM 子句中的 PostgreSQL json_array_elements - 为什么这不是笛卡尔连接?

    如果我有这样的表达 SELECT t json column gt gt x nested gt gt y FROM my table t json array elements t gt nested nested 为什么我不需要加入 更
  • 如何在mysql中启用INNODB

    当我在 MySQL 中执行查询时 它返回一个错误 指出 InnoDB 未启用 当我点击存储引擎时 InnoDB被禁用 如何启用 InnoDB 您需要在中启用它my cnf文件 然后重新启动服务器 http dev mysql com doc
  • 使用||在开关的情况下?

    因此 对于 Java 基础知识的大学实验室来说 我遇到了麻烦 我必须设置一个开关 并在该开关内放置一个盒子 有3个选项供用户输入 每个选项都可以用字母来回答 问题是这个字母允许是大写或小写 问题是我似乎不知道如何设置它 所以一个案例将允许其
  • Greasemonkey 脚本中的 XPath 未在 XHTML 页面上选择正确的节点

    我正在为 Greasemonkey 编写脚本微博网 我无法在 XHTML 页面上使用 XPath 选择元素 此代码无法获取我想要的元素 function resolver prefix return prefix x http www w3
  • iOS 11 - 键盘高度在键盘通知中返回 0

    我一直在使用键盘通知 没有任何问题 并且获得了键盘的准确高度 void keyboardDidShow NSNotification notification CGSize keyboardSize notification userInf
  • 删除 data.table 的分组变量

    我想用data table进行一些争论并希望我的结果数据表not包括分组变量 这是一个 MWE library data table DT lt data table x 1 10 grp rep 1 2 5 DT mmm mean x b
  • 使用 Robolectric 运行 Android 测试 - 依赖错误

    我使用的是 Android Studio 1 2 和 Windows 7 当按照此运行机器人电测试时example https github com nenick AndroidStudioAndRobolectric blob maste
  • 如何从 Objective-C 代码将文件保存到 $(PROJECT_DIR)?

    我有生成资源的代码 我想将其保存在 PROJECT DIR 的子目录中 如何在代码中从该环境变量获取真实路径 打开项目构建设置并添加SAVEPATH PROJECT DIR 到预处理器宏 然后你可以像这样获取项目目录 NSString pr
  • Android Studio中TextView和Button卡在蓝图的左上角

    当我在 Android Studio 中将 TextView 和 Button 添加到蓝图时 它会卡在蓝图的左上角 我遇到了同样的问题 单击 自动连接到父级 按钮 图标看起来像字母 U 磁铁符号 它位于设计视图的左上角
  • 执行查询并返回结果的方法

    应用程序无法运行 尝试执行查询来打印特定值 Method public Cursor trying String vg String q SELECT quantity FROM TABLE CONTACTS WHERE name vg S
  • 匈牙利算法的最少行数

    我想知道匈牙利算法覆盖所有零的最少行数 我已经关注了这个链接 但是那里的代码是一个贪婪的代码 匈牙利算法 如何用最少的行数覆盖0个元素 https stackoverflow com questions 14795111 hungarian