是否有可能在比 (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?

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

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

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) 更短的时间内找到那些有效的?

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

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

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

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

distinct 并构成 有效的三角形 并且你有 O(n**3) 复杂性只是为了 enumerate(和输出)他们

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

首先对列表进行排序。

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

总的来说,新的复杂度是 O(n^2 log(n))