我建议如下。 生成未排序的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)。 –
是的,我倾向于你的代码......并且你也有合理的答案。现在快乐吗? :) ..祝你好运! –