我不确定要搜索的正确术语是什么(我搜索了“映射算法”和“一对一算法”),而且我想不出更简单(更规范)的公式。
我有两套,说
A B C D E
和
L M N O P
我得到一张一对多的地图,例如
A --> L, M, N, P
B --> M
C --> M, N, O
D --> N
E --> O, L
判断地图的一对一“子集”是否可以覆盖所有项目的最简单和/或最快的算法是什么?例如,上面确实存在这样一个“子集”:
A --> P
B --> M
C --> O
D --> N
E --> L
我不需要知道子集图本身,只需要知道是否存在。
“蛮力”算法是显而易见的——一个轻微的改进是深度优先,只要没有项目满足必要的映射就回溯——另一个改进可能是按照映射的升序进行,例如first B --> M
,D --> N
然后是 secondE --> O, L
等。
但所有这些似乎都是蛮力搜索的原始变体。有更好的算法吗?我对使用线性系统解决此类问题有一个模糊的记忆,例如将地图转换为矩阵并进行某种确定答案的归约,但我必须重新学习线性代数才能解决这个问题——也许SO可以更快地帮助我。
谢谢!