[英]Counting inversions to see if an array is partially sorted
下面對排序數組的定義來自Robert Sedgewick和Kevin Wayne的Algorithmbook。
如果反轉數小於等於cN,則對數組進行部分排序
c應該有多高應該沒有限制嗎? 從技術上講,我不能使c = 1000000000,而現在許多未排序的數組在不應該被視為部分排序的情況下會被算作部分排序的嗎? 我知道設置一個高的c值並不明智,但是不應該在某種范圍內嗎?
這是最壞情況的一個例子。
D C B A
倒數
1(d,c)
2(d,b)
3(d,a)
4(c,b)
5(c,a)
6(b,a)
對於大小為4、6的數組。 如果c = 2和6 <4 * 2,那是完全線性的
我們什么時候達到N ^ 2范圍?
反轉在一個隨機排列的預期數量為〜N 2/4(參見這個問題 ,例如)。
塞奇威克(Sedgewick)的書處理的是漸進復雜性,其思想是“事情開始按照規定的大尺寸行事”。 因此,即使從您的問題中獲取較大的c值,對於足夠大的n值, c << n / 4 。
但是然后你問小陣列呢。 問題是,您可以詢問該字段的任何部分,而不僅僅是排列。 例如,基於比較的排序是Ω(n log(n)) ,並且說對於某些特定的實現,它正好是30 n log(n)+ 400 。 但是,對於n足夠小的值,* 30 n log(n)+ 400 <5000000000000000000 * n *,因此您可以說排序對於足夠小的數組(常數為5000000000000000000)是線性的。 的確如此,但是該領域的大多數人並不認為它非常有用。 (這可能是由於隨着時間的推移,CS處理越來越大的尺寸這一事實。)
好吧,從技術上講, c
會有一個上限,因為您只能有這么多的反轉(即N(N-1)/2
)。
該算法適用於N
並且c
不是N
的函數,而是一個常數。 您需要根據需要確定c
。 即使對於某些N
值,它的數量級為N^2
,它仍然是一個常數,對於更高的值,它不能與N^2
相比。 因此,通常沒有辦法限制c
。
每當您有沖動將c
提高到特定N
值的提議N^2
階的沖動時,請執行此操作。 然后保持c
固定並將N
增加幾個數量級。 然后享受將常量稱為常量的奢侈,無論常量有多大。
更新
將最大反型輸入為N(N+1)/2
而不是N(N-1)/2
。 立即修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.