荷蘭國旗問題

2021-05-06 09:46:10 字數 1345 閱讀 7188

上方的便是乙個荷蘭國旗,從圖中我們可以很清楚的看出它的特點,它有三個區域組成,即紅,白,藍。

好,現在我們的問題出來了。現在我們面前有一張桌子,桌子上整齊的擺放著紅色,白色,藍色三種線條,但他們的順序是凌亂的。

我們的要求是:用乙個演算法把這些線條挑出來重新擺放順序,最後的結果就像上圖的荷蘭國旗,紅色在上,白色在中間,藍色在最下面。

好了,我們該如何實現上面的問題呢?其實拿到這個問題每個人心中肯定都會有了乙個演算法,即:

①: 用乙個變數標識我們要放的陣列(用陣列模擬桌子)的位置,初始化為0,然後依次遞增。我們只需遍歷整個陣列,找紅色的線條(紅白藍線條我們可以用0,1,2模擬),找到就把它和標識位置的線條進行交換。當標識之後的陣列中沒有紅色線條時就找白色線條,白色線條找完之後,剩下的肯定就是藍色的線條了。到此我們整個的演算法就結束了。

我們看一下這個演算法:

很容易被人想到的一種演算法,但也是很複雜的一種演算法,我們可以看出他的時間複雜度是o(n*m);

確實這樣的演算法在速度上很不容易被人接受。我們看一下另外一種演算法:

②:我們首先將整個陣列分為3個區域,即紅色區域,白色區域,藍色區域,然後首先我們遍歷紅色區域判斷當前單元的值是否是紅色,若是繼續遍歷,否則判斷該值是白色還是藍色,若是白色便去白色區域去尋找乙個紅色的單元與之交換,反之便去藍色區域尋找乙個值與之交換。當紅色區域遍歷完成之後,我們接著遍歷白色區域,若當前單元不是白色,那肯定是藍色了,我們便去藍色的區域去尋找乙個值與之交換。當藍色區域遍歷完成之後。我們的工作就完成了。

我們看下**:

這種方法有個缺陷,不知道大家發現了沒有。它少處理了一種情形,即:若是白色區域沒有紅色或是藍色區域沒有紅色,演算法沒有對這種情況進行處理,應該若是在其中一種區域中沒有找到,便去另一種區域中去找。

這種方法,若是在一般情況下它比第一種演算法快了很多,因為它少了很多無謂的交換,出去上面遺漏的那種特殊情況,它的每次交換都是必要的交換。但是這種演算法的時間複雜度還是有點高,應該仍是o(m*n);

我們分析一下上面的演算法,我們交換之前都需要遍歷陣列的一部分進行尋找。這方面便浪費了時間,影響了我們的速度。我們可以來乙個空間換時間的方法。我們再看另乙個演算法。

③: 我們首先定義三個陣列來儲存白色區域的紅色部分位置,藍色區域的紅色部分和藍色區域的白色部分位置。然後分別定義三個變數來標識這三個陣列交換到的位置。演算法之初我們便開始遍歷白色區域,藍色區域為這三個陣列賦值。之後,我們便可以按照上面的方法依次遍歷紅色區域和白色區域了,找到之後只需和相應的陣列中的位置與之交換就ok了。

我們看一下演算法:

我們看一下這個演算法的複雜度已為o(n)了;呵呵。不過我們為此耗費了一定的空間資源。用空間來換取了效率。當然還有其他更好的方法,當我相信複雜度為o(n)已經是最快的了。但我相信還有更簡單的演算法。只要我們肯於思考,奇蹟總會出現呵呵。。

荷蘭國旗問題

問題 荷蘭國旗是由紅白藍三種顏色組成,現假設很多這三種顏色的線被打亂放置,要求從頭掃瞄一遍,3種顏色自然分開,顏色順序是紅,白,藍。問題分析 1 編碼 題目中有三種顏色,可以用0 紅,1 白,2 藍進行編碼。3 演算法 a 把n個0,1,2三種元素隨機放入陣列模擬很多這三種顏色的線被打亂放置的場景 ...

荷蘭國旗問題

荷蘭的國旗由紅色 白色和藍色3種顏色組成。現在假設有很多這3種顏色的線被存放在乙個陣列裡,要求每次操作僅能進行一次交換,在原陣列的基礎上操作。待對陣列進行一遍掃瞄後,3種顏色自然分開,顏色順序為紅 白 藍。另外,要求在o n 的複雜度下,是移動次數最少。荷蘭國旗問題 include include ...

荷蘭國旗問題

剛才在嚴蔚敏的資料結構習題上看到的這個題。看了幾篇部落格。貌似都沒有結合資料結構的意思來解釋。讓我有種衝動寫篇文章。就把這當作我的第一篇博文吧。問題描述 荷蘭國旗問題 設有乙個僅有紅白藍三種顏色的條塊組成的條塊序列。請編寫乙個時間複雜度為o n 的演算法,使得這些條塊按紅 白 藍的順序排好,即排成荷...