簡體   English   中英

計算長度為K的DAG中的路徑數

[英]Count the number of paths in DAG with length K

我有一個具有2 ^ N個節點的DAG,其值從0到2 ^ N-1。 如果x <y並且x(xor)y = 2 ^ p,則x到y之間有邊,x和y是節點值,並且pa是非負整數。 由於N可以高達100000,因此生成圖形並進行計數將需要大量的計算時間。 有什么方法可以計算具有一定長度K(K是兩個節點之間的邊數)的路徑,換句話說,是否有某種方程式可以用於這種計數? 提前致謝

邁克爾(Michael)有一些很好的見解,但我不確定我是否會遵循他的全部論點。 這是我的解決方案。

假設N = 4,K = 2。 因此,節點的范圍從0(0000 2 )到15(1111 2 )。

現在讓我們考慮節點2(0010 2 )。 因為2 <3且xor(2,3)= 1 = 2 0,所以存在2到3(0011 2 )的邊。 還有一個從2到6的邊,因為2 <6並且xor(2,6)= 4 = 2 2 從2到10有一條邊,因為2 <10且xor(2,10)= 8 = 2 3

概括地說:對於任何x,請考慮x中的所有0位。 通過將0位中的任何一位翻轉為1,您將得到一個大於y且與x相差一位的數字y。 所以從x到y有一條邊。

x中的1位數通常稱為x的填充計數 我將使用pop(x)表示x的總數。

我們正在處理N位數字(當我們包含前導零時),因此x中的0位數字是N-pop(x)。

讓我們使用術語“ j -path”來表示長度為j的路徑。 我們要計算K路徑的數量。

每個節點x都有N-pop(x)個輸出邊緣。 這些邊緣中的每一個都是1路徑。

讓我們考慮節點5(0101 2 )。 節點5的邊緣為7(0111 2 ),節點7的邊緣為15(1111 2 )。 節點5的邊緣為13(1101 2 ),節點13的邊緣為15(1111 2 )。 因此,節點5外有兩個2路徑:5-7-15和5-13-15。

接下來,讓我們再次查看節點2(0010 2 )。 節點2的邊為3(0011 2 ),節點的邊為7(0111 2 )和11(1011 2 )。 節點2還具有節點6(0110 2 )的邊緣,節點6具有7(0111 2 )和14(1110 2 )的邊緣。 最后,節點2的邊緣為節點10(1010 2 ),節點10的邊緣為11(1011 2 )和14(1110 2 )。 節點2總共有6條2路徑:2-3-7、2-3-11、2-6-7、2-6-14、2-10-11和2-10-14 。

模式是,對於z位設置為零的任何節點x,其中z≥K,x中都有一些K路徑。 要從x中找到K路徑,請選擇零位中的任何K。 將這些位一一翻轉為您提供路徑。 您可以按任意順序翻轉位。 每個訂單給出了不同的路徑。

當您要從一組n個項目中以特定順序選擇k個項目時,稱為無替換的有序樣本,並且有n個! /(nk)! 方法。 通常將其寫為n P k ,但在此處鍵入P(n,k)會更容易。

因此,正好具有2個零位的節點的P(2,2)= 2! /(2-2)! = 2條2條路徑。 (請注意,0!=1。)正好具有3個零位的節點的P(3,2)= 3 !! / 1! = 6條2條路徑。 正好有4個零位的節點的P(4,2)= 4! / 2! = 12條2條路徑。 (由於我在示例中使用N = 4,因此只有一個節點具有正好4個零位,即節點0。)

但是然后我們需要知道,有多少個節點正好有2個零位? 好吧,當有n個商品可供選擇時,我們想選擇k個商品,而我們並不關心所選商品的順序,那就是無替換的無序樣本,而有n個商品! /(k!(nk)!)的方法。 這稱為“ n select k”,通常以無法在堆棧溢出時重現的方式編寫,因此將其寫為C(n,k)。

對於我們的N = 4的示例,有C(4,2)= 6個節點,其中2位恰好設置為零。 這些節點是3(0011 2 ),5(0101 2 ),6(0110 2 ),9(1001 2 ),10(1010 2 )和12(1100 2 )。 這些節點中的每個節點都具有P(2,2)2條路徑,因此這意味着C(4,2)* P(2,2)= 6 * 2 = 12個節點中的2條路徑完全相同兩個0位。

然后有C(4,3)= 4個節點,其中恰好3位設置為零。 這些節點是1(0001 2 ),2(0010 2 ),4(0100 2 )和8(1000 2 )。 這些節點中的每個節點都具有P(3,2)2條路徑,因此,在正好三個0的節點中有C(4,3)* P(3,2)= 4 * 6 = 24條2條路徑位。

最后,存在C(4,4)= 1個節點,其中恰好4位設置為零。 該節點具有P(4,2)= 12個2路徑。

因此,當N = 4時2路徑的總數為C(4,2)* P(2,2)+ C(4,3)* P(3,2)+ C(4,4)* P( 4,2)= 12 + 24 + 12 = 48。

對於一般的N和K(其中K≤N),K路徑的數目是K≤z≤N時C(N,z)* P(z,K)的總和。

我可以這樣輸入Wolfram Alpha(或Mathematica):

Sum[n!/(z! (n - z)!) z!/(z - k)!, {z, k, n}]

並將其簡化為

2^(n-k) n! / (n-k)!

陳述的問題似乎與此等效:

考慮所有可能的長度為N的二進制字符串的集合。考慮將第i位從0翻轉到1的操作Fi。對於字符串x&y表示| x |。 設置位數x

很容易看出,只要且僅當(x,y)是K可容許的,一個人才能通過一系列完全K的操作Fi從x獲得y。 而且,如果我們固定x並對所有y求和,使得(x,y)是K可容許的,則得到(N- | x |)!

最后,我們需要用| x | <=(NK)對所有x求和。 對於| x |的給定選擇 我們有N!/(N- | x |)!| x |! x的可能選擇。 結合以上內容,即可得到給定的| x |。 有N!/ | x |! 可能的路徑。

表示| x | = M,M從0到NK,而您的答案是N!/ M!的所有M之和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM