算法计算L的最大子集,其中每对段相交

时间:2017-12-09 11:41:01

标签: algorithm recursion dynamic geometry

我在准备期末考试时遇到了这个问题,虽然我看到了类似的问题,但我找不到递归公式。 我会感谢你的帮助!

问题是: 假设我们在平面中给出了一组L个n个线段,其中是端点 每个段的位于单位圆x上 2 + y 2 = 1,所有2n端点都是 不同。描述并分析计算L in的最大子集的算法 每对段相交

解决方案需要是动态编程方法中的算法(基于递归公式)

1 个答案:

答案 0 :(得分:1)

我假设问题(" L的最强子集......")处理子集大小,而不是子集无法扩展。如果后者是真的,那么问题就很简单了,简单的贪婪算法就可以了。

现在回答你的问题。关注Matt Timmermans'提示(你可以证明吗?)这可以被视为longest common subsequence problem,除了我们不知道2个输入字符串是什么= 2个序列出现之间的分裂点是什么。

Longest common subsequence problem can be solved in O(m*n) time and linear memory。通过沿着2n - 长度数组移动分裂点,您将创建LCS问题的2n个实例,每个实例都可以在O(n^2)时间内解决,从而产生O(n^3)的总时间复杂度{1}}。

您的问题被称为clique的最大circle graph问题(对应于图形节点的线段,以及与图形边缘对应的线段交叉点),并且已在2010年显示为O(n^2*log(n))时间复杂度的解决方案。

请注意,在任意图形的情况下,最大团体问题(决策版本)是NP难的(确切地说是NP完全的)。