[英]How can I sort a 10 x 10 grid of 100 car images in two dimensions, by price and speed?
這是場景。
我有一百個汽車物體。 每輛車都有速度屬性和價格屬性。 我想將汽車的圖像排列在網格中,以便最快和最昂貴的汽車在右上角,最慢和最便宜的汽車在左下角,所有其他汽車都在網格中的適當位置。
我需要使用哪種排序算法,您有什么建議嗎?
編輯:結果並不需要是精確的-實際上,我正在處理更大的網格,因此,如果汽車大致聚集在正確的位置就足夠了。
只是一個受Cantor先生啟發的想法:
根據a²+b²=c²,距離可能是
sqrt( (speed(car[i])/maxspeed)^2 + (price(car[i])/maxprice)^2 )
根據需要(視覺上)應用加權
結果(鏡像,左上方最佳):
1 - 2 6 - 7
/ / /
3 5 8
| /
4
將此視為兩個問題:
1:生成排序列表2:將排序列表的成員放入網格
排序只是您更精確地定義規則的問題。 “最快和最昂貴的第一”無效。 首先是我的100,000英鎊的勞斯萊斯,最高時速120,還是我的強化迷你車,價格50,000英鎊,最高時速180?
得到您的清單后,您將如何填寫它? 首先和最后很容易,但是第二個去哪兒呢? 沿着頂部還是向下? 那么接下來沿着行,沿着列,之字形的位置是什么? 您必須決定。 之后,編碼應該很容易。
我想您想要的是將具有“相似”特征的汽車聚集在附近,此外,成本通常會向右增加,而速度通常會向上增加。
我會嘗試以下方法。 假設您有N輛汽車,並且想要將它們放在X * Y網格中。 假設N == X *Y。
這是解決優化問題的標准“本地搜索”方法。 您這里擁有的基本上是一個簡單的組合優化問題。 另一種嘗試的方法可能是使用自組織映射(SOM),該矩陣具有預先設置的速度和成本梯度。
基本上,您必須采用速度或價格中的一種作為主要值,然后獲得具有與該主要值相同的值的汽車,並按升/降序對這些值進行排序,並且根據需要,還按升/降序來選擇主值。
c1(20,1000)c2(30,5000)c3(20,500)c4(10,3000)c5(35,1000)
讓我們假設汽車(速度,價格)為上面列表中的度量,而主要是速度。
1以最小速度開車
2然后獲得所有具有相同速度值的汽車
3按照車價升序排列這些值
4以下一個最小速度值獲得下一輛汽車,並重復上述過程
c4(10,3000)
c3(20,500)
c1(20,1000)
c2(30,5000)
c5(35,1000)
如果您發布使用的語言,這將對我們有所幫助,因為某些語言結構使此操作更容易實現。 例如,LINQ使您在這種情況下的生活變得非常輕松。
cars.OrderBy(x => x.Speed).ThenBy(p => p.Price);
編輯:
現在,您已經獲得了列表,按照將這些汽車項目放入網格的方式進行,除非您知道會有如此多的預定汽車具有這些值,否則您將無法像預期的那樣使用固定的網格大小進行任何操作現在。
一種選擇是使用不均勻的網格,如果願意,每行都有特定速度的汽車項目,但這僅在您知道會有相當數量的汽車具有相同速度值時才適用。
因此,每一行將具有網格中顯示的相同速度的汽車。
謝謝
10x10約束是否必要? 如果是這樣,則您必須具有十種速度和十種價格,否則該圖將沒有太大意義。 例如,如果最快的汽車不是最昂貴的汽車會發生什么?
我寧願建議您使網格大小等於
(number of distinct speeds) x (number of distinct prices),
那么這將是一個(相當)簡單的通過兩個軸進行排序的情況。
如果數據源自數據庫,則應在從數據庫中獲取數據時對其進行排序。 這僅意味着在查詢末尾但在LIMIT
部分之前添加ORDER BY speed, price
(其中“ speed”和“ price”是相應字段的名稱)。
正如其他人所說,“最快和最昂貴”是一件很難的事情,您應該只選擇一個首先進行排序。 但是,可以使用以下算法進行近似:
這確保了汽車A比汽車B更快,更昂貴,並且在清單上名列前茅。 一個值較高而另一個值較低的汽車將被粗略排序。 我建議將這些值存儲在數據庫中,並根據您的選擇進行排序。
將它們放在10x10的網格中很容易。 開始輸出項目,當達到10的倍數時,開始新的一行。
另一種選擇是對每輛汽車應用0 .. 200%
的分數,並按該分數排序。
例:
score_i = speed_percent(min_speed, max_speed, speed_i) + price_percent(min_price, max_price, price_i)
嗯...這里的氣泡排序可能是簡單的算法。
當以下兩個元素處於“錯誤順序”時:a)它們是水平鄰居,左一個元素比右元素慢,b)它們是垂直鄰居,而上一個元素比下一個元素便宜。
但是我實際上不確定該算法是否對每個數據都停止。 我幾乎可以肯定它非常慢:-)。 它應該易於實現,並且經過有限次數的迭代后,部分結果可能足以滿足您的目的。 您也可以使用此處提到的其他方法之一開始生成數組。 而且,它將保持您在陣列形狀上的條件。
編輯:現在證明任何東西為時已晚,但是我在python中做了一些實驗。 看起來可以在幾秒鍾內以這種方式對100x100的隨機數組進行排序,而我總是設法獲得完整的2d排序(也就是說:最后,我得到了錯誤排序的鄰居)。 假設OP可以預先計算該數組,那么他可以將任意數量的汽車放入數組中並得出明智的結果。 實驗代碼: http ://pastebin.com/f2bae9a79(您需要matplotlib,我也建議使用ipython)。 iterchange
是那里的排序方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.