假设我将“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”上移动了一个较短的距离。
感谢所有帮助。感谢
答案 0 :(得分:0)
编辑:完全新的算法。
在我看来,你的“无序”概念对应于将混乱的字符串与原始字符串进行比较的可读性。一个可靠的可读性衡量标准是找到未加扰的子串,然后看看子串的整体顺序是什么。
示例:“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。