【问题标题】:Finding the minimum number of swaps to convert one string to another, where the strings may have repeated characters找到将一个字符串转换为另一个字符串的最小交换次数,其中字符串可能有重复的字符
【发布时间】:2013-08-19 23:23:58
【问题描述】:

我正在查看一个编程问题,突然发现以下问题似乎相关。

如何使用如下的少量交换将一个字符串转换为另一个字符串。保证字符串是可相互转换的(它们具有相同的字符集,这是给定的),但字符可以重复。我在同一个问题上看到了网络结果,但没有重复字符。 字符串中的任意两个字符都可以交换。

例如:“aabbccdd”可以在两次swap中转换为“ddbbccaa”,“abcc”可以在一次swap中转换为“accb”。

谢谢!

【问题讨论】:

  • 我在这里可能完全错了,但最小交换次数不等于[(the amount of character mismatches between both strings) / 2]
  • 在任何情况下,计算两个字符串之间的Levenshtein Distance 都会为您提供交换量(因为在您的特定情况下,Levenshtein 算法检测到的所有操作都是交换)。
  • @Renan:这个abccababcabc怎么样?
  • @P0W 两个字符不匹配,一个交换解决它。 Levenshtein 距离也是两个...哦,我明白我的错误了。此处计算的任何 Levenshtein 距离实际上都是正确答案的两倍。
  • 有什么更新吗?或任何答案的反馈?

标签: string algorithm swap


【解决方案1】:

这是Subhasis's answer 的扩展和更正版本。

正式地,问题是,给定一个 n 字母表 V 和两个 m 字母单词,x em> 和 y,其中存在一个置换 p 使得 p(x) = y,确定组成 q 满足 q(x) 的最少交换次数(固定除两个元素之外的所有元素的排列) = 。假设 n 字母词是从集合 {1, ..., m} 到 V 的映射,并且 p 和 q 是 {1, ..., m} 上的排列,动作 p(x) 被定义为组合 p 后跟 x.

组成为p的交换次数最少可以用p的循环分解来表示。当 j1, ..., jk 在 { 1, ..., m},循环(j1 ... jk) 是将 ji 映射到 ji + 1 for i in {1, ..., k - 1}, maps j kj1,并将所有其他元素映射到自身。排列 p 是每个不同循环 (j p(j) p em>(p(j)) ... j'),其中 j 是任意的,而 p(j') = j。组合的顺序无关紧要,因为每个元素恰好出现在一个组合循环中。一个k-元素循环(j1 ... jk) 可以写成乘积 (j1jk sub>) (j1jk - 1) ... ( j1j2) 的 k - 1 个周期。一般来说,每个排列都可以写成 m 个交换的组合减去构成其循环分解的循环数。一个简单的归纳证明表明这是最优的。

现在我们进入 Subhasis 答案的核心。 提问者问题的实例与 欧拉 一对一对应(对于每个顶点,入度等于出-degree) 有向图 G,顶点 Vm 弧标记为 1, ..., m。对于 {1, ..., n} 中的 j,标记为 j 的弧从 y(j) 到 x(j)。 G 的问题是确定将 G 的弧划分为有向循环的部分可以有多少。 (因为 G 是欧拉,所以这样的划分总是存在的。)这是因为排列 q 使得 q(x em>) = y 与分区一一对应,如下所示。对于 的每个循环 (j1 ... jk) >q,有一个部分的有向循环由标记为 j1, ..., jk.

问题与 Subhasis 的 NP-hardness reduction 是 Eulerian 有向图上的弧不相交循环包装是一般有向图上的弧不相交循环包装的特例,所以后者的 NP 硬度结果对前者的复杂性状态没有直接影响。然而,在very recent work(参见下面的引文)中,已经表明,事实上,即使是欧拉特例也是 NP 难的。因此,通过上面的对应关系,提问者的问题也是如此。

正如 Subhasis 所暗示的,当字母表的大小 n 是固定的(固定参数可处理)时,这个问题可以在多项式时间内解决。由于弧没有标记时有 O(n!) 个可区分的循环,我们可以在大小为 O( mn),可区分子图的个数。在实践中,这对于(比方说)二进制字母表可能已经足够了,但是如果我试图尝试在具有大字母表的实例上完全解决这个问题,那么我可能会尝试分支定界,通过使用线性规划获得边界使用色谱柱生成分步填充循环。

@article{DBLP:journals/corr/GutinJSW14,
  author    = {Gregory Gutin and
               Mark Jones and
               Bin Sheng and
               Magnus Wahlstr{\"o}m},
  title     = {Parameterized Directed \$k\$-Chinese Postman Problem and \$k\$
               Arc-Disjoint Cycles Problem on Euler Digraphs},
  journal   = {CoRR},
  volume    = {abs/1402.2137},
  year      = {2014},
  ee        = {http://arxiv.org/abs/1402.2137},
  bibsource = {DBLP, http://dblp.uni-trier.de}
}

【讨论】:

  • 谢谢大卫。在发表评论之前,我没有阅读您的答案。我会看一遍论文。
【解决方案2】:

您可以构造“差异”字符串SS',即包含两个字符串不同位置的字符的字符串,例如对于acbacbabcabc,它将是cbcbbcbc。假设这包含 n 个字符。

您现在可以构建一个“排列图”G,它将具有n 节点和从ij 的边(如果S[i] == S'[j])。在所有唯一字符的情况下,很容易看出所需的交换次数将是(n - G 中的循环数),可以在 O(n) 时间内找到。

但是,在有任意数量的重复字符的情况下,这减少了在有向图中找出最大循环数的问题,我认为这是 NP 难的,(例如查看: http://www.math.ucsd.edu/~jverstra/dcig.pdf)。

在那篇论文中指出了一些贪心算法,其中一个特别简单:

  1. 在每一步中,找出图中的最小长度循环(例如Find cycle of shortest length in a directed graph with positive weights
  2. 删除
  3. 重复直到没有覆盖所有顶点。

但是,可能存在利用您案例的属性的有效算法(我能想到的唯一一个是您的图表将是 K-partite,其中 K 是 S 中唯一字符的数量)。祝你好运!

编辑: 请参阅 David 的回答以获得对问题的更全面和正确的解释。

【讨论】:

  • 循环填充的硬度结果是否在每个顶点的入度等于出度的图表族中成立?
  • 我很困惑“在所有唯一字符的情况下,很容易看出所需的交换次数将是(n - G 中的循环数)”如果所有字符都是唯一的,则 G 中的每个顶点都恰好入射在 1 条边上,因此将有 0 个循环。另外,O(n*log(n)) 时间是指测试是否有重复吗?这可以在线性时间内完成。
  • 我很抱歉造成混乱。考虑 S = "bcdef" 和 S' = "cbfde"。在这种情况下,G 在 (1->2) (S 中的第一个字符 = S' 中的第二个字符)、(2->1)、(3->4)、(4->5)、( 5->3)。所以有两个循环,(1->2->1)和(3->4->5->3)。请注意,每个循环都可以在 (#elements_in_cycle - 1) 步骤中固定。所以你可以修复\sum_cycles{#elements - 1}中的整个字符串,即n-#cycles
  • @j_random_hacker 你是对的。循环情况的算法本质上等价于找出强连通分量,即 O(n)。为此修改了我的答案。
  • @SubhasisDas:我的困惑最终是我自己的错——我不知何故认为 G 是无向的。我很高兴我对时间限制的(不正确的)猜测导致了不相关的改进:)
【解决方案3】:

执行 A* 搜索(有关说明,请参阅 http://en.wikipedia.org/wiki/A-star_search_algorithm),以找到从一个字符串到另一个字符串的等效字符串图的最短路径。使用 Levenshtein 距离 / 2 作为成本启发式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2013-06-05
    • 2014-06-13
    • 2016-07-05
    • 1970-01-01
    • 2020-11-30
    • 2012-07-16
    相关资源
    最近更新 更多