关于子串序列和顺序的字符串无序的算法(相同长度,相同字符,唯一字符,没有词汇含义的字符串)

时间:2010-11-10 15:22:57

标签: string relative similarity levenshtein-distance hamming-distance

假设我将“peachz”作为字符串,并将“eachzp”和“pahezc”作为用于比较的尝试。

我正在寻找一种输出数组无序程度的算法,关于事件的相对顺序。 在下面的示例中,我描述了当前算法的问题。我总结了每个角色在原始字符串上的尝试位置的差异。

这是一个示例图像:
http://i51.tinypic.com/1zz2c10.png http://i51.tinypic.com/1zz2c10.png

“eachzp”具有相同的字符顺序,除了P.因为P已经移动到第一个位置,所以每个其他字符被视为一个不合适的位置。 “eachzp”将输出10的无序度,而完全混乱的“pahezc”尝试将输出8.这是不正确的。 Hamming或Levenshtein距离之类的东西也不考虑这些“顺序序列”。

我的问题是: 是否有一种算法可以用来输出字符串的混乱/相似性,考虑到字符的相对顺序?

(这不应该与字典相关,因为字符串不是单词而且没有任何词汇含义。如果有帮助,字符在每个字符串上也是唯一的。)

TIA

/ edit:我会尝试以不同的方式解释我的情况,尝试进一步详细说明:

  • 字符串的长度始终相同

  • 字符串总是相同的字符(例如,如果原始字符是“ors”,其他字符串只能是“ors”,“osr”,“sor”,“ros”,“sro”或“ rso“ - 相同的长度和相同的字符”

  • 每个字符串上的字符始终是唯一的

  • 字符串不是单词,根本没有词汇含义

  • 我需要算法来考虑订单序列。如果原始字符串是“peachz”,则“eachzp”几乎完全以相同的方式排序 - 只有“p”不合适。这应该更类似于“peachz”而不是“pahezc”,它更加混乱,并且在所有方向上(我觉得这个“方向”概念可能与解决方案相关)。

  • “eapchz”也应该比“eachzp”更少混乱。在这两种情况下,只有字母“p”不合适,但它在“eapchz”上移动了一个较短的距离。

感谢所有帮助。感谢

3 个答案:

答案 0 :(得分:0)

编辑:完全新的算法。

在我看来,你的“无序”概念对应于将混乱的字符串与原始字符串进行比较的可读性。一个可靠的可读性衡量标准是找到未加扰的子串,然后看看子串的整体顺序是什么。

  1. 查找与原始字符串匹配的最大长度的加扰字符串的所有子字符串,并按找到的顺序将它们存储在数组中。注意:由于每个字母只出现一次,因此子字符串将不相交。
  2. 让“碎片分数”为最大子串数。
  3. 让“连续性得分”为子串长度的平方和。
  4. 对于每个子字符串,通过将其与子字符串的整体顺序进行比较来对其进行评分(加上应该在其前面的数量和应该遵循的数量)。让字符串的“顺序分数”为子字符串的所有分数的总和。
  5. 我们现在有一个三维分数。比较字符串首先比较碎片分数,如果它们相等则比较连续性分数,如果它们相等则比较顺序分数。较低的碎片分数较少被扰乱,较高的连续性和订单分数较少被扰乱。
  6. 示例:“acpehz”具有frag,cont和order score 3,12,4。

    通过这种方法,我们有“peachz”< “eachzp”< “pahezc”,根据需要。

    我能想到的这个算法唯一明显的限制是它可能会非常缓慢而且“eachzp”比“pezach”更少混乱,即使你可能认为它们相同,因为“只有一个字母出来”订单“。

答案 1 :(得分:0)

这听起来像是数组中counting inversions的问题;在链接中,您将找到类似于mergesort的O(n log n)分而治之算法的描述。

在反演问题中,你有一个像1 3 2 5 4这样的数组,并且想要测量它与1 2 3 4 5相比有多远。所以1 2 3 4 5是你的“peachz”的类比“,如果我们将1分配给'p',2分配给'e'等,那么它们就是同一个问题。反转是任何无序的元素对(不一定是相邻的元素)。

你可能想要一个非反转计数的测量 - 我最好的猜测是旋转计数,其中旋转从一个位置移除一个元素并将其粘贴在其他位置。例如,“eachzp”距离“peachz”仅一圈。我想你可以使用像Levenshtein距离那样的O(n ^ 2)动态编程算法来计算旋转,但是我还没有检查过它。

答案 2 :(得分:0)

如果我正确理解您的问题,那么您正在寻找Kendall-Tau距离指标。你可以阅读它here