我建議如下。 生成未排序的x和y列表。
xs = [3, 15, 7, 5, 4, 9 ]
ys = [7, 4, 11, 0, 7, 12]
將每個元素轉換爲一個元組 - 第一對是座標,第二個是原始索引。
xs = [(3, 0), (15, 1), (7, 2), (5, 3), (4, 4), (9, 5)]
ys = [(7, 0), (4, 1), (11, 2), (0, 3), (7, 4), (12, 5)]
對兩個列表進行排序。
xs = [(3, 0), (4, 4), (5, 3), (7, 2), (9, 5), (15, 1)]
ys = [(0, 3), (4, 1), (7, 0), (7, 4), (11, 2), (12, 5)]
創建一個數組,y_positions
。數組的第n個元素包含最初在索引n處的y元素的當前索引。
創建一個空的index_list
。 對於xs
的每個元素,獲取第二對元組original_index
。 使用y_positions
檢索給定original_index
的y元素的當前索引。將當前索引添加到index_list
。
最後,從xs
和ys
中刪除索引值。
下面是一個示例Python實現。
points = ((3, 7), (15, 4), (7, 11), (5, 0), (4, 7), (9, 12))
#generate unsorted lists
xs, ys = zip(*points)
#pair each element with its index
xs = zip(xs, range(len(xs)))
ys = zip(ys, range(len(xs)))
#sort
xs.sort()
ys.sort()
#generate the y positions list.
y_positions = [None] * len(ys)
for i in range(len(ys)):
original_index = ys[i][1]
y_positions[original_index] = i
#generate `index_list`
index_list = []
for x, original_index in xs:
index_list.append(y_positions[original_index])
#remove tuples from x and y lists
xs = zip(*xs)[0]
ys = zip(*ys)[0]
print "xs:", xs
print "ys:", ys
print "index list:", index_list
輸出:
xs: (3, 4, 5, 7, 9, 15)
ys: (0, 4, 7, 7, 11, 12)
index list: [2, 3, 0, 4, 5, 1]
的y_positions
和index_list
代是O(n)的時間,所以作爲一個整體,通過分選步驟控制了算法的複雜性。
什麼是你的算法。複雜? –
由於排序,複雜性爲O(n log n)。 –
是的,我傾向於你的代碼......並且你也有合理的答案。現在快樂嗎? :) ..祝你好運! –