arrays - 如何重新排列要与兼容邻居订购的阵列?
问题描述
我有一个相当抽象的问题,我想到了但无法找到有效的解决方案。
问题
假设我们有一个由对象数组表示的规则列表,这些对象数组都有一个属性,该属性指定一个Array[3]
可以与之相邻的对象:
rules = [{
id: 0,
canMatchWith: [0, 1, 3, 5]
}, {
id: 1,
canMatchWith: [1, 0, 2, 12]
}, ...]
每个元素只能兼容,比方说 3 个其他元素,以及它本身。
问题
给定一个包含 s 的数组id
作为输入,没有排序并且可以有重复项,什么是可以输出数组以使每个元素都出现在其邻居canMatchWith
数组中的有效算法?另一个有趣的问题是:我们能否在尝试之前快速确定给定的输入是否至少有一个解决方案?另外:这是排序问题吗?使用图形和节点而不是数组会更好吗?
我所有的尝试都涉及在订购单个项目时多次遍历输入数组,如果它是死胡同,它只是重新开始,这还不够好。
我不一定需要一个完整的解决方案,欢迎指点和想法。
解决方案
您可以将其解释为图遍历问题:
- 您的值是图的节点
- “兼容”关系是边(即,图的两个节点之间存在边,如果它们可以彼此相邻排序)
那么您的排序算法是一个图遍历问题,您可以在其中搜索通过图的路径,将每个节点恰好传递一次。我没有搜索特定的算法,但我敢打赌,那里有一些算法,可以确定这样的顺序(即图遍历)是否可能,如果是的话,它看起来如何......
推荐阅读
- python - 如何在pygame中按比例将任意整数列表(从最低到最高)放在屏幕上?
- oracle - 在 CLOB 列上创建索引
- cron - Raspberry-pi 在编程重启后不断重启
- javascript - 如何使地面与车轮的旋转同步?
- kivy - 在 Kivy 中的按钮上显示希伯来语文本
- sql-server - 无法使用 LTRIM 和 RTRIM 搜索带有空格的记录
- c - 当输入为 10 并且阶乘值仅返回最多 33 个数字时程序失败
- javascript - 如何通过 JS 禁用或启用 html 组件?
- android - 当用户点击 FCM 通知消息时,如何清除活动堆栈?
- ios - 具有不同字体的 NSMutableAttributedString