【发布时间】:2021-08-11 14:25:44
【问题描述】:
有两组,s1 和 s2,每组都包含一对字母。只有当它们的字母顺序相同时,一对才等效于另一对,因此它们本质上是字符串(长度为 2)。集合s1 和s2 是不相交的,两个集合都不为空,并且每对字母只出现一次。
以下是这两个集合的示例:
s1 = { ax, bx, cy, dy }
s2 = { ay, by, cx, dx }
(s1 ∪ s2) 中所有字母的集合称为sl。集合sr 是您选择的一组字母,但必须是sl 的子集。您的目标是定义从sl 中的字母到sr 中的字母的映射m,当应用于s1 和s2 时,将生成集合s1' 和s2',这也包含成对的字母,也必须是不相交的。
最明显的m 只是将每个字母映射到自身。在此示例中(如下所示),s1 等价于 s1',s2 等价于 s2'(但对于任何其他 m,情况并非如此)。
a -> a
b -> b
c -> c
d -> d
x -> x
y -> y
目标是构造m,使sr(映射右侧的字母集)具有尽可能少的字母数。为此,您可以将sl 中的多个字母映射到sr 中的同一个字母。请注意,根据s1 和s2 以及m,您可能会破坏s1' 和s2' 必须不相交的规则。例如,将sl 中的每个字母映射到sr 中的单个字母,显然会违反该规则。
那么,给定s1 和s2,如何构造一个m 以最小化sr,同时确保s1' 和s2' 不相交?
这是问题的简化可视化:
【问题讨论】:
-
使用您当前的公式,无需单独处理
s1和s2,因为如果您只考虑单个集合s = s1 ∪ s2,问题不会改变(即,对此的每个解决方案新问题是原始问题的解决方案,反之亦然)。这是你的意图吗? -
问题的关键部分是确保
s1'和s2'不相交。如果我们说只有一个输入集s = s1 ∪ s2,那么将m应用于s只会生成一个输出集s'。问题的关键部分消失了,因为我们不再有两个输出集来检查不相交性。所以不,我认为它们不是同一个问题。 -
我明白了,谢谢你的解释!
-
我正在寻找的解决方案是最小化
sr的解决方案。因此,将每个字符映射到自身确实是一种解决方案,但不是理想的解决方案。尽管我用字母(其中有 26 个英文字母)说明了问题,但我正在处理的真正问题使用 256 个字母的字母表。因此,m有 256 ^ 256 种可能的排列方式。我需要一个可以在真实计算机上运行的算法,所以蛮力方法行不通。 -
啊,好吧,对不起,我看错了。该应用程序正在优化解析器生成器。从本质上讲,
s1和s2是一组字符串,它们是 UTF-8 编码的 Unicode 代码点(所以在真正的问题中,它们的长度可以是 1-4,而不总是长度为 2,但我认为这不是一个重要的细节)。如果我可以最小化m,那么我可以生成一个更小(因此更快;更少的缓存未命中)的解析器。
标签: algorithm set mathematical-optimization set-theory