在進行編碼前要簡單介紹幾個知識點:有向圖,鄰接矩陣,可達矩陣
現實中常常會表示從乙個地點到另乙個地點的路徑,這樣的帶有從起點到終點的路線表示可以用有向圖表示。如下圖所示:
在該圖中,可以看成由地點f1到f2,以及f1到f3,f3到f2的路徑。
這種有向圖也表示兩個因素的相互影響關係,再結合上面的有向圖,我們可以理解為因素f1對因素f2有影響,對f3也有影響,因素f3對f2也有影響。
鄰接矩陣內的元素表示兩兩元素之間的關係,在鄰接矩陣中,矩陣[i,j]表示從fi可以直接到達fj,或者fi可以直接影響fj。
再看上圖,f1,f2,f3之間的鄰接矩陣為:
在該鄰接矩陣中,1表示可以直接影響,或者直接到達,0表示不可影響或不可到達。
鄰接矩陣的元素進行運算遵循以下規則:
可達矩陣中的元素表示從乙個地點到另乙個地點是否存在乙個路徑,或者乙個因素到另乙個因素是否有影響路徑。
可達矩陣可由鄰接矩陣得到,得到的方法有如下規則:
假設有鄰接矩陣a,以及單位矩陣i(i和a的維度是相同的),則對兩進行進行(a+i)運算,當滿足如下關係時:
則m就是求出來的可達矩陣。
其實這種利用鄰接矩陣求可達矩陣的運算就是簡單的與或運算,網上有很多**都是根據與或運算來得到的,但是可以有另外一種思路,就是在總結上述矩陣時,先使用傳統的矩陣運算獲得矩陣,在獲得新矩陣時,先對矩陣進行處理,處理邏輯為:若元素值大於或等於1,則該元素就是1,如果是0,則就是0,不管它。我的**就是這種思想。
我們採用了網上有答案的乙個鄰接矩陣進行測試,原矩陣為:
可以看出已經將鄰接矩陣和單位矩陣進行了初步的處理。
求可達矩陣簡單**如下:
#使用numpy包
import numpy as np
relat_matrix =np.matrix([[1,0,1,1,1,0,0],[0,1,0,0,0,1,1],[0,1,1,0,0,0,0],[0,1,0,1,0,0,0],[0,0,0,0,1,1,0],[0,0,0,0,0,1,1],[0,0,0,0,0,0,1]])
# 第k+1步更新的矩陣
new_matrix =relat_matrix
#第k步的更新的矩陣
old_matrix = new_matrix
#進行迴圈終止的判斷條件
m =0
#統計運算的步驟k
step =1
while m ==0:
old_matrix = new_matrix
new_matrix =old_matrix*relat_matrix
for i in range(0,len(new_matrix)):
for j in range(0,len(new_matrix)):
#如果元素大於1,就輸出為1
if(new_matrix[i,j]>=1):
new_matrix[i,j] = 1
step = step+1
print(step)
#判斷k次更新的矩陣和k+1次更新的矩陣是否相等
if( old_matrix == new_matrix).all():
#如果相等,終止迴圈,讓m=1,並輸出結果
m=1print(new_matrix,step)
輸出結果為:
從上述的執行結果可以看出,總共在執行到k=4的時候便得到了想要的可達矩陣,並將可達矩陣輸出到介面上,與原推理的最終結果如下圖是相同的。
一種計算留存的思路
在一些統計系統中,為了觀察使用者的粘度,我們會計算一系列的叫做留存的指標 次日註冊留存 2日註冊留存.n日註冊留存,比如昨天註冊了1000名使用者中,在今天有300名使用者又登入了,那麼對應於昨天的註冊留存就是30 如果再去細究,還可以去計算活躍使用者的留存情況,比如昨天登入的1000名使用者中,在...
換一種方式計算人生
人的一生到底有多長?這常常被人們當作數學題來計算,並且作為智者的名言,用於教導人們珍惜光陰。人生的計算結果,古今中外各個不同,然而計算方法卻大同小異。無非是把整體的人生進行一系列的減法,然後得出 人生淨差 並以此為結果告訴人們人生之短。以美國 讀者文摘 所刊載的乙個人生算式為例 一生以60歲為標準,...
機試題 一種精確計算
一 題目如下 精確計算 輸入兩個數m,n 均小於100 m n可能為有限小數,也可能為無限迴圈小數,如 1 4 0.25 1 7 0.142857142857142857.如果m n為有限小數,則輸出其所有的小數字,如果m n為無限迴圈小數,則輸出它小數點後面的乙個迴圈節 例如 輸入 1 4 輸出2...