我決定檢查與幾個假設/變化的問題,因爲它使人們更有趣的問題,對我說:
1)您可以向左或向右移動從一堆的任何部分內容。
2)你可以將一個元素堆疊到一個堆上,無論它是更大,更小還是相同的大小。
3)數組被認爲是隻要你永遠不小的數字前遇到比較大的數字,無論你如何去通過堆排序。所以_ 11 2 3排序,但_ _ 12 3是不是因爲你能解釋2爲前1
這導致了一個非常有趣的問題,儘管這個公理:
公理A :您進行移動的順序無關緊要,可以通過任何方式進行重新排列,以達到相同的最終結果。
公理AB:如果陣列中有沒有重複序列,然後簡單地每個元件移動朝向其最終位置。
特別,我制定了一項戰略,希望你可以只用當地的檢查也沒有遞歸/回溯解決這個問題,但我已經證明這是徒勞,而且以後會表現出來。
我的策略是:
1)繼續從左至右尋找那被翻轉錯誤的方式(較低的號碼前一個較大的數字)對。
2A)當你找到一個,如果有一個空白處或堆棧右手值可以馬上補,將其向左,直到它填滿它。
2b)否則,將左邊的值向右移動一個。這會造成一種情況,即您有一堆無所謂的數字 - 首先,根據1)的邏輯將向右移動的值與其新右邊的值進行比較,然後再進行比較。
2bii)治療向下比較的方式爲一對相同的比較 - 移動,如果它可以適應的空白處或堆疊,否則移動較高值權,並繼續留在較低的值。
實例:
1231 - >我們轉向圖1b左側,因爲它會適合到一個堆棧。 11 2 3 _
1321 - >我們轉向3向右因爲2不適合到空斑/入棧。我們將1b左移兩次,因爲它會適合一個空白點/適合堆疊,然後我們右移3,因爲2不會適合空白點/堆疊。 1 1 2 3
1132 - >我們將3右移,因爲2不能左移。我們向左移2,因爲它會適合一個空的地方。 1 1 2 3
2311 - >我們將3右移,因爲1a不能離開。我們將1b移兩次,因爲它會適合一個空的地方。我們將1a移向左邊,因爲它會疊加。我們將2右移,因爲1a1b不能離開。我們將1a2b左移,因爲它將填滿空位。 11 2 3 _
然而,我們碰到與這兩個起始陣列一個問題:
23411 10移動最佳,2R,3R,4R 1AL * 3 1BL * 4使11 2 3 4 _。
23111 9移動最優化,2r * 3 3r * 3 1bl 1cl * 2使_111 2 3 - 與23411策略相反!我們移動1更少,23更多,因爲有更多的1,所以我們保存移動儘可能少的移動。
這表明我們不能只是做一個簡單的本地比較來解決這個新問題。
我還在思考這個問題,它似乎是在一個有趣的方式不平凡的,我希望你們當中有些人喜歡與我考慮這個:)
這還不清楚。你的數組在多大程度上允許「空白空間」? 「在相鄰元素上移動」意味着什麼? – 2013-04-09 00:42:01
@OliCharlesworth - 我懷疑這是一個算法分析問題,而不是一個編程問題,因爲它要求*最小移動數*,而不是排序數組 – 2013-04-09 00:43:39
@SamDufel:這也是我的懷疑。即便如此,我認爲我們需要一些堅定的定義/圖表才能真正幫助。 – 2013-04-09 00:44:27