实验确定矩阵行列式的计算复杂度

时间:2016-11-19 00:13:14

标签: python matrix complexity-theory timeit determinants

我需要帮助确定实验中矩阵nxn

的行列式的计算复杂性

我的代码:

    import numpy as np
    import timeit
    t0 = time.time()
    for n in range(1, 10):
        A = np.random.rand(n, n)
        det = np.linalg.slogdet(A)
        t = timeit.timeit(lambda: det)
        print(t)

但是每次n都得到相同的时间,因此计算复杂度:O(N)不正确,因为它意味着是O(N ^ 3)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

对于它的价值,任何有意义的基准测试通常都需要足够大的N来给计算机一些东西来咀嚼。 10x10矩阵不足以开始看到复杂性。开始抛出100,1000,10000等数字,然后你就会看到你的缩放。

例如,如果我稍微修改您的代码

for n in range(1, 14):
    t0 = time.time()
    p = 2**n
    A = np.random.rand(p,p)
    det = np.linalg.slogdet(A)
    print('N={:04d} : {:.2e}s'.format(p, time.time() - t0))

这导致

N=0002 : 4.35e-02s
N=0004 : 0.00e+00s
N=0008 : 0.00e+00s
N=0016 : 5.02e-04s
N=0032 : 0.00e+00s
N=0064 : 5.02e-04s
N=0128 : 5.01e-04s
N=0256 : 1.50e-03s
N=0512 : 8.00e-03s
N=1024 : 3.95e-02s
N=2048 : 2.05e-01s
N=4096 : 1.01e+00s
N=8192 : 7.14e+00s

您可以看到,对于非常小的N值,一些小值优化和技巧会导致很难看到O()复杂性,但随着N的值增长,您可以开始看到缩放。

答案 1 :(得分:0)

有一些可能的原因:

  1. 当完成 n=2 或 n=16 等“慢”操作时,用于生成这些数字的计算机正忙于做其他事情
  2. 特别是对于 n=2,可能在第一个循环之后进行了一些缓存,以加快后续运行的速度。

您通常还期望 n=1 的运行时间与 n 的比率最差,这仅仅是因为诸如变量初始化之类的恒定开销。