是否有可能在比(n 选择 3)更好的时间内找到可以从长度列表中形成的三角形数量?

Posted

技术标签:

【中文标题】是否有可能在比(n 选择 3)更好的时间内找到可以从长度列表中形成的三角形数量?【英文标题】:Is it possible to find the number of triangles that can be formed from a list of lengths in better than (n choose 3) time? 【发布时间】:2016-10-04 15:00:49 【问题描述】:

这与我正在处理的一个更大的问题有关。

例如,假设我们有一个列表

9 5 6 1

可能的个三角形都有边长

(9,5,6)
(9,6,1)
(9,5,1)
(5,6,1)

有效的(通过三角不等式)是

(9,5,6)
(5,6,1)

是否有可能在比O(n choose 3) 更好的时间找到那些有效的?

【问题讨论】:

@Deadly 尼古丁,你说的 O(n 选择 3) 是什么意思,是 O(n^3) 吗? @Abdenaceur Lichiheb 他说的是二项式系数 @AbdenaceurLichiheb 是的,对不起。我的意思是说有N个选择3个这样的可能性,但是找到这些可能性的蛮力算法确实是O(N^3) 这个问题是否是这里的主题是discussed on Meta。 【参考方案1】:

一般情况下,答案是:假设你得到了

 1, 1 - ε, 1 - 2 * ε, ..., 1 - (n - 1) * ε 

在这种情况下,所有 3 个项目的组合

 n * (n - 1) * (n - 2) / 6 = O(n**3)

distinct 并制作 有效的三角形 并且您有 O(n**3) 复杂性只是为了枚举(和输出 ) 他们

【讨论】:

【参考方案2】:

首先对列表进行排序。

现在不是做完整的 O(n^3) 搜索,我们只需要在 O(n^2) 中搜索一对点并找到第三个点(可能不止一个点,所以你需要检查下界和上界)通过二分查找。

所以总体上新的复杂度是 O(n^2 log(n))

【讨论】:

是的,但这只是对它们进行计数,如果您想要生成实际的三元组,最坏的情况仍然是O(n^3),因为您需要以某种方式生成输出 @cobarzan,是的,你是对的,确定我只是给出了三角形的数量,但如果你需要实际的三元组,那么它绝对是 O(n^3) ,但仍然被认为是局部优化。【参考方案3】:

没有。你可以有一个任意大的输入集合,其中每个三元组都是一个有效的三角形。

【讨论】:

以上是关于是否有可能在比(n 选择 3)更好的时间内找到可以从长度列表中形成的三角形数量?的主要内容,如果未能解决你的问题,请参考以下文章

给定一组 n 个点 (x,y),是不是有可能在 O(n logn) 时间内找到它们之间具有负斜率的点对的数量?

如何在蛮力搜索之外找到凸包中的最大三角形

计算 n 的值 选择 k

在 O(n) 时间内找到数组中的 10 个最大整数

我有一个新算法可以在线性时间内找到因子或素数 - 需要对此进行验证

谷歌面试:在给定的整数数组中找到所有连续的子序列,其总和在给定范围内。我们能比 O(n^2) 做得更好吗?