【问题标题】:find if point intersect in graph without sorting?查找点是否在图中相交而不进行排序?
【发布时间】:2022-08-18 21:43:40
【问题描述】:

我有一个在图表上代表 X、Y 的项目列表(都从点 (0,0) 开始。 例子:

1. [(0,0),(0,1),(0,2),(1,2),(2,2)]
2. [(0,0),(0,1),(0,2),(1,2),(2,2),(2,1),(1,1),(0,1)]

第 2 项无效,因为它与点 (0,1) 相交。

为了查找是否存在交集,我对列表进行排序(nlogn)并迭代以查找 2 个点是否相同。

def is_intersect(points ):
    # points  [(0,0)...]
    points.sort()
    for m,u in zip(points,points[1:]):
        if m==u:
            return True
    return False 

我的问题: 有没有比上述算法更好的方法来找到交集(空间复杂度 O(1) 没有额外的集合或哈希集)?

  • @trincot这不是重复的,因为OP特别要求空间复杂度为O(1).
  • 所以一个“相交”列表只是一个包含相同点两次或更多的列表?我认为您可能是指时间复杂度而不是空间复杂度? Space complexity of python sort is O(n) or best case O(1)
  • 我更新了帖子。不使用额外的集合或哈希集
  • @pylos 请注意,您自己的代码确实使用了额外的空间,因为 sorted 会复制数组。如果您想在不使用额外空间的情况下就地排序,请使用points.sort() 而不是p = sorted(points)

标签: python algorithm sorting optimization


【解决方案1】:

在 O(n) 时间复杂度和 O(1) 内存中有一个算法

但是,它基于数组元素是数字的事实,因此您需要创建一个将对转换为数字的函数。

如果数字很小并且您知道它们在 [0,10^n) 范围内。您可以定义以下双射:f(x,y) = x*10^n+y
从那里使用this post 中的一种方法并根据您的需要进行调整。

【讨论】:

  • 不确定您的答案如何为主题行提供解决方案。你能通过提供一些代码来说明你的答案吗? O(n^2) 显然是一个很大的不。
  • 我删除了该部分,因为它无关紧要,我的答案中的文章对算法以及它如何与多种语言的实现一起工作进行了完整的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2022-01-15
  • 2010-11-05
相关资源
最近更新 更多