如何找到最小的密钥集?

时间:2015-07-03 20:17:02

标签: algorithm language-agnostic

我有一组密钥 K 和一组有限集 S K n < / sup> of n -tuples of keys。是否有一种有效的算法来查找双射映射 f S S'其中 S' k k &lt; n minimal,剥离了一些密钥,而其他密钥没有被触及?

1 个答案:

答案 0 :(得分:1)

我担心这是NP完全的。

相当于set cover

您的每个键都可以区分某些元素对(即一组边)。您的任务是选择允许您区分每个元素的最小数量的键 - 即允许您覆盖每个边缘的最小数量的边缘组。

然而,维基页面显示了基于整数编程的近似解决方案,可能在实践中提供有用的解决方案。

证明草图

假设我们有一个通用的集合覆盖问题:

A,B,C
C,D
A,B,D

我们需要找到最小数量的这些集来覆盖每个元素A,B,C,D。

我们为每个字母A,B,C,D构建一个元组。

当且仅当set i包含字母时,元组在位置i中具有唯一的编号。否则,它们包含0.

还有一个零元组。

这意味着元组看起来像:

(0,0,0)  The zero tuple
(1,0,2)  The tuple for A (in sets 1 and 3)
(3,0,4)  The tuple for B (in sets 1 and 3)
(5,6,0)  The tuple for C (in sets 1 and 2)
(0,7,8)  The tuple for D (in sets 2 and 3)

如果您可以有效地解决问题,那么您就可以使用此映射来有效地解决集合覆盖问题。