减少基本图形公式的复杂度/计算时间

问题描述 投票:1回答:1

我尝试使用基本公式(是从另一个SO问题中得到的,用于计算n顶点的不同边集的最大数量:

2**(n*(n-1)/2)

但是它仅对小范围的数字有用-然后变得太复杂了。

是否有改善此公式/降低复杂性的方法?

python math time-complexity graph-theory
1个回答
0
投票

无法从帖子的表格中以数学形式简化此公式。您帖子中的公式是指可以连接具有n个顶点的简单(无环或多个边)无向图的可能方法的数量。

这是通过首先获取顶点数n来计算的。每个顶点可以连接到可能的n-1边,因为它不能连接到自身。所以我们有n(n-1)

现在,我们需要考虑到边缘是无向的。这意味着可能的边的数量减半,给我们n(n-1)/2

最后,每个边在边集中可以存在或不存在。这可以通过长度为n(n-1)/2的1和0的二进制字符串来可视化,其中1表示存在边,而0表示没有边。我们可以写这种数字字符串的方法有2^(n(n-1)/2),范围从无边图形000...000到完整图形111...111

无法根据计算时间来简化此公式。当我们处理n ∈ ℤ时,可以用Python将公式重写为:

math.sqrt(2**(n**2 - n))

但是因为它使用math.sqrt,所以这不可能更快。您也可以使用:

2**(n*(n-1)//2)

使用//来避免使用具有最大值的浮点数。使用Python整数计算边缘集的最大数量意味着您仅受可用内存的限制。

© www.soinside.com 2019 - 2024. All rights reserved.