是否有可能在比 (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))
这与我正在处理的一个更大的问题有关。
例如,假设我们有一个列表
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))