2011-04-02 41 views
3

在配色方案中,我想對色調進行排序,但是希望避免「大差距」,即優先使用350,354,2,10,15而不是2,10,15,350,354(當表示爲0-360度值時)。什麼是最好的做法(例如在PHP中)?它是否找到了「最大的差距」並在此之後開始?任何更好的想法?將色調分類爲最短跨度的算法,例如`350,354,2,10,15`? [0-360度]

+1

你在找什麼樣的答案?有什麼比找到「最大的差距」更好,然後開始呢?更快的解決方案?一個有較小的差距?更優雅的代碼? – Ishtar 2011-04-02 15:24:21

回答

0

如果你沒有那麼多:

  1. 只是有點爲了
  2. 找到方差(模360)(即多遠他們是從「模360平均」)
  3. 將第一個移動到最後,再次檢查方差。
  4. 嘗試完所有這些選項後,請選擇最小的一個。

該算法是O(N^2)大小的列表。

主要的問題是你只有N'旋轉'在這裏。決定一個'gappiness'統計量,並且對所有N次旋轉蠻力,並使用最小化'gappiness'的安排。

+2

對不起,如果我是迂腐,但排序仍然是O(n * logn),所以整個算法的效率至少是O(n * logn)。另外,只是一次O(N)操作才找到方差?如果是這樣,找到N次方差是二次方程,除非有更快的方法來查找隨後時間的方差 – 2011-04-02 15:44:21

+0

你是完全正確的,我已經更正了答案。良好的發現,並回顧它,我希望它只是一個錯字:) – 2011-05-25 14:49:21

0

找到最大的差距,並把它放在開始。

  1. 排序數組
  2. 查找差距最大的(通過數組循環,找到兩個鄰國之間的最大距離)
  3. 移動的差距將開始(另一個循環,所有的數字移動)
+1

這與ajo的解決方案有何不同,「找到'最大的差距'並在此之後開始」? – Ishtar 2011-04-02 15:34:49

+0

也許我沒有正確理解他。他說你應該找到一個平均值,計算它的距離,逐個移動它們直到你到達那裏。這不是我說的。 – 2011-04-02 15:39:44

+0

???我的意思是,問題中的解決方案是:找到最大的差距,在此之後開始(==將差距移至開頭)。所以,你的答案和問題一樣。 – Ishtar 2011-04-02 20:40:46