有关子串序列和顺序的字符串混乱的算法(相同长度,相同字符,独特字符,没有词汇含义的字符串)
假设我有“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
/编辑:我会尽力解释以不同的方式我的情况后,试图进一步细节吧:
中的字符串始终是相同长度的
字符串总是有相同的字符(例如。如果原始文件是“ors”,其他字符串只能是“ors”,“osr”,“sor”,“ros”,“sro”或“rso” - 长度和字符相同)
chars总是在每串
的字符串唯一不是的话,并有在所有
我需要的算法取序考虑没有词义。如果原始字符串是“peachz”,则“eachzp”的排列方式几乎完全相同 - 只有“p”不合适。这应该更类似于“peachz”而不是“pahezc”,它更加混乱,并且在所有方向上(我觉得这个“方向”概念可能与解决方案相关)。
“eapchz”也应该比“eachzp”更少乱码。在这两种情况下,只有字母“p”不合适,但它在“eapchz”上移动了较短的距离。
所有帮助表示赞赏。谢谢
编辑:完全新算法。
在我看来,你似乎“无序”的概念对应于与原始文件相比,杂乱字符串的可读性如何。可读性的体面度量将是找到未加扰的子字符串,然后查看子字符串的总体顺序是什么。
- 查找所有匹配原始字符串的最大长度扰码字符串的子字符串,并将它们按照找到的顺序存储在数组中。注意:由于每个字母只出现一次,子字符串将不相交。
- 设“碎片分数”为最大子串数。
- 设“连续性得分”为子串长度的平方和。
- 对于每个子字符串,通过将其与子字符串的整体顺序进行比较来对它进行评分(加起来应该有多少,以及它应该多少之后)。让字符串的“订单分数”为所有子字符串分数的总和。
- 我们现在有一个三维评分。比较字符串首先比较碎片评分,如果他们是平等比较连续性评分,如果他们是相等比较秩序评分。较低的碎片分数较少扰乱,较高的连续性和顺序分数较少混乱。
例: “acpehz” 具有FRAG,CONT,和顺序得分3,图12,4.
通过这种方法,我们有 “peachz” < “eachzp” < “pahezc”,如所期望。
我能想到的这个算法的唯一明显限制是,它可能会非常慢,“eachzp”比“pezach”更不争抢,即使你可能认为它们是平等的,因为“只有一个字母是无序“。
这听起来像是一个数组中的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”只有一圈。我认为你可以用O(n^2)动态编程算法来计算旋转,比如Levenshtein距离,但我没有检查过这个..
谢谢。我尝试了反转计数,并且它输出与我目前使用的算法(上面解释的算法)完全相同的标准化分数,对于每种情况。所以,无法从那里获得改善。接下来我会检查轮转计数。我已经编辑了开场白,更详细地解释了我需要的内容,如果您有任何进一步的想法,请分享他们的意见。 :) – baderous 2010-11-11 14:20:20
这是相当令人惊讶的 - 它似乎是一般的相同? (或者你只是尝试上面的例子吗?我只是想知道。)好的,我有一个修正案建议:既然你已经补充说轮换的距离很重要,你需要决定在什么时候轮换一次大的成本超过两个小的,并将我的测量结果转化为旋转成本的总和。 – 2010-11-11 20:11:35
一般情况下也是这样:)想象一下,如果一个字符串有10个倒数,最多30个,上面的算法最多可以得到20个,最多60个。当归一化时,它是相同的输出。我改变了我原来的解决方案,包括“最大惩罚”,减少了异常值的影响,但它仍然没有什么“理想”。 – baderous 2010-11-16 09:37:52
“最大和最小分数”对于我描述的“错误算法”也是正确的。这与我原来的行为“一样糟糕”。如果你尝试我的示例尝试“eachzp”(除了“p”以外的所有字符都具有相同的顺序顺序)和“pahezc”(在所有方向上加扰,与原始字符不相似),你会得到20 “eachzp”,30个中的22个用于“pahezc”。虽然我们的算法另有说明,但我们知道“pahezc”与“eachzp”相比,“peachz”的意义不大。 – baderous 2010-11-10 17:18:25
我不同意它是“平凡的不太相似”。测量混乱的方法有很多种,显然我们的直觉并不同意“自然”是什么。虽然我可能应该确保我的算法在发布之前确实想要你想要的。 – Max 2010-11-10 21:58:42
我已经完全更新了我的算法。 – Max 2010-11-10 22:59:17