簡體   English   中英

這種排序算法的效率如何?

[英]What is the efficiency of this sorting algorithm?

最近,我想到了一種不同的數字排序方式。 基本上,它涉及將數字列表視為一系列向上和向下移位。 例如,1 3 2將轉換為上下轉換,因為從1到3增加,而從3到2減少。

列表中的每個數字(不包括重復的元素)都可以表示為從1到列表大小的數字,其中該數字表示其在有序列表中的位置。 因此,大小為n的任何列表都可以表示為范圍為1-n的一系列數字。 假設第一個元素有n個可能的條目,第二個元素有n-1個,第三個元素n-2個,依此類推,我們看到有n個! 大小為n的列表的可能性。 然后可以根據它們表現出的上下行為將這些可能性分組。

3412和2413可以分為上-下-上。

現在,我們已按照其行為對排列進行了分組,我們為每個組找到了一個特定的變換,以便在變換之后創建最大的分組種類。 在這種情況下,轉換意味着移動排列的索引,並被寫為大小為n的列表。 例如,如果將3214應用於置換4213,則得到置換1243。第一個索引變為第一個,第二個索引變為第二個,第一個變為第三個,第四個保持第四。 在該示例中,置換4213具有規則向下-向上-向下,並且在變換之后變為向上-向上-向下。 只要在一個或多個轉換后遵循給定規則的一個組屬於一個以上排列,就需要應用更多轉換。 詳細說明:如果我們有4個類型為up-down-up的排列,並對它們應用轉換a,並獲得兩個類型為down-down-up和兩個類型為up-up-down的排列,則需要將轉換b應用於向下-down-up-group,並將c轉換為down-down-up組。 最后,我們有一個從b變為向下-向上-向上的排列,一個從b變為向上-向上-向下的排列,一個從c變為向下-向上-向下的排列,以及一個從c變為向下-向下-向上的排列。起來 一旦每個排列只屬於一個組,我們將存儲轉換遵循的規則字符串,直到成為其自己的組。 此外,我們發現什么變換導致此排列被排序,或向上-向上-向上-向上排列。 在此示例中,最終以down-up-down結束的示例將被寫為(up-down-up)-(down-down-up)-(down-up-down)。

一旦知道了給定一系列轉換后每個排列的行為,就可以對大小為n的任何列表進行排序了。 請記住,准備過程僅需要執行一次。 將其保持在一起的數據結構(我認為一個映射,其鍵是向上的u字符串,向下的d字符串以及遵循這些規則的排列值),則可以僅創建一次,然后可以無限次地使用它來排序大小為n的任何列表。

為了對具有數據結構的列表進行排序,我們首先瀏覽該列表以確定其最初遵循的規則。 然后,我們應用先前為該規則選擇的轉換,並查看它更改為什么規則。 我們重復此過程,直到達到只有一個排列的規則。 至此,我們得到了排序轉換並將其應用於我們的列表以得到一個排序列表。

我意識到該算法的准備階段是o(n!),但是由於它只需要執行一次,並且在此之后它可以在最壞的情況下工作在o(nlogn)(或者甚至更好,老實說,不確定效率是值得的。 鑒於n! 快速增長,我意識到支持數據結構的內存是一個很大的問題。 但是,也許可以將其僅用於小型列表。

我不了解它如何比簡單的機制更有效。 你做你的N! 准備工作; 您現在有了一個上下(UD)序列圖; 每個節點都有一個與該UD模式匹配的有序序列列表以及該節點的首選轉換。 最終,您可以從任何地方找到到已排序(所有U)節點的路徑。

我看不到任何使它成為一個好主意的魔術。 要對列表進行排序,

repeat until done
    - traverse the elements to determine its UD pattern: O(n)
    - if the pattern is all U, quit; the list is sorted: O(n)
    - find the node that matches that pattern: O(1) hash function
    - apply the node's transformation to the list elements: O(n)

我看到准備工作將迭代次數減少到O(log n),給出了O(n log n)的算法。 但是,這似乎比任何經典的O(n log n)算法(例如quicksort )本質上都慢。

我是否錯過了預期的實現?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM