2

假設我有「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」上移動了較短的距離。

所有幫助表示讚賞。謝謝

回答

0

編輯:完全新算法。

在我看來,你似乎「無序」的概念對應於與原始文件相比,雜亂字符串的可讀性如何。可讀性的體面度量將是找到未加擾的子字符串,然後查看子字符串的總體順序是什麼。

  1. 查找所有匹配原始字符串的最大長度擾碼字符串的子字符串,並將它們按照找到的順序存儲在數組中。注意:由於每個字母只出現一次,子字符串將不相交。
  2. 設「碎片分數」爲最大子串數。
  3. 設「連續性得分」爲子串長度的平方和。
  4. 對於每個子字符串,通過將其與子字符串的整體順序進行比較來對它進行評分(加起來應該有多少,以及它應該多少之後)。讓字符串的「訂單分數」爲所有子字符串分數的總和。
  5. 我們現在有一個三維評分。比較字符串首先比較碎片評分,如果他們是平等比較連續性評分,如果他們是相等比較秩序評分。較低的碎片分數較少擾亂,較高的連續性和順序分數較少混亂。

例: 「acpehz」 具有FRAG,CONT,和順序得分3,圖12,4.

通過這種方法,我們有 「peachz」 < 「eachzp」 < 「pahezc」,如所期望。

我能想到的這個算法的唯一明顯限制是,它可能會非常慢,「eachzp」比「pezach」更不爭搶,即使你可能認爲它們是平等的,因爲「只有一個字母是無序「。

+0

「最大和最小分數」對於我描述的「錯誤算法」也是正確的。這與我原來的行爲「一樣糟糕」。如果你嘗試我的示例嘗試「eachzp」(除了「p」以外的所有字符都具有相同的順序順序)和「pahezc」(在所有方向上加擾,與原始字符不相似),你會得到20 「eachzp」,30箇中的22個用於「pahezc」。雖然我們的算法另有說明,但我們知道「pahezc」與「eachzp」相比,「peachz」的意義不大。 – baderous 2010-11-10 17:18:25

+0

我不同意它是「平凡的不太相似」。測量混亂的方法有很多種,顯然我們的直覺並不同意「自然」是什麼。雖然我可能應該確保我的算法在發佈之前確實想要你想要的。 – Max 2010-11-10 21:58:42

+0

我已經完全更新了我的算法。 – Max 2010-11-10 22:59:17

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」只有一圈。我認爲你可以用O(n^2)動態編程算法來計算旋轉,比如Levenshtein距離,但我沒有檢查過這個..

+0

謝謝。我嘗試了反轉計數,並且它輸出與我目前使用的算法(上面解釋的算法)完全相同的標準化分數,對於每種情況。所以,無法從那裏獲得改善。接下來我會檢查輪轉計數。我已經編輯了開場白,更詳細地解釋了我需要的內容,如果您有任何進一步的想法,請分享他們的意見。 :) – baderous 2010-11-11 14:20:20

+0

這是相當令人驚訝的 - 它似乎是一般的相同? (或者你只是嘗試上面的例子嗎?我只是想知道。)好的,我有一個修正案建議:既然你已經補充說輪換的距離很重要,你需要決定在什麼時候輪換一次大的成本超過兩個小的,並將我的測量結果轉化爲旋轉成本的總和。 – 2010-11-11 20:11:35

+0

一般情況下也是這樣:)想象一下,如果一個字符串有10個倒數,最多30個,上面的算法最多可以得到20個,最多60個。當歸一化時,它是相同的輸出。我改變了我原來的解決方案,包括「最大懲罰」,減少了異常值的影響,但它仍然沒有什麼「理想」。 – baderous 2010-11-16 09:37:52

0

如果我正確理解你的問題,你正在尋找Kendall -Tau距離度量。你可以閱讀關於它here

+0

謝謝。我認爲這與倒數倒數沒有什麼不同,就像大流士培根給出的答案一樣。這一個使用冒泡排序而不是合併排序,但輸出將是等效的。請查看該討論,瞭解爲什麼它不能改善當前情況 – baderous 2010-11-22 15:57:31

相關問題