我提出以下建议。生成未排序的 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
检索具有给定 的 y 元素的当前索引original_index
。将当前索引添加到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)时间,所以算法整体的复杂度主要由排序步骤决定。