假设$ a_1a_2 ldots a_n $和$ b_1b_2 ldots b_n $是两个相同长度的字符串。一个 Anagraming 两个字符串中的一个是一种b baping $ p:[1 ldots n] to [1 ldots n] $,因此每个$ i $ $ a_i = b_i = b_i = b_ {p(i)} $。

对于同一双字符串,可能会有不止一次的字符。例如,如果$ a = $`abcab`和$ b = $cabab 我们有$ p_1 [1,2,3,4,5] to [4,5,1,2,3] $和$ p_2 [1,2,3,4,5] to [2,5, 1,4,3] $,等等。

我们会说 重量 Anagramming $ p $的$ W(p)$是第一个字符串中必须进行的切割数量,以获取可以重新排列以获得第二个字符串的块。正式地,这是[1 ldots n-1] $中的$ i 的值,其中$ p(i)+1 ne p(i+1)$。也就是说,这是$ p $的点数 不是 恰好增加1.例如,$ w(p_1)= 1 $和$ w(p_2)= 4 $,因为$ p_1 $ cuts 12345 一次,进入大块 12345, 和$ p_2 $削减 12345 四次,分为五个。

假设存在两个字符串$ a $和$ b $的盘子。然后,至少一个肛门必须具有最小的重量。假设这个是 最轻. 。 (可能有多个最轻的洋障碍;我不在乎,因为我只对重量感兴趣。)

问题

我想要一种算法,给定两个字符串,有效地存在Anagramm的算法 产生最轻的Anagramming的确切重量 两个字符串。如果该算法也产生最轻的Anagramming,那就没关系了,但不需要。

生成所有原始症并称重它们是一个相当简单的事情,但是可能有很多,因此我更喜欢一种直接找到光初步的方法。


动机

这个问题的原因如下。使计算机搜索字典并找到字符,这对包含完全相同的字母的单词非常容易。但是许多产生的字符都不引起人们的关注。例如,在韦伯斯特的第二个国际词典中找到的最长示例是:

胆囊二二替术
十二指肠杆菌阶层

问题应该很清楚:这些是无趣 cholecysto, duedeno, , 和 stomy 部分,重量为2。另一方面,这个较短的例子更令人惊讶和有趣:

海岸线
部分

在这里,最轻的Anagraming具有重量8。

我有一个程序,该程序使用此方法来定位有趣的字词,即所有Anagramming较高重量的Anagram。但是,它通过生成和权衡所有可能的原始症来做到这一点,这很慢。

有帮助吗?

解决方案

此问题被称为“最小公共弦分区问题”。 (更确切地说,最小公共字符串分区问题中的答案等于您的问题。由Goldstein,Kilman和Zheng [GKZ05]证明。这意味着除非p = np,否则不存在多项式时间算法。 (当然,如果每个字母最多一次一次一次,那么问题是微不足道的。)

在正面,相同的作者[GKZ05]在相同的限制下给出了多项式时间1.1037-Approximation算法。 (“ 1.1037-近似算法”表示可能不会输出正确答案的算法 一个 但可以保证输出一个值 b 这样 一个b ≤ 1.1037一个。)它们还给出了一个线性时间4-轴测算法,在较弱的限制下,每个字母在每个输入字符串中最多发生三次。

GKZ05] Avraham Goldstein,Petr Kolman和Jie Zheng。最小通用弦分区问题:硬度和近似值。 电子杂志, ,第12条,R50,2005年。 http://www.combinatorics.org/ojs/index.php/eljc/article/view/v12i1r50

其他提示

这是对 tsuyoshi ito的答案, ,总结最相关的部分 GKZ05纸 他引用了。

该论文证明了最大独立集的减少(错误) 问题。构造一个图$ g $,其顶点是对$(i,j)$,这样$ a_i = b_j $和$ a_ {i+1} = b_ {j+1} $。连接顶点$(i,j)$和$(k, ell)$(其中$i≤k$)具有边缘,每当不可能使用ANAGRAMM绘制所有$ i i mapsto j $和$ i+的情况下, 1 mapsto j+1 $和$ k mapsto ell $和$ k+1 mapsto ell+1 $。这很容易检测到;如果以下一个内容之一,那么确切的映射是不可能的:

  1. $ i = k $和$ j ne ell $
  2. $ i+1 = k $和$ j+1 ne ell $
  3. $ i+1

假设生成的图形$ g $具有最大的独立尺寸$ s $的独立集。然后,最小的Anagramming重量正好为$ NS-1 $,其中$ n $是字符串$ a $和$ b $的长度。 (Converse Chord也可以:低重量的Anagraming直接转化为$ g $的大误。有关详细信息,请参阅纸张的第4-5页。)

例如,考虑两个字符串 yttrioustouristy. 。相应的图有两个顶点,一个用于共享 ou 配对,共享 ri 一对。顶点之间没有边缘 ououriri;或者可以检查三个条件最重要的情况是否失败。因此,该图显然具有尺寸$ s = 2 $的错误,最小的Anagramming重量确实为8-2-1 = 5,与Anagramming相对应 y|t|t|ri|ou|st|ou|ri|s|t|y.'

另一方面,请考虑 deratertreader. 。这次图有三个顶点:

  1. DErater + treaDEr
  2. dERater + treadER
  3. deratER + treadER

2和3是不兼容的,1和3是不兼容的,但是1和2是兼容的。因此,唯一的MIS具有尺寸$ s = 2 $,包含顶点1和2。 der|a|t|e|rt|r|e|a|der.

它不涵盖您想到的确切算法(哪个 tsuyoshi ito的答案确实如此),但是试图找出找到“有趣”的Anagram的根本问题...

我的第一个想法是在编辑距离上使用一些变化,其中原子的变化是根据其“兴趣”而不是通常的“难度”或“混淆性”权重来加权的。当然,您似乎不可能以这种方式有效地编码真正有趣的转换,因为它们很可能是非本地的,因此陷入了MIS的NP完整问题,等等。

因此,第二个想法是在单词(机器翻译对齐)之间构建一个字母对字母的对准,然后为“兴趣”进行对齐本身(例如,计算将相邻字母的对齐方式计算到非 - 相邻的字母,或每个对齐横截面的对齐数,然后通过loglinear模型或类似的组合组合)。

第三个想法是完全放弃观察Anagraming本身的结构,而是看单词的语义。通常,使Anagram“有趣”的是涉及单词的含义之间的不一致性。因此,尝试使用WordNet或类似的距离之类的东西。

问题可以用 置换组.

现在,一个排列组包含所有“ Anagram移动”,既要归功于原始移动)和原始移动序列的复合材料。看来您只对可能的排列子集很感兴趣。我将尝试定义这些。

首先,回忆置换符号,即所谓的 循环符号:

  • $()$表示没有置换。
  • $(1)$表示1与1交换,这也不是置换。
  • $(12)$表示1和2被交换。
  • $(123)$表示1替换2代替3的2(旋转)。
  • 所以一个

这些简单的“循环”旨在描述更复杂的排列。

看来您感兴趣的举动是(对于长度$ n $):

  • 成对的单个字符掉期:这些是互换,例如$(12)$
  • 两对连续字符的掉期交换:这些是表格$(a b)(a+1 b+1)$的排列,其中$ a> 0 $和$ b
  • ...
  • 连续n个连续字符的掉期:这些是$(a b)表格的排列(a+1 b+1) cdots(a+i-i-1 b+i-1)$ a> 0 $,$ a+i-1 le b $和$ b+i-1 le n $。

这些动作构成了您的算法的基础。您感兴趣的是找到这些动作的最小序列,从一个单词转移到另一个单词。

除了蛮力搜索之外,我不知道计算此算法的任何算法,但是至少现在有更清晰的(我希望)对原始动作是什么。 (也许我们中间的一些团体理论家可以指出适当的算法。)

对于胆囊藻瘤术/duodenocholecystostome,我注意到,如果您将一个数字分配给每个角色,描述了它被移动的数量作为三角洲,那么您将拥有一些7 7的东西,然后是8 -7,然后是6 0。这是不正确的,因为某些字符可能已经重复了(第二个C仅向前移动2,而不是回到7)等,但是仍然非常“运行长度编码”,因为您在连续看到了相同的三角洲。

与海岸线/部分相比,您可以看到(+2)(+5)(+5)(-3)(-1)(+3)。

也许三角洲的随机性可能会给您带来“分数”的“分数”?

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top