【发布时间】:2020-09-09 18:03:54
【问题描述】:
假设我们有数据 a₁, ..., aₙ,其中 n 是偶数并且每个 aᵢ ∈ ℝ。还要定义两对元素之间的距离 dis(aᵢ, aⱼ) = | aᵢ - aⱼ |。现在程序应该输出一个按距离升序排序的元素对列表。此外,程序应该将输入数据打包成对,因此每个元素 aᵢ 在输出中只会出现一次。
例如,给定输入 [1, 0.4, 3, 1.1],输出应为 [(1, 1.1), (0.4, 3)]。
一种简单的蛮力方法是计算所有C(n,2)对并排序每对的距离。
def not_in_list_of_pair(i, ls):
return not i in [p[0] for p in ls] + [p[1] for p in ls]
def calc(ls):
ls = sorted(ls)
d ={}
for idx1, i in enumerate(ls[:-1]):
for idx2, j in enumerate(ls[idx1+1:], idx1 + 1):
d[(i,j)] = j - i
# 2nd part
res = []
for pair in sorted(d, key = lambda k: d[k]):
i, j = pair
if not_in_list_of_pair(i, res) and not_in_list_of_pair(j, res):
res.append(pair)
return res
# another example
ls = [1, 0.1, 2, 2.4, 3, 4, 1.5]
assert calc(ls) == [(2, 2.4), (1, 1.5), (3, 4)]
但是这种幼稚的方法仅适用于 O(n²),并且第二部分(提取最小距离)也很慢。因此,我正在寻找一种更有效的方法来解决这个问题。谢谢!
【问题讨论】:
-
计算两点之间的曼哈顿距离
-
@deadshot 很抱歉造成混乱。本来以为绝对值距离是曼哈顿距离的特例。
-
您必须检查每个组合,没有其他选择。您可以做的一件事是使用
set而不是list -
感觉这在 O(n log n) 时间内应该是可行的,但是在不循环扫描列表的情况下将其全部完成会有点技巧。
-
排序是 O(n log n),并且按排序顺序获得成对距离感觉就像在 O(n记录 n)。