リニア再発配列アルゴリズムの問題

線形再発順序

       カラム(列)の番号場合\(A_N \)を満足\(A_N \)によって\(A_N \)と呼ばれる線形世代のk個の前に、\(A_N \)は、線形再帰的な配列であり、即ち:
[A_N = b_1a_ {N- \ -1} + b_2a_ {N-2 } + ... + b_ka_ {NK} \]

        前記\(B_i \)が一定であります

  • +力の原理を用いた高速行列乗算はO(logN個)の時間に答えることができます
  • 式を用いて配列をO(1)時間的に答えることができます

2 Pythonのコード

列の数にその行為を例として数列をフィボナッチ

import numpy as np
import datetime

A = [[1,1], [1, 0]]
a1 = [[1],[1]]

mat_a1 = np.asarray(a1)


for n in range(3, 39+1):
    # 矩阵乘法 + 快速幂
    t1_s = datetime.datetime.now()
    mat_R = np.asarray([[1,0], [0,1]])
    mat_A = np.asarray(A)

    r = n - 2
    while r > 0 :
        if r & 1 == 1:
            mat_R = mat_R.dot(mat_A)
        mat_A = mat_A.dot(mat_A)
        r >>= 1

    F_n = mat_R.dot(mat_a1)[0][0]
    t1_e = datetime.datetime.now()
    print("F_%d = %d\t cost time(1E-6s):%d" % (n, F_n, (t1_e - t1_s).microseconds))

図1は、コードの実行を示します

おすすめ

転載: www.cnblogs.com/Kalafinaian/p/11546178.html