Click here to load reader

فصل سوم ( ادامه )

Embed Size (px)

DESCRIPTION

درس طراحی الگوریتم ها. فصل سوم ( ادامه ). روش برنامه نویسی پویا Dynamic Programming. مدرس: سید محمد بیدکی. بهار 1392. درخت های جست وجوی دودویی. تعداد درخت های دودویی با n کلید. تعریف یک درخت دودویی از مجموعه مرتبی از عناصر (کلیدها) حاصل می شود به گونه ای که: هر گره حاوی یک کلید است. - PowerPoint PPT Presentation

Citation preview

Dynamic Programming ( ): 1392

() : . . .

n - : - : () . . .

. - : - : depth(key) + 1

:n pi keyi ci keyi .

- : - :

p1 = 0.7 p2 = 0.2 p3 = 0.13(0.7) + 2(0.2) + 1(0.1) = 2.62(0.7) + 3(0.2) + 1(0.1) = 2.12(0.7) + 1(0.2) + 2(0.1) = 1.81(0.7) + 3(0.2) + 2(0.1) = 1.51(0.7) + 2(0.2) + 3(0.1) = 1.4

- : - : . . . keyi keyj :

:

keyi keyj = A[i][j]

A[i][i] = pi - : - : :P1=0.7, P2=0.2, P3=0.1 A[2][3] :1(P2) + 2(P3) = 0.4

2(P2) + 1(P3) = 0.5

=> A[2][3] = 0.4 - : - : K3K2K3K2 keykkey1 keyk-1Keyk+1 keyn A[1][k-1] A[k+1][n] A[1][k-1] + p1 + + pk-1 + pk + pk+1 + + pn + A[k+1][n]

- : - : K K : K: n :

A 1 n+1 0 n . R . .

- : - : Void optSearchTree( int n, const float p[], float &minavg, index R[][]) {index i, j, k, diagonal;float A[1..n+1][0..n];for (i=1; i right = tree(k+1, j);return p;}}KeysDonIsabellaRalphWallyIndex[1][2][3][4]priority3/83/81/81/8A01234103/89/811/87/4203/85/81301/83/8401/850R0123410112220222303340450A[2][3] = k=2: A[2][1] + A[3][3] + p2 + p3 = 0 + 1/8 + 3/8 + 1/8 = 5/8 k=3: A[2][2] + A[4][3] + p2 + p3 = 3/8 + 0 + 3/8 + 1/8 = 7/8

- : - : n . i i=1,2,,n wi pi . W .: .

.

- : - : W= 20wi10985544332 20Items - : - : pi brute-force n 2n . o(2n) .

- : - : 1 n .

xi i .

k .Sn = {x1 , x2 , , xn } - : - :

. xn xn=1 pn wn n-1 W-wi . xn=0 n-1 W .

n .

- : - :

B[w][k] k w .

wk k .

. - : - :

for w = 0 to WB[w][0] = 0for i = 0 to nB[0][ i] = 0for i = 1 to nfor w = 1 to Wif wi B[w][i-1]B[w][i] = pi + B[w- wi][i-1]elseB[w][i] = B[w][i-1]else B[w][i] = B[w][i-1] // wi > w - : - : for w = 0 to WB[w][0] = 0000000W012345i01234n = 4 W = 5 23453456 - : - : 000000W012345i01234n = 4 W = 5 23453456for i = 0 to nB[0][ i] = 00000 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=1pi=3wi=2w=1w-wi =-1Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)40 - : - : 000000W012345i01230000i=1pi=3wi=2w=2w-wi =0Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)403 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=1pi=3wi=2w=3w-wi=1Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)4033 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=1pi=3wi=2w=4w-wi=2Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)40333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=1pi=3wi=2w=5w-wi=2Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)403333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=2pi=4wi=3w=1w-wi=-2Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)4033330 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=2pi=4wi=3w=2w-wi=-1Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)40333303 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=2pi=4wi=3w=3w-wi=0Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)403333034 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=2pi=4wi=3w=4w-wi=1Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)4033330344 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=2pi=4wi=3w=5w-wi=2Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)40333303447 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=3pi=5wi=4w=1..3Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)403333003447034 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=3pi=5wi=4w=4w- wi=0Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)4000344703453333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=3pi=5wi=4w=5w- wi=1Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)40003447034573333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=4pi=6wi=5w=1..4Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)400034470345703453333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w 000000W012345i01230000i=4bi=6wi=5w=5

Items:1: (2,3)2: (3,4)3: (4,5) 4: (5,6)4000344703457034573333 - : - : if wi B[w][i-1] B[w][i] = pi + B[w- wi][i-1] else B[w][i] = B[w][i-1] else B[w][i] = B[w][i-1] // wi > w (LCS) DNA . DNA :{A, C, G, T}

: DNA . . - : - : ( ) S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA

S2 = GTCGTTCGGAATGCCGTTGCTCTGTAAA

S3 = GTCGTCGGAAGCCGGCCGAA - : - : longest common subsequence :x[1.. m]y[1..n]

x: A B C B D A B

y: B D C A B ABCBA = LCS(x,y) - : - : Brute-force x[1..m] y[1..n] : o(2m) : o(n) : o(n 2m) - : - : 40 : |s| . : x y C[i,j] = |LCS(x[1..i], y[1..j])|

C[m,n] = |LCS(x,y)| - : - :

- : - : 42

divide and conquer x[i] y[j] - : - : 43

m+n - : - : 44

Dynamic Programming - : - : 45 LCS-Length(X, Y)1. m = length(X) // get the # of symbols in X2. n = length(Y) // get the # of symbols in Y3. for i = 1 to m c[i,0] = 0 // special case: Y04. for j = 1 to n c[0,j] = 0 // special case: X05. for i = 1 to m // for all Xi 6. for j = 1 to n // for all Yj7. if ( Xi == Yj )8. c[i,j] = c[i-1,j-1] + 19. else c[i,j] = max( c[i-1,j], c[i,j-1] )10. return c - : - : 46j 0 1 2 3 4 5 01234iXiABCBYjBBACDX = ABCB; m = |X| = 4Y = BDCAB; n = |Y| = 5Allocate array c[5, 6] - : - : 47j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000for i = 1 to m c[i,0] = 0 for j = 1 to n c[0,j] = 0x: ABCBy: BDCAB - : - : 48j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000if ( Xi == Yj )c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )

0x: ABCBy: BDCAB - : - : 49j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )000x: ABCBy: BDCAB - : - : 50j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )0001x: ABCBy: BDCAB - : - : 51j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )00011x: ABCBy: BDCAB - : - : 52j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )001011x: ABCBy: BDCAB - : - : 53j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )100011111x: ABCBy: BDCAB - : - : 54j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )1000111112x: ABCBy: BDCAB - : - : 55j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000if ( Xi == Yj )c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )

100012111111x: ABCBy: BDCAB - : - : 56j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )1000112111112x: ABCBy: BDCAB - : - : 57j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000if ( Xi == Yj )c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )100011211112122x: ABCBy: BDCAB - : - : 58j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000if ( Xi == Yj )c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )1000112111121221x: ABCBy: BDCAB - : - : 59j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000if ( Xi == Yj )c[i,j] = c[i-1,j-1] + 1else c[i,j] = max( c[i-1,j], c[i,j-1] )1000112111121221122x: ABCBy: BDCAB - : - : 60j 0 1 2 3 4 5 01234iXiABCBYjBBACD0000000000 if ( Xi == Yj ) c[i,j] = c[i-1,j-1] + 1 else c[i,j] = max( c[i-1,j], c[i,j-1] )10001121111212211223x: ABCBy: BDCAB - : - : 61 : c[i,j] c[i-1, j] c[i, j-1] c[i-1, j-1] c[m,n] +1 x[i] .2232c[i,j] = c[i-1,j-1] +1 = 2+1=3 - : - : 62j 0 1 2 3 4 5 01234iXiABCYjBBACD000000000010001121111212211223B - : - : 63j 0 1 2 3 4 5 01234iXiABCYjBBACD000000000010001121111212211223BBCBLCS : - : - : 64

- : - : 65