- 主题:请教一个算法
有n个二元数组(x,y),每个二元组表示一条线段
现在要把有共同端点的线段连起来, 比如(1,2)(2,3) 连成(1,3)
什么算法比较好
--
修改:iwannabe FROM 120.229.207.*
FROM 120.229.207.*
n多大规模?如何评价结果优劣,比如(1,2)应该接(2,3)(3,4)还是接(2,8)?
【 在 iwannabe 的大作中提到: 】
: 有n个二元数组(x,y),每个二元组表示一条线段
:
: 现在要把有共同端点的线段连起来, 比如(1,2)(2,3) 连成(1,3)
: 什么算法比较好
: --
:
发自「今日水木 on 电饭煲控制器」
--
FROM 101.224.148.*
表示线段需要一个x,y坐标对啊
你做的是想合并集合吧
【 在 iwannabe (I wanna be) 的大作中提到: 】
: 有n个二元数组(x,y),每个二元组表示一条线段
: 现在要把有共同端点的线段连起来, 比如(1,2)(2,3) 连成(1,3)
: 什么算法比较好
: ...................
--
FROM 27.91.71.*
warshall algorithm for transitivity closure
【 在 iwannabe 的大作中提到: 】
: 有n个二元数组(x,y),每个二元组表示一条线段
: 现在要把有共同端点的线段连起来, 比如(1,2)(2,3) 连成(1,3)
: 什么算法比较好
: ...................
--
FROM 183.95.135.*
正好我写过类似的需求,给你参考一下,我是要合并范围,不是合并点
def merge_ranges(input_list):
"""
输入[[start,end],[start,end],[start,end]....]
返回[[start,end],[start,end],[start,end]....]
其中重复的范围已经被merge
"""
assert(all([isinstance(i,list) for i in input_list]))
temp=copy.deepcopy(input_list)
temp.sort(key=lambda x:x[0])
merged=[temp[0]]
for current in temp:
previous=merged[-1]
if current[0]<=previous[1]+1:
previous[1]=max(previous[1],current[1])
else:
merged.append(current)
return merged
--
FROM 171.216.89.*
并查集 了解一下?
--
FROM 103.37.140.*
for循环不够吗?
【 在 iwannabe (I wanna be) 的大作中提到: 】
: 有n个二元数组(x,y),每个二元组表示一条线段
: 现在要把有共同端点的线段连起来, 比如(1,2)(2,3) 连成(1,3)
: 什么算法比较好
: ...................
--
FROM 119.131.204.*
应该是共线的概念,也就是端点重合,然后在一条直线上
想到的用途是cad作图精简数据
【 在 greenonline (绿皮快车) 的大作中提到: 】
: n多大规模?如何评价结果优劣,比如(1,2)应该接(2,3)(3,4)还是接(2,8)?
: 发自「今日水木 on 电饭煲控制器」
--
FROM 119.131.204.*