You are on page 1of 151

:

29 2013

' 2013 ' .


.tomhengmail. om

0.1
, .

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

:
1.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

1.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

1.3

. . . . . . . . . . . . . .

1.4

. . . . . . . . . . . . . . . . . . . . . . . . . :

11

1.4.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

13

1.4.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

13

" " . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

17

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

20

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

20

. . . . . . . . . . . . . . . . . . . . :

27

). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :(BST

29

2.2.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

30

2.2.2

. . . . . . . . . . . . . . . . . . . . . . . :BST

30

2.2.3

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

31

2.2.4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

32

2.2.5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

33

2.2.6

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

34

2.2.7

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

36

Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . :BST

37

2.3.1

. . . . . . . . . . . . . . . . . . . . . . . . . . :InOrderTraversal

37

2.3.2

PreOrderTraversal . . . . . . . . . . . . . . . . . . . . :BST

38

2.3.3

PostOrderTraversal . . . . . . . . . . . . . . . . . . . . :BST

39

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :AVL

39

2.4.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :AVL

42

2.4.2

. . . . . . . . . . . . . . . . . . . . . . . . :AVL

42

2.4.3

AVL . . . . . . . . . . . . . :

43

2.4.4

. . . . . . . . . . . . . . . . . . . . . :AVL

46

2.4.5

AVL . . . . . . . . . . . . . . . . . . . . . . . . . :

47

2.4.6

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :AVL

49

2.4.7

Cut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :AVL

49

2.4.8

. . . . . . . . . . . . . . . . . . . . . . . . . . . :AVL

50

2.4.9

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :t-AVL

51

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

53

1.5
2

2.1

2.1.1
2.2

2.3

2.4

3.1
4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

55

). . . . . . . . . . . . . . . . . . . . . . . . . . . . :(Hash Fun tions

58

) (. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

60

4.1.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . :Chaining

60

4.1.2

). . . . . . . . . . . . . . . . . . . . . . . . . . :(Open Hashing

61

4.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

62

4.3

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

65

4.3.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . :

65

4.3.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . :

67

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

70

5.1

qui ksort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

70

5.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Qui kSele t

74

5.2.1

. . . . . . . . . . . . . . . . :Qui kSele t

76

5.2.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :9

78

). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :(Max-Heap

80

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

80

6.1.1

. . . . . . . . . . . . . . . . . . . . . . :

81

6.1.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Extra tMax

82

6.1.3

. . . . . . . . . . . . . . . . . . . . :In rease_Key

83

6.1.4

. . . . . . . . . . . . . . . . . . . . . . :Insert_Key

85

6.1.5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

85

6.1.6

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :

85

6.1.7

. . . . . . . . . . . . . . . . . . . . . . . :HeapSort

89

6.1.8

. . . . . . . . . . . . :11

89

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

93

7.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

93

7.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . :DFS

95

Depth First Forest . . . . . . . . . . . . . . . . . . . :

98

4.1

6.1

7.2.1
7.3

7.4

100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . :DFS
7.3.1

Depth-First-Forest . . . . . . . . . . . . . . . . . . . :

101

7.3.2

. . . . . . . . . . . . . . . . . . . .

107

7.3.3

. . . . . . . :

110

7.3.4

) . . . . . . . . . . . . . . . . . . :(12

113

114 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
7.4.1

) . :(12
3

116

7.4.2

) . . . . . . . . . . . . . . . . . . . . :(12

117

7.4.3

) . . . . . . . . . . . . . . . . . . . . . . :(12

118

7.4.4

) DAG . . :(12

119

7.5

119 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :BFS

7.6

123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
7.6.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Dijkstra

123

7.6.2

) Bellman-Ford (. . . . . . . . . . . . . . . :

126

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Union Find

127

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

131

10

9.1

131 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

9.2

131 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :MST

9.3

Kruskal 133 . . . . . . . . . . . . . . . . . . . . . . . . . . . :MST

9.4

Prim 135 . . . . . . . . . . . . . . . . . . . . . . . . . . . . :MST

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
10.1

10.2

137

137 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
10.1.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :Counting Sort

137

10.1.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Radix Sort

139

10.1.3

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :Insertion Sort

139

10.1.4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :Bu ketSort

140

10.1.5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . :Sele tionSort

141

10.1.6

. . . . . . . . . . . . . . . :

142

143 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
10.2.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . :

147

1 :

1
1.1


) (n n .
.
.
1.1 : f, g : N+ R :
f O (g) .1 C > 0 N0 N+ n > N0 ).f (n) C g (n
f (g) .2 C > 0 N0 N+ n > N0 ).f (n) C g (n
+
|) .|f (n)| < |g (n
f o (g) .3 > 0 N0 N N0
> n
n
) (n
). fg(n
g (n) 6= 0" 0

+
|) .|f (n)| > |g (n
f (g) .4 > 0 N0 N n > N0
f (n) n
g (n) 6= 0" . g(n)

f (g) .5 ) f O (g ) ,f (g C1 , C2 > 0 N0 N+ :n > N0


)C1 g (n) f (n) C2 g (n

1.2:
.1 ) O (g ,:


)O (g) = f : N+ R | C, N0 s.t n > N0 : f (n) C g (n
.2 ) f = O (g ) O (g
f .
.3 :
) f O (g f " g .

) f o (g f " .g

) f (g f " g .
) f (g f .g

) f (g f " g .
1.3:
.1 f (n) = n g (n) = n ) f O (g C = 1 N0 = 1 n > 1
) .f (n) = n 3n = 1 g (n ) g O (f g = 3 N0 = 1 n > 1
).g (n) = 3n 3n = 3 f (n

1.1

1 :

.2 f (n) = n g (n) = n2 ) f O (g C = 1 N0 = 1 n > 1:


)f (n) = n n2 = g (n
1.4 :
.1 : )) f O (g (o, , , )) g O (h (o, , , )) f O (h . (o, , ,
f O (g) .2" ) .g (f
.3 :
)( ).f (g

)( ) f O (g ) g O (f

)( ) f (g ) .g (f

)( ) .g (f

.4 ) f O (g h f ).h O (g
.5 ) f (g h f ).h (g
.6 ) f o (g ) f O (g ) f (g ).f (g
.7 ) f (g + h ) h o (g ).f (g
.8 )) f O (g (o, , c R+ )) cf O (g . (o, ,
:
.1 :
)( ) f O (g ) ,g O (h C1 , C2 > 0 N1 , N2 N+ > n
} max {N1 , N2:
)f (n) C1 g (n) C1 C2 h (n) = f O (h
)( > 0 ) f o (g ) g o (h N1 , N2 N+ } n > max {N1 , N2
:

)|f (n)| < |g (n)| < |h (n)| = |h (n)| = f o (h


)( ) f (g ) g (h C1 , C2 > 0 N1 , N2 N } n > max {N1 , N2
:
)f (n) C1 g (n) C1 C2 h (n) = f (h
)( > 0 ) f (g ) g (h N1 , N2 N+ } n > max {N1 , N2
:

)|f (n)| > |g (n)| > |h (n)| = |h (n)| = f (h

1 :

1.1 :

)( ) f (g ) g (h ) f O (g ) f (g ) g O (h ),g (h
) f O (h ) f (h ).f (h
.2 ) f O (g C > 0 N0 N+ n > N0:
1
) f (n) = g (f
C

)f (n) Cg (n) = g (n

) g (f C > 0 N0 N+ n > N0:


1
)g (n) = f O (g
C

)g (n) C f (n) = f (n

.3 ) f O (g) g O (f .
.4 C > 0 N N n > N:
)h (n) f (n) Cg (n) = h O (g
.5 C > 0 N N n > N:
)h (n) f (n) Cg (n) = h (g

.6 .
.7 ) f (g + h C1 , C2 > 0 N1 N+ n > N1:
))C1 (g (n) + h (n)) f (n) C2 (g (n) + h (n
1
2

< |) .|h (n )f (h

) h o (g N0 n > N0 |)|g (n
} n > max {N0 , N1:




1
1
1
C1 g (n) f (n) 1
)C2 g (n
2
2
) f (h } n > max {N0 , N1:

.8 ) f O (g C > 0 N0 N+ n > N0 ) f (n) Cg (n


) .cf (n) Cc g (n .

1.5 : f (n) = 4n g (n) = n2 ) f O (g ) g (f


C = 41 n N .n2 41 (4n) = n

1.2

1 :

1.6 n :

Bubblesort(A):
for i=1 to n-1
for j=1 to n-i
if A [j] > A [j + 1] then:
)]swap(A [j] , A [j + 1
) T (n ,n :

n1
n1
ni
n1
X
X
X
X
1 +
i
(1 + 5 (n i)) = (n 1) + 5n (n 1) 5
= 5
)T (n
i=1

i=1

j=1

i=1

)n (n 1
= (n 1) + 5n (n 1) 5
= (n 1) + 2.5n (n 1) = 2.5n2 1.5n 1
2


. , n2

) (1.5n + 1 . 
  . T n2
(1.5n 1) o 2.5n2 .2.5n2 n2

1.7 :
. " ,(n, n2 , n3 , ... ) n n


2

.n
) .(,

O
)(n
,
O
(n
log
)n
,
O
n

.O (n) , O (n log n) , O n2

1.2 :
" :
.1 : " .
.2 : " .
.3 : " "
.
:
1.8 : :
.1 Worst-Case :\
. "
.Worst-Case
.2 Best-Case :\
. "
.Best-Case
1.9 Best-Case .Worst-Case
8

1.3

Worst-Case

1 :

Worst-Case
. )) (f (n f
:
.1 ) (
)) (f (n f.
.2
" )
( )) O (f (n f.
)) (f (n
)) . (f (n "
) (n ) (log n
.
1.10 :
k n n )O (n
k
)) O (k n k n )O (n

k n O n2'( . k
). (k n

1.3

"
. ,
, .n
:
.1 " )

n (n ) Worst-Case
.(S enerio

.2 "
) ".
:
1.11
). (n
,T C n N
: A )/ (n
.T (n) < c n C = 1 n0 N . T (n) < n0
n0 n0 . } j {1, ..., n0

A } j {1, ...,0 j . j
B A" ,B [j] 6= min B A

] B [j j ] B [j j > 1

B .1 B B B [j] = min B A

.B A j ] B [j j
9

1.3

1 :

.j > 1 ] B [j B .1 A

B .

1.12
). (n
.T n0 N
: A" )/ (n
.T (n) < n0 n0
} j {1, ..., n0 . n0 j
"
" .
1.13
) (n .
: " , :

FindMin(A):
for i = 2, ..., n
]if A [i] < A [1
]swap A [i]with A [1
]return A [1
: j j ] A [j] < A [1
] A [j ] .A [1 ] A [j j < i n ] A [i] > A [j
] A [1.
: n ) (1 ). (n

10

1.4 :

1.4

1 :

, " :

Bubblesort(A [1, ..., n]):


if n>1
)]bubble (A [1, ..., n
)]bubblesort(A [1, ..., n 1

Bubble :

)]Bubble(A [1, ..., n


for j=0,...,n-1
if A[j] > A[j + 1] then
)swap(A[j], A[j + 1

) ( Bubble 1) 5n 1 , 3(
) ( .2n Bubble ) h (n )h (n
2n h (n) 5n" .n N Bubblesort ) T (n"
, Bubble ) Bubblesort(n-1 :
)T (n 1
)= T (n 1) + (n
} | {z
)bubblesort(n 1

T (n) = (1) + (n) +


} | {z

Bubble

) . T (1) = (1 :

1.14 :
.1 ) T (n) O (n : T ) O (n
n ) T (n ) T (
) T (n ) .O (n
)) T (n) O (n ) (T (n) = O (n N, C > 0 n > N
.T (n) Cn , .
.2 ) T (1) (1 :
. T n
) n" n ( 1
) .(n
1 .
.3 )) T (n) = O (1) + O (n ) (T (n) O (1) + O (n :
) ,O (1) + O (n
.
. C1 , C2 > 0
N N n > N .T (n) C1 + C2 n
.4 ) T (n) = T (n 1) + O (n :
) ,T (n 1) + O (n )
) g f + O (n ) f + O (n f + h
) .(h O (n n
n 1 .n C > 0
N N n > N .T (n) T (n 1) + Cn n ) T (n
) T (n 1 .
11

1 :

1.4 :

O , '
. , " " , "Abuse of
"notation , .
.
,
.
:
1.15 :




O (n) + O n2 = O n2 .1 ) f O (n g O n2 .f + g O n2

O (n) + O (log n) = O (n) .2 ) f O (n ) g O (log n ).f + g O (n


k
X
.3 k f1 , ..., fk i ) fi O (n )fi O (n
.
i=1

.4 ) f O (n ) g O (log n ).f g O (n log n


:
.1 f, g C1 , C2 > 0 N N n > N:
f (n) + g (n) C1 n + C2 n2 C1 n2 + C2 n2 = (C1 + C2 ) n2

f + g O n2 C1 + C2 N .

.2 f, g C1 , C2 > 0 N N n > N:
f (n) + g (n) C1 n + C2 log n C1 n + C2 n = (C1 + C2 ) n
log n n .n N ) f + g O (n.
.3 f1 , ..., fk , C1 , ..., Ck > 0 N N :n > N
f1 (n) + ... + fk (n) C1 n + .... + Ck n == (C1 + ... + Ck ) n


O n2 .O n2

.4 f, g C1 , C2 > 0 N N :n > N
f (n) g (n) C1 n C2 log n = C1 C2 n log n

) O (n
n , ) ?O (n
) ,f1 , ..., fn O (n :
Ci

n
X
i=1

Ci n =n

n
X
i=1

)fi (n

12

n
X
i=1

= )T (n

1.4 :

1 :

Ci

n
X
i=1

) .T O (n

.n :
1 =n max Ci n = max Ci n2
1in

1in


O n2 ).O (n
1.4.1

n
X
i=1

max Ci = n max Ci
1in

1in

n
X
i=1

Ci n

n
X
i=1

T (n) n

:Bubblesort
)T (n) = (n) + T (n 1
C1 , C2 > 0 n N:
)C2 n + T (n 1) T (n) C1 n + T (n 1
.C2 T (1) C1
1.16 " n N Bubble ) (n .n = 1
" ) n n 2 ,n 1 ( "
, :
)T (n) C1 n + T (n 1) C1 n + C1 (n 1) + T (n 2
n
X
)n (n + 1
i = C1
... C1 n + C1 (n 1) + ... + C1 1 = C1
2
i=1
) ,T (n) C2 n(n+1 n N:

2
)T1 (n

)T2 (n

z
|}
{
|}
{
z
C2 2 C2
C1 2 C1
n +
)n T (n
n +
n
2
2
2
2


) T2 (n) T (n) T1 (n
n N
T1 O n2 T2  n2


T O n2 ,T n2 .T n2
n
X
)fi (n
= ) T (n ).fi O (n
i=1

1.4.2 :
:
1.17

Bubblesort

).T O (n



1.18" T n2 .T n2 ) T O (n
C1 , C2 > 0 N N n > N C1 n2 T (n) C2 n
" .

13

1.4 :

1 :

: : n = 1 )) T (1) O (1 (.
: ) T (n 1) O (n 1 )) T (n) O (n (.
: :

more abuse
)O (n 1) + O (n) = T (n) = O (n

{|}z
=

)T (n

more abuse
)T (n 1) + O (n

{|}z
=

)T (n

)) O (n 1) + O (n) = O (n ( ) f O (n
) g O (n 1 C1 , C2 > 0 N N n > N:
(f + g) (n) C1 n + C2 (n 1) = (C1 + C2 ) n C2 (C1 + C2 ) n
) O (n ) O (n 1 ).O (n
) ,T O (n . T (n 1) + O (n) = O (n 1) +
) ,O (n "
.
1.19 O
. . ) T O (n
C > 0 n .T (n) Cn

) T (1) O (1 C > 0 . T (1) C


) T (n) = T (n 1) + O (n C n .T (n) T (n 1) + C n
o
n
C = max C , C ) T O (n.

: .T (1) C C

: ).T (n 1) C (n 1
: C" :n

T (n) T (n 1) + C n C (n 1) + C n C (n 1) + Cn = 2Cn C 2Cn

T (n) 2Cn
) T (n) Cn ( . .

.
1.20

BubbleSort

,T n .

: C > 0 n N .T (n) Cn2

) T (1) (1 C > 0 .T (1) C


) T (n) = T (n 1) + (n C n .T (n) T (n 1) + C n
o
n

.C = max C , C T O n2:

14

1.4 :

1 :

.T (1) C 12 C 12
2

) T (n 1) C (n 1 :

2
2
T (n) T (n 1) + C n C (n 1) + C n C (n 1) + Cn = C n2 1n + 1 Cn2
C" T (n) Cn2

D > 0 n N ).Dn2 T (n

) T (1) (1 D .T (1) D
) T (n) = T (n 1) + (n D .T (n) T (n 1) + D n
o
n

.D = 21 min D , D T (n) n2:

.T (1) D 12 D 12
2

) T (n 1) D (n 1 :
0

|}
{
2
T (n) T (n 1) + D n D (n 1) + D n = Dn2 + D 2D n + D Dn2



T O n2 T n2 .T n2
1.21 :

DoSomething(A [1, ..., n]):


if n > 2
)BubbleSort(A
q n3

)]DoSomething(A [1, ..., q


)]DoSomething(A[q + 1, ...., n
" :


+ n2

2n
3

+T

n
3

T (n) = T

).T (1) = T (2) = (1 , C > 0 n:


 
 



  n 2
n
2n
1 n
2 n
2
+T
+ Cn T
+T
+C

T (n) T
3
3
3 3
3 3
3
!




 2
 


1 2n
5n2
2 2n
2n
4n
+ T
+T
+C
+ Cn2 4 T
+ C n2 +

3 3
3 3
3
9
9
!
!
 k
k  i
X
5
2
n + C n2 +
n2
... 2k T
3
9
i=1

15

1.4 :

k log 32 n < 3



5
= Cn 1 +
= C n2
4
2

1 :


n = 1

2k
n
3k

 i
X
5


2 k
3
2

1+

i=1

.T :

Cn

k  i
X
5

n +

i=1


,T O n2 D > 0 n:
 
 



  n 2
n
2n
1 n
2 n
2
+T
+ Dn T
+T
+D
T (n) T

3
3
3 3
3 3
3
!




 2


1 2n
n2
2 2n
2n
n
+ T
+T
+D
+ Dn2 T
+ Dn2 +

3 3
3 3
3
9
9
n
n2
n
... T
+ Dn2 + D
+ ... + D k
k
3
9
9
  
k
k log 13 n 3nk < 3 T 32 n = 1 k":
n2
n
+ ... + D k Dn2
9
9

T (n) 1 + Dn2 + D



T n2 " .T n2

" :



2

T (n) = T n3 + T 2n C1 , C2 > 0 n N:
3 + n
 
 
n
n
2n
2n
2
T
+T
+ C2 n T (n) T
+T
+ C1 n2
3
3
3
3

) T (3) (1 D1 , D2 > 0 .D22 T (3) D12 } c1 = 9max {C1 , D1


} c2 = min {C2 , D2 .T (n) n2
: n = 3

c2 < D22 T (3) D12 < c21


: k < n ,c2 k 2 T (k) c1 k 2 ,n :

IH

 2
z}|{  n 2
2n
c1
6
+ C1 n c1
+ c1
+ n2 = c1 n2 < cn2
3
3
9
9
2

c1 9C1

5
+ 1 c2 n 2 > c2 n 2
9

c1
9

= + c2 n 2

2n
3

+T

n
3

T (n) T

.C1 :

2

2n
3

+ c2

 n 2
3

+ C2 n2 c2

2n
3

+T

n
3

T (n) T


c2 n2 T (n) c1 n2 T n2 .

16

1 :

1.5

1.5 " " :

" " :

1.22 MergeSort A :n

MergeSort(A):
if n > 1 do:

) Mergesort(A 1, ..., n2


) Mergesort(A n2 + 1, ..., n


)Merge(A 1, ..., n2 ,A n2 + 1, ..., n ,n

Merge :

Merge(A [1, ..., m] , B [1, ..., k] , C [1, ..., k + m]):


Ap=1 , Bp=1 , Cp=1.
While Cp k + m do:

While (B [Bp] < A. [Ap] or Ap = m + 1 and Bp < k + 1 do):


]C [Cp] B [Bp

In rement Cp
In rement Bp

While (A [Bp] < B. [Ap] or Bp = k + 1 and Ap < m + 1 do):


]C [Cp] A [Ap

In rement Cp

In rement Ap
]Return C [1, ..., k + m
:
.1 .
.2 log2 n
1 . Merge
.
Merge :Merge k, m .k + m
k + m C ). (k + m
.k + m
:MergeSort n Merge ) (n
. Mergesort ) T (n :
n
)+ (n
T (n) = 2T
2

17

1.5 " " :

1 :

) .T (1) = (1

. C1 , C2 > 0 n:
n
n
+ C1 n T (n) 2T
+ C2 n
2T
2
2

mergesort . ] [1, ..., n

  

1, ..., n2 , n2 + 1, ..., n :

 

h
n i h n
n i
n
3n + 2
3n + 2
1, ... , + 1, ...., , + 1, ...,
,
+ 1, n
4
4
2
2
4
4

nk
k ) (merge 
C1 , C2 0 k .C1 nk T nk C2 nk
k k :
n
n
n
kC2 = C2 n
C1 n = kC1 kT
k
k
k
1 ) log2 (n :
)T (n

C2 log2 (n) n

{
n
k

|}

kT

)log2 (n

k=1

C1 log2 (n) n

).T (n log n
: " "n a 
. nb . nk
:
n

+ nk
T (n) = a T
b
1.23 )(:

+ nk
. q = bqk:

.1 q = 1 .T nk log n

.2 q < 1 .T nk

.3 q > 1 .T nlogb a


n
b

T (n) = aT ) T (1) = (1 a, b, k > 0 a, b




: T (n) = at nb + nk C, C 0 :
n
n

+ Cnk T (n) a T
+ C nk
aT
b
b
m


 k
bnm am
bnm
m:




 a m
 n k
  n
k
m

n
a
C k
nk = am C m
am T m am C
=C
nk
b
b
b
bm
bk

18

: 1

: " "

1.5

: 1 logb (n)
T (n)

}|
{
z

logb (n)
logb (n) 

logX
b (n) 




X
X
m
m

a
n
a
m
k
a
t

C
n

nk
C

bk
bm
bk
m=1

m=1

m=1

logb (n) 

m=1


: T nk log (n)

a m
=
bk

log b (n)

m=1

a
bk

= 1 .1

1 = logb (n)

T nk logb (n)

Clogb (n)nk T (n) C logb (n)nk

logb (n)nk logb (n) nk =


: logb (n)nk nk log n

1
log (n) nk = logb (n)nk O nk log n
log (b)


: T nk 0 < bak < 1 .2

(
)
logb (n) 
1 



 a
X
X
m
m
a
a
k
k
k= C
n
=
C
n

C
nk T (n)
Cn

bk
bk
bk
m=1
m=1

!
)
(


b (n) 
logX


m
X
a
a m
C
k
k
k
 nk = Cn
C
n =
n C
a
k
k

b
b
1

bk
m=1
m=1

C > 0
.C,

: T nlogb a bak > 1 .3
C

b (n) 

logX

m
a
nk = C
T (n) C

bk
m=1


a log b (n)+1
bk

a
1
bk

nk =

}|
!{ 

 a logb (n)+1
C

1 nk
a
bk
1
bk

 a logb (n)+1
alogb (n)+1
alogb (n)+1
alogb (n) a
C k
nk = C klog (n)+1 nk C k log (n)+1 nk = C k log (n) nk
b
b
b
b
b
b
b
b
 
  log (a)
  log (n)
b
n
C
a
C
a
C a a b
logb (a)
nlogb (a) = Cn
nk =
nk =
=
b
b
nk
b
blogb (nk )

logb (a) T (n) C


.Cn

19

2.1 : (ADT) Abstra t Data Type



,:
.1 .
.2 LIFO push,pop'.
.3 FIFO enqueue,dequeue'.
:
).Sear h(k

).Insert(k

).Delete(k
.

) (Su essor ) (Prede essor .


.
.

2.1

2.2 : ) G = (V, E V )" (|V | = n E


)" .(|E| = m .
2.3 E V V ) (v1 , v2
) (v2 , v1 ) "" ( .
2.4 ) :(Path ) G = (V, E {v1 , ..., vr } V }i {1, .., r i
.(vi , vi1 ) E
2.5 v1 .vr
2.6 : ) G = (V, E , v V
(v, w) E .v 6= w V
2.7 v ) .(v
2.8 : ) G = (V, E } {v1 , ..., vr v1 = vr , r > 1
) v1 = vr (.
2.9 , r > 1 .v1 = vr
2.10 : ) G = (V, E .
20

2.1 :

2.11 : ) G = (V, E v1 , v2 V v1 .v2


2.12 : ) G = (V, E , C V G
.
2.13 C .
2.14 : ) G = (V, E .
2.15 ) (:
) G = (V, E n m ,:
.1 m < n 1 G n m .
.2 G .m n 1
.3 G m n 3 .
.4 G ) m = n 1 n 1(.
:
.1 ,m m = 0 0 n n .

m 1 .m e G )} G = (V, E\ {e
m 1 n m + 1 , G
:

e G G n m + 1 .

e G G n m .
n m ,G.
.2 G n m 1 .m n 1

.3 m = n
. .n m = n = 3 ""
. n 1 n n
. :
G :1

G n 1 3 n 1 G
.G
2 v V
. 2
. v .
.4 , 2 .m n 1 n = 1, 2
0, 1 . n 3
3 ) m < n ( . n 1 m < n ,m = n 1
.

21

2.1 :

2.16
) G = (V, E " .|E| = |V | 1
= : |E| = |V | 1 .
= |E| = |V | 1 . "

. G G
|V | 2 | |V | |V
|V | 1.

2.17 )Tree

:(Rooted ) G = (V, E

.
2.18 .
.
.
2.19 :
) G = (V, E )( .
: v0 .v0 6= V v0
. } m = {v0 , v1 , ..., vr ,

} .m = {v0 , u1 , ..., us , w m m ,
w = v0 w .
i, j ,w = vi = uj :
w = uj 7 uj+1 7 ... 7 7 vr1 7 ... 7 vi+1 7 vi = w
G .
2.20
.

2.21 : ) G = (V, E ,:
.1 : .
.2 : ) .(1
.3 : v V w V .
.4 : .
.5 : ) .(0

22

2.1 :

2.22 : ) G = (V, E:
.1 : .
.2 : )
(.
.3 :
.
.4 : 2 0.
2.23:
.1 .
.2 .
2.24 ) h(:
h 2h.
: :h
0

: h = 0 .2 = 1
: h 1 .h
: h
.h 1 .2h1
,2h1 + 2h1 = 2h.

2.25 ) (:
T ,h:
.1 k 2k 2h.
.2 .2h 1
.3 .2h+1 1
.4 2h .h

:
.1 :k
0

: k = 0 .2 = 1
: k 1 .k

: k 1 2k1 . k
k 1 k 1 2 . k
,2 2k1 = 2k.

23

2.1 :

.2 :h
0

: n = 0 , .2 1 = 0

: n < h .n + 1

: n + 1 n
.n n .2n 1
n 2n
. .2n 1 + 2n = 2 2n 1 = 2n+1 1
.3 .2h + 2h 1 = 2h+1 1
.4 1 d 2d
) .2height(T 2h ,h.

2.26 )(:
h " .2h
: ) l (T .T
h

= h .2

= T h 2h , h .
: T h = 0 .
: h 1 .h

: T h .l (T ) = 2h :



 .v1" T   .h 1

T T l T = 2h h 1 .l T 2h1

vl , vr Tl , Tr
.h 1 ) 2h = l (T ) = l (Tr ) + l (Tl .l (Tl ) , L (Tr ) 2h1
,L (Tr ) < 2h1 :
l (Tl ) = 2h L (Tr ) > 2h 2h1 = 2h1 (2 1) = 2h1
l (Tl ) 2h1 ,l (Tr ) = 2h1 .l (Tl ) = 2h1
Tl , Tr 2h1 . ) h 1
Tl ) 2h1 2depth(Tl .(depth (Tl ) h 1 Tl , Tr
h 1 2h1 T.

2.27 : d
d.
2.28 .2

24

2.1

2.29 )(:
.1 d h dh.
.2 d n .logd n

:
.1 :h
0

: h = 0 .d = 1
: d .h 1

: d h d
.h 1
.dh1 ,d dh1 = dh.
.2 .
k dk )
( . ) (h dh , n dh
) ,h logd (n.

2.30 : ) T = (V, E .
2.31 :6
) D (T ,T :
.1 | D (T ) = | .
.2 .

:
.1 , :
)(1
)(2

)(6

)(4

)(3

)(8

)(9

)(5

)(10

9 6 4 3 5 8 10 .
.2 ) ( :

25

2.1 :

Diam(x):
if x=null:
)return (1, 1
)(diam_r,height_l) Diam (x.left

)(diam_r,height_r) Diam (x.right


a = max {height_l,height_r}+1

}b = max {diam_l,diam_r,height_l+height_r + 2

)return (a, b

:
2.32
T ,x:
.1 .h (T ) = max {h (T (x.left)) , h (T (x.right))} + 1
.2 }.D (T ) = max {D (T (x.left)) , D (T (x.right)) , h (T (x.left)) + h (T (x.right)) + 2
: .1
.1 : n = 1 0 :
h (T ) = max {1, 1} + 1 = 0
: k < n .n T n .x
. "
.
h (T ) = h (T (x.right)) + 1
.
.2 : n = 1 0 :
D (T ) = max {1, 1, (1) + (1) + 2} = 0
: k < n .n T n ,x
:
"
" .
) D (T ) = D (T.right .

,x.right ) ,(x, x.right ) (x, x.left
.x.left )) H (T (x.right
)) H (T (x.left :
D (T ) = h (T (x.left)) + h (T (x.right)) + 2

26

2.1

n :
: n = 0 ) (1, 1 .
k < n .n
:
. .
1
. ,
.

: ) (1
)) (n n (
2.1.1

) (n ,
). (n log n
2.33 : A X )"
( ]is X [i] < X [j
i, j . :
yes

) (Xj < Xk
..
.

) (Xi < Xj

no

)(....
..
.

" .X
X ) (
.
2.34
.
2.35
)). (n log (n
:
.1
. h ).h (n log n
.2

n ! n .
n !.n

27

2.1 :

: L , ! L n
.L 2h ,n! 2h .log2 (n!) h :

n
n
z}|{ X
)log2 (i
log2
2
n
i= 2

n
X

> )log2 (i

i= n
2

n
X
i=1

n
))= (log2 (n) 1) (n log (n
2

= )!h log2 (n

n

n
= log2
2
2

 n i n2 )log2 (i
.log2 n2 ) h n2 (log2 (n) 1 n N .
2.36 ) ,log (n!) (n log n , :
)log (n) = n log (n

n
X

< )log (i

i=1

n
X

= )!log (n

i=1

.
2.37
). (log n
2.38 """ , " " ".

:
.
x) x : y ( :
x < y
.x < y
x > y
.x > y
x = y
.x = y

. n K n
K n . ) h (n ,n"

" .
2h ) .3h(n ) n 3h(n )h (n) log3 (n
n N )) .h (log3 (n ) log3 (n) (log n )) ,h (log (n.

28

2.2 ):(BST

2.39
) log (n
:
n ) h (n ."
)
( .
n , ) 2h(n , ) n 2h(n
) h (n) log2 (n .n N ) log2 (n) (log n )) ,h (log (n.
2.40 " ). (n

2.2

)BST

(:

2.41 : ) T = (V, E T .root


i V:
) i.parent (.
i.left ) i.right \ (.
) key (i .

:
.1 y V x V ).key (y) key (x

.2 y V x V ). key (y) < key (x


2.42 .
2.43 : ) T = (V, E BST x T:
T (x) .1 .x
T (x.left) .2 .x
T (x.right) .3 .x
2.44 T .T
x T x .
2.45 :
)(17
)(300

)(350

)(12

)(12

)(22

29

)(1

2.2 ):(BST

12 .17 :
)(17
)(300

)(350

)(20

)(12

)(1

)(22

2.2.1 :BST
k :x

TreeSear h(x,k):
"if x = null return "not found
else if key (x) = k return x
else
)if k < key (x
)return TreeSear h(x.left,k
else
)return TreeSear h(x.right,k
: Worst Case ) (h
h
. , ): (h

)IterativeTreeSear h(x,k
while x 6= null and key (x) 6= k
)if k < key(x

x x.left

else

xx.right

return x.
2.2.2

:BST

x :

TreeMin(x):
while x.left 6= null
xx.left

return x

30

2.2 ):(BST

TreeMax(x):
while x.right 6= null
xx.right

return x

: ) (h
x\ " .
2.2.3

:BST

:
2.46 :
x ) s (x ) ( .
x .1 .
.2 x ) s (x .x
.3 ) s (x )( x x .x
y V 2.47 x V y x.
: ) :(2 ) T (x .x ) T (x x
) x ( , )).w = min (T (x.right
) w = s (x )/ T (x
z ).key (x) < key (z) < key (w
2.48 :

BST

x T z T ))(x)) key (z) max (T (x

min (T

" ).z T (x

) z (x 6= T.root )).min (T (x)) key (z) max (T (x


: )/ T (x
z T .root x T .root ) (,
z y = x ) .z T (x y
.y y 6= x )/ T (x
x :
.1 ) key (x) < key (y x y ) T (x y
) .key (y y z
y y :

)key (anything in T (x)) < key (y) key (z

)) key (z) > max (T (x .

.2 ) key (y) < key (x x y ) T (x y


) .key (y y z
y y :

))key (z) key (y) < key (anything in T (x

)) key (z) < min (T (x .


31

2.2 ):(BST

) z T (x )).min (T (x)) key (z) max (T (x


z ) key (x) < key (z) < key (w ) w T (x :

))min (T (x)) key (x) < key (z) < key (w) max (T (x
) z T (x ) key (x) < key (z ) z T (x.right < )key (z
) key (w )) ,w = min (T (x.right z".
) :(3 ,w x w
. x w
w ) ) (key (x) < key (w ) ( x
x . w w
x x, w ) (w "
.

Su (x):
if x.right 6= null

)return TreeMin(x.right

else
parent=x.parent
)while (parent 6= null and parent.right = x
x parent

parent x.parent

return parent

:
.
). (2h) = (h
2.2.4

:BST

Pred(x):
if x.left 6= null

)return TreeMax(x.left

else
parent=x.parent
)while (parent 6= null and parent.left = x
xparent

32

2.2 ):(BST

parentx.parent

return parent

":
2.49 ::
BST T x T z T )) min (T (x)) key (z) max (T (x" ).z T (x
2.50 :
x ) p (x ) ( .
x .1 .
.2 x ) p (x .x
p (x) .3 ) ( x x .x

: ) :(2 ) T (x .x ) T (x
x ,x ) .w = max (x.left ) w = p (x
z ) key (w) < key (z) < key (x "
)/ T (x
z ) key (w) < key (z) < key (x ) w T (x :

))min (T (x)) key (w) < key (z) < key (x) max (T (x
) z T (x ) key (z) < key (x ) z T (x.left )key (w) < key (z
)) ,w = max (left (x z".
) :(3 ,w x w
. x w
w ) ) (key (w) < key (x ) ( x
x . w w
x x, w ) (w
" .

:
.
). (2h) = (h
2.2.5 :BST
) delete(T,x x ,T :
.1 x .
.2 x x .x.parent BST
x x
" .BST
.3 x .

33

2.2 ):(BST

2.51
T x T x ) s (x .
: x ) s (x ).T (x.right
) ( .
2.52 :
2.53
T x T x ) p (x .
: x ) p (x
) .T (x.left ) ( .
x :
) s(x ) 2 (.
x .

" BST

) :s(x ) s (x .
:x x
x ) .s (x ) s (x
x x ).s (x
: x )s (x
) , (h .
2.2.6

:BST

T k :

TreeInsert(T,k):
if T.root=Null:
T.root.key=k

else :
x = T.root

if k < x.key:
if x.left=Null:
x.left.key=k

else:
)TreeInsert (x.left, k
else:
34

2.2 ):(BST

if x.right=Null:
x.right.key=k

else:
)TreeInsert (x.right, k
k x :
.1 k < x.key x.left.
.2 k > x.key x.right.
BST k k .x
: .h Worst Case
k . InsertTree
Insert 3 )
( . Worst Case ). (h
2.54 : BST , :
)(2
)(4

)(1

)(3

2 1 :
)(3
)(4

)(3
= )(4

)(2

)(4) = (1

)(1

)(3

1 2 :
)(2

)(4

)(3

= )(4

)(2
= )(4

)(3

)(1

)(3

:
.
x y z x y ) x
x y ( z .y

35

2.2 ):(BST

: " x y
. BST ) y (
.BST BST z < x < y :

every hild of z < x < every hild of y


) T (z ) T (y )) min (T (y
) T (z )) min (T (y .
: :
x, y ). (1
y )) (h y (.
z " ). (1
" " ). (h
:
. ,
.z

.
2.2.7 :BST
A
TreeInsert :

BuildBST(A [1, ..., n]):


]T.root A [1

for i = 2, ..., n :

)]TreeInsert(T,A [i
.TreeInsert A
] A [i ] A [i + 1 TreeInsert
i ) (i C > 0 :


O n2

n
n2
+
2
2

)n (n + 1
=C
2

Ci = C

n
X

= )T (n

i=1




T O n2 T n2 " T n2 .

2.55

BST

n ). (n log n

: A BST .n B ,n
A BST )( InOrder
. )( InOrder B
, B . ) (n log n

36

2.3

Traversal

:BST

" B A B " .
TA A TB B ) . (n log n
)( InOrder ) (n :
)TB (n) = (n) + TA (n
)TB (n) = (n log n
TA n0 N
C > 0 TB (n) Cn log n . n )/ (n log n
,TA (n0 ) > Cn0 log n0 n0 TB (n0 ) > TA (n) = Cn0 log n0
) TB (n log n C .

2.3

Traversal BST

Traversal BST ,
:Traversal
InOrderTraversal. .1 .
PreOrderTraversal. .2 ,
.
PostOrderTraversal. .3 ,
.
2.3.1 :InOrderTraversal
: InOrderTraversal

InOrder(x):
if x.left6=Null

)InOrder(x.left

print x.key
if right(x) 6=null

)InOrder(x.right

: . n = 0 .
k < n n . n
x n " .
x x n
" . x
x " .
: ) n) (n (
) ( ) (1 .
:InOrderTraversal

InOrder(x):
37

2.3

Traversal

:BST

)x TreeMin (x

while x 6= null

)print(x.key

)x Su (x
: .
x x
.
) O (h
: n

n ) O (n O n2 )
( . n ). (n

2.56

" ). (n
: ) (n ) .O (n
, ) O (1
. ) (u, v ) u (v :
.1 v :(v.key < u.key) u u
) (v ) (u, v .
u u .
u u ).(u, v

.2 v :(v.key > u.key) u u ) Su (u = )TreeMin (u.right


) TreeMin (v ) (u, v . ) ,m = TreeMax (v m
) Su (m u m ) u "(
) (u, v . u
).(u, v
) ,O (n.

2.57 :BST InOrderTraversal


InOrderTraversal
.

. O n2

. n InOrderTraversal )O (n

.O n2
2.3.2

PreOrderTraversal

:BST

:PretOrderTraversal

PreOrder(x):
print x.key
if x.left6=Null

)InOrder(x.left
38

2.4 :AVL

if right(x) 6=null

)InOrder(x.right

: InOrder ,x
) (
) ( .
: InOrder ). (n
2.3.3

PostOrderTraversal

:BST

:PostOrderTraversal

PostOrder(x):
if x.left6=Null

)InOrder(x.left

if right(x) 6=null

)InOrder(x.right

print x.key
: InOrder
, x
.
: InOrder ). (n

2.4

AVL

: BST ),, '( ).O (h


""
.
2.58 : BST "" n )).h O (log (n
2.59 :AVL BST AVL x :
|h (T (x.left)) h (T (x.right))| 1
)) h (T (x ) (x
2.60 :AVL
)(12
)(16

)(14

)(10

)(8

)(4

)(6

39

)(2

2.4 :AVL

2.61 x x.h .

2.62 AVL BST

AVL

: nk AVL .k ) k O (log nk
AVL n n nk ) k O (log n log nk log n.
2.63

nk k .nk = 1 + nk1 + nk2


: AVL T k nk . k = 1 nk = 2
k > 1 ) ( . Tl Tr
. k 1
nk1 nk1 k 1
nk1 T
. :
nk = 1 + nk1 + #nodes in other subtree > nk1
" Tl k 1 T AVL Tr k 1
) k 2 .(1 T Tr
k 2 nk2 ,nk2
:
nk = 1 + nk1 + nk2

:nk
nk1 >nk2
k

2nk2 > 2 (2nk4 ) > ... > 2 2 nk2 k


2

{|}z
>

nk = 1 + nk1 + nk2

k2 :
(
0 k is even
k
= k 2
2
1 k is odd
:
(

2 2
k is even
k is even
=
k
+1
k is odd
2 2
k is odd
k

2 2 n0
k
2 2 n1


 k
log2 (nk ) > log2 2 2 +1 = k2 + 1

= nk2 k
2

k
2

k
k
) + 1 < log2 (nk ) = k < 2 log2 (nk ) = k O (log nk
2
2

40

2.4 :AVL

2.64
T

AVL

n k ).k O (log n

: nk n nk log n log nk ) k O (log nk ).k O (log n


2.65 n log2 n ) k (log n
" AVL n ). (log n
nk :
2.66 ' " F1 = 1 ,F0 = 0 Fn = Fn1 + Fn2 .n > 1
2.67
n N

= Fn

1+ 5
2

= ) (

1 5
2

= .

: , x2 = x + 1 xn = xn1 + xn2:


x2 x 1 = 0 = xn2 x2 x 1 = 0 = xn = xn1 + xn2
, ':
n = n1 + n2
n = n1 + n2
a, b :
Un = an + b n
:
Un = an1 + b n1 + an2 + b n2 = Un1 + Un2
a, b :
a+b=0
a + b = 1

Un = Fn " :
U0 = a0 + b 0 = 0
U1 = a1 + b 1 = 1
:
1
1
= = b =
5
5

1 5
2

1+ 5
2

1
=

= a + (a) = 1 = a

a, b Fn:


1 n
n n
1

Fn = +
= n
5
5
5

41

2.4 :AVL

' .AVL nk
AVL k nk = nk1 + nk2 + 1 n0 = 0 .n1 = 1
mk = nk + 1 :
mk = nk + 1 = nk1 + nk2 + 1 + 1 = nk1 + 1 + nk2 + 1 = mk1 + mk2

m0 = 1 = F3 ,m1 = 2 = F4 mk = Fk+3 k:
k+3 k+3

= nk = Fk+3 1

nk :
  k+3
 

k+3
k+3 k+3

= (k + 3) log
>
= log nk > log
= nk
5
5
5
5
 


log nk
+ C 1.44 log nk + C
= k < log nk + log
= 5 3 = k < log nk + C
log
{z
}
|
=C

) ,k O (log nk .

2.4.1 :AVL
T .
2.4.2

:AVL

: AVL BST .
AVL "
. "" .
: BST
.

.AVL
2.68 :
T x :
x.right .1 x.left x.
.2 ) T (x .x
xR .3 xL x.

42

2.4 :AVL

2.69 :AVL a AVL a


) a (L :
)(b

\ /bR

)(a

)a(L

)(a

\ /bL

)(b

\ /bR

\ /aL

\ /bL

\ /aL

a ) a (R :
)(b

)(a

\ /aR

\ /bR

)(a

)a(R
\ /aR \ = /bL

)(b

\ /bR

\ /bL

2.70" ). (1
2.71 .
2.4.3

AVL

2.72 LL :AVL LL a T
a a (a.left)L
) ,(b = a.left " :
)(a

) (aR

(bR )h1

)(b

(bL )h

h BL :
.1 a ) T (b AVL.
.2 ) T (b AVL bL h bR
.h, h 1, h + 1 a bL
bR h + 1 ) h .(bR bR
h 1 ) T (b .h + 1
.3 ) aL = T (b h + 1 aR h, h 1, h + 1
) T (a AVL
.1 aR h + 1 " h
aR .h 1

43

2.4 :AVL

" LL :

/aR \h h1

(a)h+2

(b)h+1

/bR \h1

/bL \h

2.73 LL

LL

a ) a (R .

: :a

/aR \h1

(a)h

(b)h+1

/bR \h1

)a(R

/aR \h1 = /bL \h

(a)h+2

/bR \h1

(b)h+1

/bL \h

, BST " :
b .1 a b a a b .
bL .2 b .
bR .3 b a .
aR .4 a .
aR .5 a b .b
.LL

2.74 RR : AVL RR a
a a ) (a.right)R
,(b = a.right " :

)(b

/bR \h

)(a

/bL \h1

\ /aL

h bR bL aL h 1.

2.75 RR

RR

a ) a (L .

44

2.4 :AVL

: :a

/bR \h

(b)h+1

/bL \h1

)a(L

(a)h

/aL \h1

/bR \h

(B)h+1

(a)h+2

/bL \h1

/aL \h1

AVL BST :
b .1 a b a a b .
bR .2 b .
bL .3 b a .
aL .4 a .
aL .5 a b .b

2.76 LR :AVL
LR a a a
) (a.left)R ,(b = a.left " :
)(a

/aR \h

/bR \h+1

(b)h+2

/bL \h

a .bR

2.77 LR

.

LR

A ) B (L ) A (R

: bR
" . "
.bR ):b (L

/aR \h

(A)h+3

/cR \h

(c)h+2

/cL \h1

(b)h+1

)b(L

/bL \h

45

/aR \h

(a)h+3

/cR \h

(c)h+1

(b)h+2

/cL \h1

/bL \h

2.4 :AVL

) a (R:

/aR \h

(a)h+1

(c)h+2

/cR \h

(b)h+1

/cL \h1

)a(R

/aR \h

/bL \h

(A)h+3

/cR \h

(c)h+2

/cL \h1

(b)h+1

/bL \h

, BST " :
.1 c a b b < c < a a c b c.
aR .2 a c c < a < everything in aR
cR .3 c a .
cL .4 c b .
bL .5 c b .everything in bL < b < c

2.78 RL :AVL
RL a a a
) (a.right)L ,(b = a.right " :

/bR \h

(b)h+2

/bL \h+1

(a)h

/aL \h

A .bL
2.79 bL
bL" .

2.80 RL

.

RL

A ) b (R ) a (L

: .
2.4.4 :AVL

2.81 RR

RR

a ) a (L .

46

2.4 :AVL

: ) aL (a h + 1 ,
" aL h .
AVL aR h + 1 h + 2 .h
h + 1 h aR .h + 2
RR b = a.right bR h + 1 AVL
bL h h + 2) h + 1 (aR
) a (L :

/bR \h+1

(b)h+2

)a(L

(a)h+1/h+2

/bL \h/h+1

/aL \h

/bR \h+1

(b)h+2

(a)h+3

/bL \h/h+1

/aL \h

bR ,h + 1 bL h h + 1 aL h
A h + 1 h + 2 " .

2.82 RR

2.83 LL,LR,RL
.
2.4.5 AVL :
n .AVL
AVL .
) (n log n :
2.84
n

AVL

). (n log n

: n2 AVL
n2 .n .

. :
: n = 0 n = 1 .
: n n + 1 . n
. n + 1
,
:
.1 AVL
.
.2 AVL RR
." ) (
.
 ) (log n

n2 " ) . (n log n
" ). (n log n

47

2.4 :AVL

.
. :

BuildAVL(A [start, ..., end]):


N start-end+1

if N < 0 return NIL


r 1 + end1
2

)]tree newNode (A [r

if N > 1:

)]A [r] .left BuildAVL (A [start,...,r-1

)]A [r] .right BuildAVL (A [r+1,...end

return tree

:
.1 NIL
.2 r .
.3 ".
.4 , .
.5
.
: BST
. ,AVL

.n
: n = 1 AVL .
: k < n .n
n
n1 AVL
.AVL n 2
. n
n2 1 . n2 H Hl , Hr
. Hl Hr .H = Hr + 1
Hr Hl + 1 .AVL
2.85 7 . .
: ) ,N
,r Node ( " ) (n n .

48

2.4 :AVL

2.4.6

:AVL

AVL T1 , T2 .
AVL T .
.
n " ) (n log n log n
AVL n ). (n log n
: |Ti | = ni } .m = max {ni
.1 InOrderTraversal
A1 , A2 "
). (m
.2 ) (m
.
.3 AVL 2m " ) (m
.
" ) (m " .
2.4.7

Cut

:AVL

AVL . ) Cut (T, k BST


. , k ,
k :
.1 T1 .k
.2 T2 .k
.3 .k

:AVL ,AVL Cut

Cut AVL
.AVL n , :

k , AVL n "
) . (log n .
A ,InOrderTraversal"
). (n
k ) (log n .i
BuildAVL ] A [1, ..., i 1 T1 ). (n

BuildAVL ] A [i + 1, ..., n T2 ). (n
T1 , T2 , k .
" .
Cut BST : ,AVL
Cut .AVL n ,
:
49

2.4 :AVL

k ) , (log n .
k ,
n ) (log n ) (1
). (log n
BST k ) (x
.
) T (x.right) ,T (x.left .x
" ). (log n
2.4.8

:AVL

k :
AVL n , k .
:1 )) O (log n ( k 1
. k k 1
. ) O (n
n ).O (n
:2 InOrderTraversal k .
InOrder .
:3 ) O (log n :

" . AVL
x x.num x ) .(x
x.num = x.left.num + x.right.num + 1 " l
l.left.num = l.right.num = 0 .l.num = 1
. num
\ . n
).O (log n
k :

FindKSmallest(x,k):
if x.num-x.right.num == k :
return x
if x.left.num k :
)return FindKSmallest(x.left, k
else:
)return FindKSmallest(x.right, k x.left.num 1
k " .
: ) O (log n
.AVL
: .
: n = 1 1 k n = 1 k = 1 r
r.num r.right.num = 1 0 = 1 = k .
: n n:
50

2.4 :AVL

k = r.num r.right.num r.num r.right.num 1 x


.x x r
k .
r.left.num k n k
" k ) r
( .
r.left.num < k ) n(
y " "k r.left.num 1 " .
r.left.num y r y k r.left.num 1
k .
:t-AVL

2.4.9

2.86 :t-AVL BST t-AVL x :


|h (T (x.left)) h (T (x.right))| t
)) h (T (x ) (x
2.87
T

t-AVL

k n ,:

.1 nt,k

t-AVL

k nt,k .k

.2 t )) k O (log (nt,k
.3 t ).k O (log n
:
.1 x T t-AVL k nt,k ) k = 0
nt,0 = 1 k = 1 .(nt,1 = 2 T k
k 1 T
" .nt,k1 T t-AVL
)) k (t + 1 )) h (T (x.left)) h (T (x.right t"
k 1 ) .(k (t + 1
T ) k (t + 1 "
) .nt,k(t+1 :
nt,k = nt,k1 + nt,k(t+1) + 1 > nt,k1
1 .
.2 t, k :

)> 2nt,k(t+1) > 2 nt,k(t+1)1 + nt,k2(t+1

)nt,k > nt,k1 + nt,k(t+1

k
)t+1 (t+1

> 4nt,k2(t+1) > ... > 2 t+1 nt,k

k is even
k is odd

0
1

k
= ) (t + 1
t+1

51

2.4 :AVL

nt,0 = 1 nt,1 = 2 :
( k
k is even
k is even
2 t+1
=
k
t+1
+1
k is odd
2
k is odd

2 t+1 nt,0
k
2 t+1 nt,1

k
)t+1 (t+1

nt,k

t+1

nt,k > 2 t+1 +1


k
k

)) + 1 < log2 (nt,k ) = k < (t + 1) log2 (nt,k ) O (log (nt,k


t+1
t+1
.3 T t-AVL k n , nt,k nt,k n < ) log (nt,k
.log n )) k O (log (nt,k ) ,k O (log n.

52

3.1 : X X ) P (X 2X
:
}P (X) = {A | A X
) P (X .X
3.2 :
X |.|P (X)| = 2|X
3.3 X , X
"
.
: :
3.4
X :

} ,P (X) {0, 1

} {0, 1 }.f : X {0, 1


X

: " ) P (X } .{0, 1 ) ,B P (X }XB : X {0, 1


B X XB (a) = 1 a B XB (a) = 0 . a X
A
X
} XB (a) {0, 1 } .XB {0, 1 } : P (X) {0, 1 . (B) = XB
b1 :
" : ) B1 , B2 P (X B1 6= B2 " b1 B1 / B2
) (B1 ) (b1 ) = XB1 (b1 ) = 1 6= 0 = XB2 (b1 ) = (B2 ) (b1 ) = (B1 ) 6= (B2
X

: } ,f {0, 1 X0 X a X0 ,f (a) = 1
f = XX0 , (X0 ) = f .
:




||P (X)| = {0, 1}X = |{0, 1}||X| = 2|X

: :
: X X .P (X) = 21
: X n 1 X n . :
C

z
|}
{
}} P ({x1 , ..., xn }) = P ({x1 , ..., xn1 }) {A {xn } | A P {x1 , ..., xn1

, )} B P ({x1 , ..., xn :
xn )} .B P ({x1 , ..., xn1
.1 / B
53

.2 xn B } B = B\ {xn } B P {x1 , ..., xn1 } .B = B {xn


,P ({x1 , ..., xn }) C A C C } {x1 , ..., xn
)} A P ({x1 , ..., xn . "
|P ({x1 , ..., xn })| = 2n1 }} {A {xn } | A P {x1 , ..., xn1 2n1
,|P ({x1 , ..., xn })| = 2n1 + 2n1 = 2n.

3.5 : ) (, F , P:
.1 .
F .2 F ).P (
P .3 P : F R :
X
= ).P (
P () = 1

A F ].P (A) [0, 1

A, B F = A B ).P (A B) = P (A) + P (B
3.6 , ) (, P
X
.
= ) P (A .
F = 2 A )P (
A

3.7 : A F )P (

= ).P (A

3.8 F .
3.9 : A, B F = ,A B
.P (A B) = 0
3.10 A, B ).P (A B) = P (A) + P (B
3.11 : ) (, F , P A F ,
A ) Ac = \A (.
3.12 : ) (, F , P A, B F ,P (B) 6= 0
).P (A|B) = P P(AB
A B )(B
3.13 ) (:
) (, F , P A, B F ,:
.1 .P (Ac ) = 1 P (A) :
.2 .P (A B) = P (A) + P (B) P (A B) :
54

3.1

.3 .P (A B) = P (A|B) P (B) = P (B|A) P (A) :


.4 A, B F A B ).P (A) P (B
3.14 ) (:
) (, F , P A F . } {B1 , B2 , ..., Bn )
( :
) P (A|Bi ) P (Bi

n
X
i=1

= ) P (A Bi

n
X

= )P (A

i=1

3.15 : ) (, F , P
1

|.P () = |

3.1 :
3.16 : ) (, F , P .X : R
3.17 " ) R (
.
3.18 :: X ) (, F , P X
:
X
= ] = E [X
)X () P (
A

3.19 " :
X ) (, F , P:
]x P [X = x

= ]E [X

)xIm(X

.
: :

X
P ()
x
)X 1 (x

)xIm(X
2

= )}x P ({ | X () = x

z}|{ X
= )X () P (
)X () P ({}) = E (X

)1 (x

)xIm(X

xIm(X) X

:
.1" ) X 1 (x . X () = x
55

= ]x P [X = x

{|}z
= )x P (

)1 (x

)xIm(X

xIm(X) X

3.1

.2 {} =

)X 1 (x

)xIm(X

3.20 1 1005000 5000 1000000 1000000


,5000 } = {1, ..., 1005000 } X : {5000, 1000000
X = 5000 5000 1000000 ,100000 :

number of households that earn 5000

1000000
1005000
5000
number of households that earn 1000000
=
= )P (X = 1000000
||
1005000
=

||

= )P (X = 5000

:
5000
1000000
+ 1000000
10, 000
1005000
1005000

E [X] = 5000

3.21 ) (:
) (, F , P X, Y : R ,:
.1 a, b R ) E [aX + b] = aE [X] + b(.
.2 c R ) E [c] = c (.
.3 ] .E [X + Y ] = E [X] + E [Y
3.22 ) (:
X ) (, F , P } {B1 , B2 ..., Bn :
) E [X|Ai ] P (Ai

n
X

= ]E [X

i=1

] E [X|A X :A F
X
X
= ]E [X|A
= )X () P (
)xP (X = x
A

) xIm(X|A

3.23
.
3.24 :
X a > 0:

]E [X
=
a
a

)P (X a
56

3.1

> 1:
1

)P (X

: :
)x P (X = x

x s.t xa

)a P (X = x

x P (X = x) +

x s.t xa

)P (X = x

x s.t xa

= ] = E [X

x s.t x<a

x P (X = x) +

x P (X = x) + a

x s.t x<a

x s.t x<a
0

|}
{
)x P (X = x) +a P (X a) a P (X a

z X

x s.t x<a

) a P (X a) = P (X a

3.25 :: ) (, F , P A F , 1A
A :
(
A
1
= )1A (
otherwise 0
3.26 :
) (, F , P A F ].E [1A ] = P [A
: :
)1A () P (

1A () P () +

= )1A () P (

A
/

]1 P () = P [A

= )0 () P (

A
/

57

= ] E [1A

1 P () +

)Fun tions

:(Hash

)Fun tions

:(Hash

) (ADT .Insert,Delete,Sear h
.
.
).O (1
4.1 N ) 8( .
) O (1 108 .
BST )) .O (log (N
) O (1 .

"" ) (
) O (1.
4.2 ) '( U " "
.
4.3 : h U
.
4.4" N U m
N . U
N .
N .
4.5 :
.1 : k h (k) = k mod m m .
.
.2 : k ) h (k) = m (Ak Ak A m
.

.
:
.1 h ) ).(O (1
.2 ) .m O (N
.3 .
4.6 ) O (1
U . "
.
4.7 : h x, y U ).h (x) = h (y

58

)Fun tions

:(Hash

4.8
U N m .|U| N m

} h : U {0, ..., m 1 U U N h U .

: h U" . Ui U
i {0, ..., m 1}) h (k) = i h( . i
|Ui | < N :
N =N m

m1
X
i=0

< | |Ui

m1
X
i=0

= ||U

U i .|Ui | N N Ui
h i .h
) (:
. U
} h1 , h2 : U {0, ..., m 1
.
U .
4.9

U N m .|U| N m

} h1 , h2 : U {0, ..., m 1 U U N h1 h2 U .

2
.|U| N m
: }.h1 , h2 : U {0, ..., m 1
=
N = N m N m


U U U = N = N m N h1
" .h2
.

U N m U N h2 .

U" h1 h2 " .

4.10 : } h : U {0, ..., m 1


1
j U } i {0, ..., m 1
.P [h (j) = i] = m
1
4.11
.m

4.12 : } h : U {0, ..., m 1 N


N
m h
. = m
4.13 " .
4.14 :
} h : U {0, ..., m 1 . }i {0, ..., m 1
N
. = m
N i

59

4.1 ) (:

)Fun tions

:(Hash

: 1i,j " j ) "i 1 j N


N
X
= Wi :
.(1 i m i 1i,j
j=1

N
m
N
N
X
X
X
X
1
N
=
= )P (1i,j = 1
= ] E [1i,j
E [Wi ] = E
= 1i,j
m
m
j=1
j=1
j=1
j=1

4.15 h .

4.1 ) (:
4.1.1

:Chaining

} h : U {0, ..., m 1
, .
, .Chaining
) O (1
) O (1 .
4.16 N Chaining
N )) O (1 (h " ) .O (N

4.17 Chaining

h
Chaining ). (1 +
: k ) ,h (k
" ) .nh(k ) (1 :
.1 k:




N
N
E [Sear h Time] = (1) + E nh(k) = (1) +
1+
m
m


E nh(k) = .

.2 ) nh(k
. k
:

)nh(k
)nh(k
X
X 1
nh(k) 1
1 nh(k) nh(k) 1
= P [k is in lo ation i] i
= i
=
n
n
2
2
)h(k
)h(k
i=1
i=1
:

 1
nh(k) 1
 1
= (1) + E nh(k)
2
2
2
1
1
)= (1) + (1 +
2
2

60

E [Sear h Time] = (1) + E

4.1 ) (:

)Fun tions

:(Hash

4.18 h .

4.1.2

)Hashing

:(Open


. 1
.
m1
h } h : U {0, ..., m 1} {0, ..., m 1 ) h (k, i {h (k, i)}i=0
} {0, ..., m 1 .k
: k ) h (k, i .
: k ) h (k, 0 "
) h (k, 1 , .
4.19 :Linear Probing h" ,linear probing
h .h (k, 1) = h (k) + i mod m

) r+1 r + 1 h
r " m
"( . .
4.20 :Quadrati Probing ,Quadrati Probing
h h (k, i) = h (k) + c1 i + c2 i2 mod m
c1 , c2 , m . lusters
h .
4.21

Hashing

:Double ,:
h (k, i) = h1 (k) + i h2 (k) mod m

h1 , h2 ) ( .
h2 ) h2 (k m ,k
m h2 h2 (k) < m k m 2 h2
h2 (k) 1 mod 2 .k
4.22 m m
m
} .{0, ..., m 1
.
4.23 :
k U } h1 , h2 : U {0, ..., m 1 . = d
mod m

))g d (m, h2 (k

)h (k, i) = h1 (k) + i h2 (k
m
d

).h1 (k

61

)Fun tions

:(Hash

4.2 :

: d ) h2 (k }) l {1, .., h2 (k h2 (k) = d l:

mod m

  m
{|}z
m
dl
= h1 (k) +
) h2 (k) = h1 (k) + m = h1 (k) + ml h1 (k
h k,
d
d
d

m k
d
,.

m
d

4.24 Chaining
N } {k1 , ..., kN ) .O (N ) h (k, i
i 2 i N i ki
:


)N (N + 1
1
N2 + N O N2
=
2
2

4.2

=i

N
X
i=1

.

.
4.25 : }} H := {h : U {0, ..., m 1
x 6= y U:
1
|})|{h H | h (x) = h (y

||H
m

= ])PhH [h (x) = h (y

h H .
4.26" x 6= y U
).h (y

||H
m

H = )h (x

4.27 :
H U .m U U
,|U | = N U x U H
1
N
| .( |H x U x
)
.1 + m
N
.m
4.28 U" i

X
: x, y U 1x,y ")) "h (x) = h (y h
= Wx
( . x U 1x,y
yU

62

4.2 :

)Fun tions

:(Hash

:
]P [1x,y = 1

= ] E [1x,y

= 1x,y

yU

yU

N 1
N
1
=1+
1+
m
m
m

E [Wx ] = E

yU

=1

|}
{
X
z}|{ z
P [1x,x = 1] +

x6=yU

4.29 m
H .U U H "
.
x 6= y:
1
m

])P [1x,y = 1] = PhH [h (x) = h (y

4.30 :
H U .m U U
.H
,|U | = N U x U

N
k U
. 1 + m

4.31 .Chaining

: k h ),h (k
) h (k ) .nh(k
) (1 :
.1 k:




N
N
E [Sear h Time] = (1) + E nh(k) = (1) +
1+
m
m


E nh(k) = .

.2 ) nh(k
. k
:

)nh(k
)nh(k
X 1
X
nh(k) 1
1 nh(k) nh(k) 1
= i
=
= P [k is in lo ation i] i
)nh(k
)nh(k
2
2
i=1
i=1
:


 1
nh(k) 1
 1
= (1) + E nh(k)
2
2
2
1
1
)= (1) + (1 +
2
2

63

E [Sear h Time] = (1) + E

)Fun tions

:(Hash

4.2 :

4.32 k N N ). (1
4.33 :
r

) H := Mrl (Z2 |U| 2l m 2 .r < l M H k U k


[k]b .l M [k]b r
H k 10 " .2
4.34
H" . : , x 6= y U ,z = x y
l ) zj = 1 (x 6= y :
]|PhH [h (x) = h (y)] = PMH [M x = M y] = PMH [M z = 0
z l ) M Mrl (Z2
l
X
.M z = 0 Mi i M z Mi zi
= M z i z = 0
i=1

" :

Mi

Mi = Mj +

j6=i | zi =1

= Mz

i | zi =1

]Mi = P [Mj =

|}
X

j6=i | zi =1

Mi = 0 = P Mj =

j6=i | zi =1

P [M z = 0] = P Mj +


r ) 21r " .(2r :
1
1
=
2r
m

= ]|PhH [h (x) = h (y)] = PMH [M z = 0

4.35 :
U m p .|U| p a, b :
ha,b (k) = (ak + b mod p) mod m
:

H = ha,b | a Zp , b Zp

. k1 6= k2 U |U| p
.k1 , k2 Zp a Zp b Zp ) .ri = (ak + b k1 6= k2
r1 6= r2 Zp:
r1 r2 (ak1 + b) (ak2 + b) a (k1 k2 ) 6 0 mod p

64

)Fun tions

:(Hash

4.3 :

Zp a (k1 k2 ) 0 a 0 (k1 k2 ) 0"


. ) p (p 1 a Zp b Zp
r1 , r2 .k1 6= k2 ha,b H k1 6= k2 U
.r1 r2 mod m r1 a, b .r1 r2 mod m
Zp ) mod m (m < p
p
,m r1 Zp
m r2 Zp r1 r2 mod m :
p
p
1
|}|{r2 ZP | r1 r2 mod m
= = m m
| |Zp
p
p
m

k1 6= k2 ha,b H

4.3

1
m

= ]P [r1 r2 mod m

]) ,P [ha,b (k1 ) = ha,b (k2.

""
) ( . "

)
(.
" " , .
"
.
4.3.1 :
,2N 2 m N 2 :
.1 h H ) " ).(O (1
.2 ) O (N m ) m O (N.
.3 .


4.36 m N 2 , 2N 2 m ) 2 "
(2 m
. 2
4.37 :
h H
).h (x) = h (y

1
2

<

]is bad

4.38

1
2

P [h h "" x 6= y

> ].P [h is good


: N N2 . H
| |H h .
 x, y m
| N2 |H H . :
m
 
||H
N
|N (N 1) |H
N2
1

=
<
||H| |H
2
m
2
m
2m
2

65

4.3 :

N2
m

)Fun tions

:(Hash

= .m N 2 :

1
||H
1
#bad fun tions in H
< 2
=
||H
||H
2

= ]P [h is bad

4.39 )(:
) T (N ,N ) .E [T ] O (N
: h1 H )
) (O (1 h1 ) 12 h1
.( 21 :
12

|}
{
|}
{
z
z
]E [T (N )] = E [T (N ) | h1 is good] P [h1 is good] +E [T (N ) | h1 is bad] P [h1 is bad
1
] E [T (N ) | h1 is good] + E [T (N ) | h1 is bad
2
h1 ) O (N , C > 0
.E [T (N ) | h1 is good] < CN h1 ,
:
1
]E [T (N )] CN + E [T (N ) | h1 is bad
2
h1 h2 H , :
1
1
)]E [T (N ) | h1 is bad] = (E [T (N ) | h2 is good] P [h2 is good] + E [T (N ) | h2 is bad] P [h2 is bad
2
2
1
1
1
1
] E [T (N ) | h2 is good] + E [T (N ) | h2 is bad] CN + E [T (N ) | h2 is bad
2
4
2
4
" :
1
1
]E [T (N )] CN + CN + E [T (N ) | h2 is bad
2
4
M N :
1
1
]CN + M E [T (N ) | hm is bad
2k
2

M1
X
k=1

E [T (N )] CN +

M:
1
M
E [T (N ) | hm is bad] 0
2M
:
1
) + O (1) = CN + 2CN = 3C N O (N
2k

k=1

E [T (N )] CN + CN

4.40
.
66

)Fun tions

:(Hash

4.3 :

4.3.2 :
) m (N :
.1 h H H
) " ).(O (1
.2 0 j m 1 nj ) j .(h (k) = j
.3 0 j m 1 .2n2j mj n2j hj
".
.4 .
4.41:
.1
| N |H"  .
"" ) m (N
2
h ) m (N N 2
) (
.
.2 m
nj ) mj n2j ( , .
.
4.42 :
.N
h
:
m1
m1
X
X
2

mj
,m + ) mj O (N
.E m + j 2nj mj
j=0

j=0

=m
m1
m1
m1
{ |} z
X
X
X
mj = E [m] +E
2n2j = m + 2E
mj m + E
n2j
j=0

j=0

) n2j O (N

j=0

m1
X

j=0

E m +

m1
X
j=0

E ) m O (N:

) n2j = O (N

m1
X
j=0

mj m + 2E

m1
X
j=0

E m +

1x,y ) ,h (x) = h (y :
#number of ordered pairs that ollide in the j'th ell

m1
X

= 1x,y =#number of ordered pairs that ollide

j=0

n2j

n
X

XX

= )#number of pairs in the j'th ell (in luding pairs of the same key

j=1

m1
X
j=0

67

4.3 :

:
#

1x,y

XX

x x=y

"

1x,y + E

XX
x x6=y

1x,y = E
=1

XX
y

"

=E

X z }| { X X
= ] E [1x,x
P [1x,y = 1] + N
E [1x,y ] +
x x6=y

mN

n2j

)Fun tions

m1
X
j=0

XX
x x6=y

XX 1
{|}z
1 XX
{|}N (N 1) z
P [h (x) = h (y)] + N N +
2N
=N+
1=N+
m
m x
m
x
x6=y

x6=y

:(Hash

XX

x x6=y

h .

m1
X
E .
) n2j O (N
j=0

.1 h .2N > m N

m1
m1
X
X
n2j > 2E
.2 n2j
h , j
j=0

j=0

.mj n2j

.3 n2j

m1
X
j=0

E n2j > 4 N

m1
X

j=0

m1
X

n2j
E
m1
m1
X
X
j=0
1

=
n2j > 2E
n2j
P [h is bad] = P
2
m1
X
j=0
j=0
2E
n2j
j=0

" " :

m1
X

E
n2j
m1
X
z}|{ 2N
j=0
1
P [h is bad] = P
n2j > 4N

=
4N
4N
2
j=0

h


m1
X
n2j 2N
.E 21 h
j=0

m1
X
.E
n2j = 2N
j=0

68

4.3 :

)Fun tions

:(Hash

4.43
H .
) mj < m
( H .m
4.44 :
.N
: :
P

.1 h n2i 4N
m ni , h } i {0, ..., m 1 N
.
, :
0im1

h , h ) O (1
N ) .O (N
) ( haining ,hash ) O (1
) O (N".

, " N
) .O (N
) O (1 4N ) O (1 "
) .O (N

.2 ) t (n
) h( ) .T (n
" , :
# m1
"m1
X
X
]) E [t (ni
= ) t (ni
E [T (N )] = E
i=0

i=0

) O (n C > 0
0 i m 1 E [t (ni )] Cni :
# m1
"m1
m1
m1
X
X
X
X
ni = CN
Cni = C
]) E [t (ni
= ) t (ni
E [T (N )] = E
i=0

i=0

i=0

i=0

) E [T ] O (N .
.3 21 h .
X
" 12 < p 1 .E [X] = 1p < 11 = 2
2
).O (1
" ) O (N .

69

5 :

5
5.1

qui ksort

qui ksort .n
. :
.1 pivot.
.2 pivot
pivot )" .(partition
.3 partition .
" :

Qui ksort(A [l, r]):


if l < r:
)]m partition(A [l, r

)]Qui ksort(A [l, m 1

)]Qui ksort(A [m + 1, r
Left,Right :

Partition(A [l, r]):


])pivot A [random (l, r

init B // reate an empty array of size r l.

for j = l, ..., r :

if A [j] < pivot then


B [l] A [j] , l l + 1

else if A [j] > pivot then

B [r] A [j] , r r 1

]B [l] A [pivot
A B

return l

:
.1 Partition ]) A [l, r (.
.2 Pivot " .
.3 B l r pivot
pivot .
Pivot .Pivot
.4 .Pivot
.5 Partition Pivot .
70

5.1

5 :

qui ksort

5.1 Pivot
. B p Pivot
.B [p] = pivot
: Partition ) Pivot (
.
)] Qui ksort(A [l, m 1 )] Qui ksort(A [m + 1, r Partition
.
: Partition ) (n ) (
) ( . m Pivot
) (m n qui ksort :
)T (n) = (n) + T (m 1) + T (n m + 1
:
]| )E [T (n)] = E [ (n) + T (m 1) + T (n m + 1)] = E [ (n)] + E [T (m 1) + T (n m + 1
n
X
)](E [T (m 1) + T (n m + 1) | m = k] P [m = k
= (n) +
k=1

n
n
X
X
1
1
= (n) +
= ])E [T (k 1) + T (n k + 1
)])(E [T (k 1)] + E [T (n k + 1
n
n
k=1

k=1

} k {1, ..., n
:

1
n

= ] P [m = k .k

n
n
n
X
X
X
1
1
1
= )])(E [T (k 1)] + E [T (n k + 1
E [T (k 1)] +
])E [T (n k + 1
n
n
n
k=1

k=1

1
])E [T (k
n

n1
X
k=0

k=1

1
E [T (k)] = 2
n

n1
X
k=0

1
E [T (k)] +
n

n1
X

k=0

, :
1
)E [T (k)] + (n
n

n1
X

E [T (n)] = 2

k=0

C1 , C2 ) C1 n (n) C2 (n ,n N n N
:
n1
X 1
1
E [T (m)] + C1 n E [T (n)] 2
E [T (m)] + C2 n
n
n
m=0
m=0
n1
X


:
n1
X

1
(UC (m)) + Cn
n
m=0

UC (n) = 2

n N:
)UC2 (n) E [T (n)] UC1 (n

71

5.1

5 :

qui ksort

) UC (n , n:
UC (m) + Cn2

n1
X

nUC (n) = 2

m=0

) UC (n + 1 n + 1 :
2

)UC (m) + C (n + 1

n
X

(n + 1) UC (n + 1) = 2

m=0

:
(n + 1) UC (n + 1) nUC (n) = 2UC (n) + 2Cn + C

(n + 1) UC (n + 1) = (n + 2) UC (n) + 2Cn + C

2Cn + C
n+2
UC (n) +
= )UC (n + 1
n+1
n+1


)C (n + 1
Cn + C
2Cn + C
2Cn + 2C
)2C (n + 1
=

=
= 2C
n+1
n+1
n+1
n+1
n+1

=C

:
n+2
UC (n) + 2C
n+1

)UC (n + 1

" :

n+2 n+1
n+2
UC (n) + 2C
UC (n 1) + 2C + 2C
)UC (n + 1
n+1
n+1
n



n
+
1
n
n+2
UC (n 2) + 2C + 2C + 2C

n+1 n
n1
..
.
=0

n+2
X1
n+2
{ |} n + 2 z
n+2
2C +
2C + 2C = (n + 2) 2C

UC (0) +2C ... +


1
n
n+1
j
j=1


) ( ,
:
1
1 1 1 1 1 1
+ + + + + +...+
2
3
4
5
6
7
n
{z
}
| } | {z
S2

S1

}= |{z
1 +
S0

n
X
1

k , 21k
:

= )H (n

j=1

1
2k+1 1

2k , k

Sk has2k values

z
|}
{
1
1
1
1
1
1
k + k
+ ... + k+1
k + ... + k = 2k k = 1
2
2 +1
2
1
2
2
2

72

1
1
= 2k k+1
2
2

5.1

qui ksort

5 :

n = 2k 1 ) k = log2 (n + 1 :
)H(n

{ |} z
k
X
1
1
)Sk k = log2 (n + 1
log2 (n + 1) = k
2
2
i=1
:
)H (n) (log2 (n + 1)) = (log n

5.2 :
)log (n + 1
)log (2n
log 2 + log n
)log (n
)log (n
= )= log2 (n) log2 (n + 1

=
=1+
log 2
log 2
log 2
log 2
log 2
":
)log (n
1
log (n) log2 (n + 1) 1 +
log 2
log 2

" :

{|}z
1
))= (n + 2) 2C H (2 + n) ((n + 2) log (n + 2)) = (n log (n
j

n+2
X
j=1

UC (n + 1) (n + 2) 2C

5.3 ) H (n) (log n c1 , c2 > 0


:
c1 log n H (2 + n) c2 log n

)(2C c1 ) (n + 2) log (n + 2) (n + 2) 2C H (2 + n) (2C c2 ) (n + 2) log (n + 2

))(n + 2) 2C H (2 + n) ((n + 2) log (n + 2

n N:
))n log n (n + 2) log (n + 2) 2n log (2n) = 2n log 2 + log (n) = 2 log 2 (n log (n
) (n + 2) log (n + 2) (n log n ).UC (n + 1) (n log n
:
)UC2 (n) E [T (n)] UC1 (n
)) UC1 (n) , UC2 (n) (n log (n )).E [T ] (n log (n

73

5.2 :Qui kSele t

5 :

5.4 ) Hn (log n
f (x) = x1 n N:
)H(n

1
)dx = 1 + log (n
x

n
1

f (1) +

{ |} z
n
X
1
j

j=1

1
dx
x

= )log (n

n N ) log (n) H (n) 1 + log (n )).H (log (n


5.5 Worst-Case Qui ksort :
Pivot
1 ) (.
n
X

)n (n + 1
=i
.O n2

2
i=1
:Qui ksort Partition Pivot
Partitions
] A [right

. n2 Qui ksort
Partition :

Partition(A [l, r]):


]pivot A [r
i l 1

for j = l, ..., r 1 do:

if A [j] pivot then

]ex hange A [i] A [j


i i + 1

]ex hange A [i + 1] A [r
return i + 1


) (n Qui ksort . n2

5.2

Qui kSele t

A n 1 k n k
) k 1 ( . k = 1 k = n .
) ( k ,
" ) (n log n .Qui ksort
:Qui kSele t
Partition RPartition , Qui kSele t
:

Qui kSele t(A [1, ...., n] , k):


if n = 1 return A [1] // k = 1 in this ase
else:
74

5.2 :Qui kSele t

5 :

)]r RPartition (A [1, ..., n

if r = k :
]return A [k
if k < r:

)return Qui kSele t(A [1, ..., r 1] , k

else:

)return Qui kSele t(A [r + 1, n] , k r + 1


: . , k < n
,n :
.1 r = k r RPartition RPartition
1, ..., r 1 ] A [r r + 1, ..., n ] A [r ]A [r
k .
.2 k < r k
] ,A [1, ..., r 1 n )Qui kSele t(A [1, ..., r 1] , k
k " k .
.3 r > k ] A [r + 1, ..., n ) ( ] A [1, ..., r k
k r + 1 ] A [r + 1, n
).Qui kSele t(A [r + 1, n] , k r + 1
: ":
Pivot RPartition Pivot
43 . n n ) 4
( pivot " n4
. 3n n2 ,
4
pivot :
1
2

n
2

#good pivots

#number of possible pivots


1
2

pivot

) T (n .
21 pivot . 12
12 . 43 n pivot
.n ) t (n RPartition
) (n pivot " :
3
4n

])E [T (n)] = E [T (n) | good pivot] P [Good Pivot] + E [T (n) | bad pivot] P [bad Pivot] + E [t (n
  
1
1
3
1
1
)n + E [T (n)] + t (n
= E [T (n) | good pivot] + E [T (n) | bad pivot] + t (n) E T
2
2
2
4
2
  
1
1
3
E T
n + E [T (n)] + Cn
2
4
2
) t (n C".

75

5.2 :Qui kSele t

5 :

:
  
  
1
1
1
3
3
1
n + E [T (n)] + Cn = E [T (n)] E T
n + Cn
E [T (n)] E T
2
4
2
2
2
4
!#
"
  
 2
3
3
3
= E [T (n)] E T
n
+ 2C n + 2Cn
n + 2Cn E T
4
4
4
"
!#
"




 k !#
k1
 j
k
X 3 j
X
3
3
3
n
+ 2Cn
E T
n
+ 2Cn
... E T
4
4
4
4
j=0
j=0
"
"
 k !#
 k !#
3
3
1
=E T
=E T
n
+ 2C
n
+ 8Cn
3
4
4
1 4
n k n = 1


3 k
4

k" :

)E [T (n)] E [T (1)] + 8C = Const + 8Cn O (n

" .
5.2.1 :Qui kSele t
Qui kSele t
Partition . .
, ) (n log n
) log2 (n Pivot "
. Qui kSele t Partition ) (n
log2 n ) (n ). (n log n
5.6 A i A ) (
. ) ( .
.

Qui kSele t

.1 A n n5 5 n
5 .n mod 5
 
.2 InsertionSort n5
) ( ,
.m1 , ..., m n
5

.3 m1 , ..., m n .q
5

.4 Partition .q
.5 m ) ] .(A [1, ..., q k m
k ] A [1, ..., q k > m
) (k m ].A [q, ..., n
: .
: ). (n
76

5.2 :Qui kSele t

5 :

5.7
. 3n
A q 10 6
: n 5 n5 5 A1 , ..., A n5


m1 , ..., m n5 . q ) m1 , ..., m n5
q ( . 12 n5 1
.q q
q " 3

3 21 n5 1 + 2 = 3n .q n 5
10 1
 
21 n5 2 5 ) q
n mod 5 (q 3 x "
:

 l m
l
m
3 n
3n
3n
1 n
= 2
6
=6
6
3
2 5
2 5
25
10
.q "
1 3 x .
"" ""
3n q .
10 6
) T (n ,n :

n
5

) O (n .

5
)) O (1 
( . ). n5 O (1) = O (n
 
 
n5 .T n5
 
modied-partition O n5 ).O (n

pivot k pivot

n k . 
7n
n 3n
10 6 = 10 + 6

.T 7n
10 + 6

" n:


7n
)+ 6 + O (n
10

+T

l n m
5

T (n) T

):T O (n
: n = 1 .
: ,k < n .n
: C1 > 0 :


l n m
7n
+T
+ 6 + C1 n
T (n) T
5
10

77

5.2 :Qui kSele t

5 :

 
7n n5 < n C > 0 :
10 + 6 < n






lnm
7n
7n
1.5n
+C
+C
+ 6 + C1 n C
+ 6 + C1 n
T (n) C
5
10
5
10


1.5n 7n
C
+ 6C + C1 n = Cn + C1 n + 6C = (C + C1 ) n + 6C
+
5
10
) (C + C1 ) n + 6C O (n .
5.2.2 :9
:5 n

n
2

.1 Sele t ).2 O (n) = O (n


2 n2 .
.
n2
.
) (,
ounters
).O (n
.2 , :
n
n1
2 2
n1
n+1
n
2 + 1 = 2 > 2
" ." n2
.

n2
Sele t .
) O (n ) O (n "
).O (n

n
2

) O (1 ," ).O (n

:6 A n ]) [0, 1 x A
] (a, b) [0, 1 .(P (x [a, b]) = b a "
" : } k {1, ..., n k "A
) O (n

).O ( n
: A :

m = n  ) .h (x) = mx k
k

k1 .1 k m
m , m
  k1 k
x m , m ) xm [k 1, k .(h (x) = xm = k
) (1 k m) ount (k ".

78

5.2 :Qui kSele t

5 :

n ).O (n
: A n 0 1 ].[0, 1
Xi

A A ) X1 (A) ..., Xm (A


i
,

A h ) k A
,( i1 1 k m
m m
:


 Uniform Dist X

n
 n
X
k1 k
k
k1
{|}z
)P A (i
= }]) I{[A(i)[ k1 , k
=
,

m
m
m m
m
m
i=1
i=1
i=1



n
k
k1
n
n
=n
=

= = n
m
m
m
n
n

) .O ( n
l A l ,
:
)
(
j1
j1
X
X
ount (i) l
ount (i) > l
| }j (l) = min j {1, ..., m
n
X

i=1

= ])E [Xk (A

i=1

l ) j (l .
sele t ) . j (l l
!
j1
X
m = l ) .j (l sele t
) ount (i
i=1

) .O ( n
) O ( n ) j (l
) .m = n O ( n
) j (l
" ) ,O ( n.

79

6 ):(Max-Heap

):(Max-Heap

6
6.1

ADT " " :


Max (A) .1 .
Extra tMax (A) .2 .
Insert (A, x) .3 .x
In rease (A, x, key) .4 x .key
BST ADT" " .
Max-Heap ADT" .
6.1 ) :(Max-Heap Max-Heap "
" , . "
" "
.
6.2:
.1 ). (1
.2 " "

.
6.3 :
. .
.
6.4 ) (:
.1 .
.2 h 2h 2h+1 1.
.3 n .log2 n
.4 .
.5 .

.1 T x T .T x

. x T
T T

T ) ( .

T T )

T( T .
80

6 ):(Max-Heap

6.1 :

.2 h 1 ) h 1
( h 1
,2h 1 h
h " 2h . , 2h
2h 1 + 2h = 2h+1 1.
.3 h:
2h n 2h+1 1 < 2h+1
h log2 n < h + 1 log2 n 1 < h log2 n h .h = log2 n

.4 x ,H H x
. 1

H . " H H
" .
.5 . h = 0 .
h .h + 1 h + 1 a
.
.h a
a
,.

6.1.1 :

. .
,
:


)A = val(1) val(2) val(3) val(4) val(5
) (:
)(1
)(3

)(7

)(6

)(5

)(2

i :
.1 i .i.left = 2i
.2 i .i.right = 2i + 1
.3 i .i.parent = 2i

.4 ).Heapsize (A

81

)(4

6 ):(Max-Heap

6.1 :

6.5 1 3 .i
"
.
. , A ] A) A [i (i
i .
6.6 , .
6.7 :
.
Max-Heapify Min-Heapify
.Max-Heapify
6.1.2

:Extra tMax

) Extra tMax (A .
) Heapsize (A .
) ( . :Max-Heapify

MaxHeapify(A, i):
L i.left = 2i

R i.right = 2i + 1

Largest i

if L heapsize(A) and A [L] > A [Largest] then:


Largest L

if R heapsize(A) and A [R] > A [Largest] then:


Largest R

if Largest 6= i then:

]swap A [i] A [largest

Max_Heapify(A, Largest).
:

6.8 MaxHeapify

) MaxHeapify(A, i ) i 2i, 2i+1(


i .
: = h i .
: h = 0 .
: h .h + 1
: ,h + 1 :
.1 i i MaxHeapify .
82

6 ):(Max-Heap

6.1 :

.2 i ,Largest 6= i" .largest = L MaxHeapify


] A [i ] A [L )) MaxHeapify(A, L L ,
MaxHeapify .(i L h
" . R
. ) i
MaxHeapify ( , :
] A [L
R R " .
] A [L ] A [L] > A [i
) MaxHeapify(A, L i .
.

:MaxHeapify )) (log n ) (n =Heapsize(A


" ).log2 (n

Extra tMax

Extra tMax(A):
]m A [1

])A [1] A [Heapsize (A

)de rement Heapsize(A


)MaxHeapify(A, 1
return m.

: A ) Extra tMax(A
. .
MaxHeapify
6.8 MaxHeapify
: )) (log n ) (n =Heapsize(A Extra tMax
MaxHeapify .
6.1.3 :In rease_Key
:

In reaseKey(A, i, key) :
"If key<A [i] return "error
else:
A [i] key

]while i > 1 and A [i.parent] < A [i


]swap A [i] A [i.parent

)i parent (i

83

6 ):(Max-Heap

6.1 :

,
.
:
.i "
.i A
. :

,
.

" . .
] A [i :
.1 ) i = 1 ( .
.2 ] ,A [i] A [i.parent
.
" .
6.9

In reaseKey

: } d {0, ..., h .
: d = 0
.
: d .d + 1
: ) In reaseKey(A, i, key i ,d + 1 :

.1 ] :A [i] A [i.parent )parent (i


.i.parent i
] A [i . i
In reaseKey i .
A
.
.2 ] ,A [i] > A [i.parent ].A [i] A [i.parent
i ] A [i.parent
] A [i .
) In raseKey(A, i.parent, key " )parent (i
) key ] A [i ] (A [i.parent
) .In reaseKey (A, i, key ) parent (i d
) In raseKey(A, i.parent, key "
) In raseKey(A, i, key .

84

6 ):(Max-Heap

6.1 :

In reaseKey .

: ). (log n
6.10 De reaseKey :
) (.
MaxHeapify .


MaxHeapify "
.
6.1.4 :Insert_Key
:

)InsertKey(A, key
)In rement Heapsize(A
A [Heapsize (A)]

)In reaseKey(A, Heapsize (A) , key

: )
( )
( ,
. In reaseKey " .
In reaseKey Insert
.In reaseKey
: " In reaseKey ) (log n
6.1.5


6.1.6

:n
.1 " )). (n log (n
.2 Insert .InsertKey
6.11
). (n log n

85

6 ):(Max-Heap

6.1 :

: InsertKey n
n ) O (log n
) .O (n log n ] .[1, ..., n
i ) .log2 (i 1
"
) (log i . n2 :
  n
lnm
  n
log
log = C
2
2
2

n
X

C log i > C

i= n
2

n
X

i= n
2

)T (n

n log n ). (n log n
:
BuildHeap n :

BuildHeap(A):
)n Length (A

for i = n downto 1:
)MaxHeapify(A, i
Return A.
: BuildHeap .
6.12 ) :(Loop Invariant
.
6.13 .

6.14 BuildHeap

1 i n i ] A [i] , A [i + 1] , ..., A [n
.
: n :1
: i = n ) MaxHeapify (A, n n
.
: i > 2 .i 1

: ) MaxHeapify(A, i 1 i 1
) 2 (i 1 2 (i 1) + 1 i 1 .
6.8 ) MaxHeapify(A, i 1 ,i 1.
: BuildHeap
)
(.
:
6.15 :

86

6 ):(Max-Heap

6.1 :

)BuildHeap(A

). (n

: ) T (n ,BuildHeap ) d (i ) i i
( D " )) .(D = log2 (n i
MaxHeapify:
)O (Height of Subtree rooted at i) = O (D d (i) + 1
6.16 d (T.root) = 0 ) ( D .D + 1
.1 )D + 1 O (D
1 .
C > 0 i ) C (D d (i) + 1:
)C (D d (i) + 1

n
X
i=1

)T (n

d ,2d
D
X
MaxHeapify :
2d
d=0

D+1

z}|{ X Dk+1
2d (D d (i) + 1) = C
2
k
k=1

k
2k

D+1
X

D
X
d=0

C (D d (i) + 1) C

2D+1 2k k = C2D+1

k=1

D+1
X

n
X
i=1

)T (n

=C

k=1

k = D d + 1 .d = D k + 1 ) D log2 (n
D+1
X k

C > 0 n N
) ,2D+1 O (n ) O (1
2k
k=1

k
C
k
2

6.17

D+1
X
k=1

k
) O (1
2k

).T (n) CC 2D+1 O (n

D+1
X

k=1

: :


2
n
n
n
n
 n
e 2 n2 1
e 2 n log e 2 e 2
e2
=
=
n
n2
n2
  n


 2
d e2
n
= sgn
1 = +n 2
= sgn
dn n
2
n

e2
n

d
dn

n 2 n = 2 . 2e > 1 n 2 e 2 > n:
k
n
n  k
n
X
1 X e2
1 X
e
k
= Sn
+
= +
k
k
2
2
2
2
2
k=2

k=2

87

k=1

6 ):(Max-Heap

6.1 :

Sn :
 k

1
e
e
e

= +
3.9
2
2 2 e
2

1 X
+
2

k=2

n
n
X
X
k
k
.

O
)(1

n N Sn 3.9
2k
2k
k=1

k=1

) .T (n) O (n ) T (n) (n n
) . (1 ) ,T (n) (n.

) :( 11
:A

.

BuildHeap2(A):
For i=1 to n=length(A):
if A [i] > A [i.parent] then j i.

while j > 1 and (A [j] > A [j.parent]):


]swap A [j] A [j.parent

j j.parent

Return A.

:
6.18
A A .
: , 1 i n
i ] A [1, ..., i 1 .
: i = 1 .
:i 1 A [1, ..., i 1] ,i 1 .


:i i A [i] < A [i.parent] = A 2i
i.parent
] A [1, ..., i ) i 2i, 2i + 1
] A [i (.
, " ] A [i )
( 2i , 4i , ... .
)] .InsertKey(A [1, ..., i 1] , A [i Insert
] A [1, ..., i .
: ] A [1, ..., n ,.

88

6 ):(Max-Heap

6.1 :

: While ,
) log2 n ( While
) .O (log n for n ) .O (n log n
] , A = [1, ..., n
.
n2 , ..., n
 log2 n2

n
n
) . 2 log2 2 (n log n " ). (n log n

6.19 InsertKey
.
6.1.7

:HeapSort

. A
) (
. :

HeapSort(A [1, ..., n]):


)B BuildHeap (A

for i = n, ..., 1:

)A [n] Extra tMax (B

return A.

: Extra tMax .
: n Extra tMax ) (log n ). (n log n
6.20 12 "
In-Pla e , .
Extra tMax Extra t
i A ] A [i + 1, ..., n
] A [1, ..., i . " .12
6.1.8 :11
3 :11
6.21
. k )) (k
) O (1 (
k " n .
) .O (n log k
k .
.1 .Newlist
.2 H k .
.3 n ) n ( :
89

6 ):(Max-Heap

6.1 :

x .NewList
.x.next
MinHeapify .
.4 .Newlist
: .
6.22
:
.1

NewList

.2

NewList

.3 .
: : NewList ) (1 ) (2 (3) . .
: . ) (2
NewList NewList ) (1.
) (2 .

x x 6= x .x x x x

x .x x x x

y ,x y x

x x y x x . ) (3 .MinHeapify
: ) (1 n Newlist n .

: ) .O (k MinHeapify
k ) ,O (log k n ) O (n log k .
4 :11
M :
) Build(A M n ).O (n

) Insert(M,i ) i ( ).O (log n


) Delete(M,i i M ).O (log n
) Median(M ).O (1

) Extra tMedian(M M ).O (log n


: ,
.
.
) :Corre t(M
.2 2
. .

90

6 ):(Max-Heap

6.1 :

:  n


log n2 ) Extra t\( log n2 .Insert
) , (log n:
= log n

2n
2

n2

n
lnm
{|} z
n
log n log 2 = log log
log
+ 1 log
2
2
2

). (log n

) :Build(A A ) ( Sele t
Partition " . , A
. .
n
 n 2

n n2 . n2
: Partition ) O (n
) O (n " ).O (n

) :Insert(M,k ) ) k > Median (M ) (O (1 Insert


) kMedian (M Insert . ) Corre t (M
.
: Insert Help ) (log n ). (log n
) :Delete(M,k ) k > Median (M Delete k ) k<Median (M
Delete k ) ).( (log n
) Corre t (M .
: Delete Help ) (log n ). (log n
) :Median(M
Median .
.
: ) O (1 )O (1
).O (1
) :Extra tMedian(M
Median .Extra tMin
.Extra tMax
: Extra t ) (log n ) . (log n
). (log n
i . :

HeapDelete(A,i):
x A.root.key

)In reaseKey(A, i, x + 1
)Extra tMax(A
91

6 ):(Max-Heap

6.1 :

) ( ,
In reaseKey" i Extra tMax
. In reaseKey Extra tMax ) (log n
" ) . (log n :

HeapDelete(A,i):
x A.root.key

)De reaseKey(A, i, x + 1
)Extra tMin(A

92

7 :

7 :
7.1

7.1 ) G = (V, E V E
. " " ) (
" " ) (.
7.2:
.1 u, v )) (u, v
) ((v, u .
.2 G n n2
n2 n .
7.3 : ) G = (V, E ,u V v V u
.(u, v) E

7.4 )Tree

:(Dire ted

.
7.5 n n 1 ) (.
7.6 : ) G = (V, E n } {v1 , ..., vn
A n n Ai,j = 1 (vi , vj ) E Ai,j = 0.


7.7 ) O |V |2
(.
7.8 : ) G = (V, E n } {v1 , ..., vn m
n " " ) (Adja en y List j
.vj
7.9 m m
.m n .n + m
)|.O (|V | + |E
7.10 : ) G = (V, E , G
C V .
7.11
.
7.12 ) , ( .
, .
v V " "v v
v.
93

7 :

7.1 :

7.13 .
7.14 ) (:
) G = (V, E n k ,:
.1 .n k
.2

)(nk)(nk+1
2


nk

:
.1 .k k = 1 2.15 n 1 , .
k 1 .k ) G = (V, E k , C1 , C2
.
k 1 ,n k + 1
,n k.
.2 )
2
( .



)n(n1
n
n
= 2 n 2 .
n
2
C1 , ..., Ck n1 , ..., nk ) (n
:
 
 
nk
n1
+ ... +
2
2
:
!
k
X
2
ni n
i=1

1
2

k
k
k
k
X
 1 X
1X 2
1X
ni
n2i
= )ni (ni 1
= ni ni
=
2 i=1
2 i=1
2 i=1
i=1

  k
X
ni

i=1

:
2

= (n k) = n2 2nk + k 2

!2

ni k

k
X
i=1

!2

)(ni 1

k
k
k
X
X
 X
n2i 2n + k
= ni + k
n2i 2
= n2i 2ni + 1
i=1

i=1

i=1

k
X
i=1

k
X
i=1

= )(ni 1

k
X
i=1


:
= n2 2nk + k 2

!2

)(ni 1

k
X
i=1

)(ni 1

k
X
i=1

= n2i 2n + k

)n2i n2 2nk + 2n k + k 2 = n2 (k 1) (2n k

94

k
X
i=1

k
X
i=1

7.2 :DFS

7 :

:
 1
1 2
n (k 1) (2n k) n
2
2

n2i n

k
X
i=1

1
2

  k
X
ni

i=1

 1
1 2
)n (k 1) (2n k) n = (n k) (n k + 1
=
2
2

7.15 :
] = [x1 + ... + xn ] [x1 + ... + xn ] = x1 [x1 + ... + xn ] + ... + xn [x1 + ... + xn

!2

xi

n
X
i=1

] +x1 [x1 + ... + xn1 ] + x1 xn + .... + xn1 [x1 + ... + xn1 ] + xn1 xn + xn [x1 + ... + xn
!2
!2
n1
n1
n1
n1
n1
X
X
X
X
X
2
xi + x2n
xi
+ 2xn
= xi + xn
xi +xn
xi
+ xn
=
i=1

i=1

i=1

i=1

i=1

: :
!2

xi

1
X

x21

x2i

i=1

1
X
i=1

: n 1 :n
!2

xi

n
X
i=1

= xi + x2n

n1
X

+ 2xn

i=1

!2

xi

n1
X
i=1

+ x2n

!2

xi

n1
X
i=1

x2i + x2n

n1
X
i=1

= x2i

n
X
i=1

, ,
2
2
x1 = 1 x2 = 1 ).(1 + (1)) = 0 < 2 = 12 + (1
, :
.1 .(Breadth First Sear h) BFS
.2 .(Depth First Sear h) DFS

7.2

DFS

DFS .Explore ) G = (V, E


v V . Explore v V
) Visited (v) = 0
( . :

Explore(v):
Visited (v) 1

w V s.t (v, w) E

)if Visited (w) = 0 then Explore (w

95

7.2 :DFS

7 :

7.16 Explore

)Explore (v

w V v .Visited (w) = 1

7.17 ) Explore (v Visited


v 1 .v

: w V v ) w w (v
Visited (w) = 1 . u v w Visited (u) = 1
Visited .0 " u ) Explore (u
.
Explore v V Visited
v 0 .1 DFS :G

DFS(G):
v V Visited (v) 0

v V do:

if Visited (v) = 0:
)Explore(v
:

" , ,
Visited ) (
.
. .G
) CC (Conne ted Component
) V
" ( . CC :

CC(G):
| CC= Init Array of size |V
CCNUM 0
)DFSCC(G

) CC (G CCNUM :

DFSCC(G):
v V do:

Visited (v) 0

v V do:

if Visited (v) = 0:
in rease CCNUM.
)Explore(v
DFSCC Explore :

96

7.2 :DFS

7 :

Explore(v):
)Previsit(v
Visited (v) 1
w V s.t (v, w) E
if Visited (w) = 0:
)Explore(w

)Postvisit(v
Previsit :

Previsit(v):
CC (v) CCNUM

,Previsit CCNUM v ) CC
v (.
:
.1 ) CC (G , CCNUM ).DFSCC (G
.2 DFSCC .V
.3 DFSCC v V ) .(v1

.4 DFSCC ) CCNUM (1 ) . Explore(v1

.5 Explore Previsit 1 CC ) CCNUM .(1


.6 v1 Explore .v1 CC = 1
Explore .DFSCC v1
CC .
.7 Explore
.DFSCC" ) ( . "
) (
. Explore " Previsit CCNUM
.
.8 .
7.18 Prev
.
:
) , (
. DFSCC
CCNUM .Explore
Explore . Explore
2
) Visited=1 (.
DFSCC | 2 |V Explore | 2 |E
:
)|O (2 |V |) + O (2 |E|) = O (2 |V | + 2 |E|) = O (|V | + |E

97

7.2 :DFS

7 :

7.19 )| O (|V |) + O (|E|) = O (|V | + |E ) f O (n) , g O (m


C1 , C2 > 0 :
)f (n) + g (m) C1 n + C2 m max {C1 , C2 } (n + m

7.2.1

Depth First Forest

7.20 ) G = (V, E "" .


7.21 .
DFS " "
.

.
.
.

" . ) (
.
DFS Tree " " .
. )
(.
7.22 :
)(e
)(d
l
l
)(a) (b
l
)(c

)(h
l
)(f ) (i
l
l
)(g) (j

Explore ,a ):Explore (a
i

Visited 0
0
0
0
0
0
0
0
0
0
CC
Prev NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
) CC (a 1 .a a"
)) Explore (b ( . prev (b) = a
) Explore (b:
j

Visited 1 0 0
0
0
0
0
0
0
0
CC
1
Prev NIL a NIL NIL NIL NIL NIL NIL NIL NIL

98

7.2 :DFS

7 :

) CC (b , 1 b " ) Explore (c ,prev (c) = b


:
i

Visited 1 1 0 0
0
0
0
0
0
0
CC
1
1
Prev NIL a b NIL NIL NIL NIL NIL NIL NIL
) CC (c 1 .c c
,b d ) Explore (d prev (d) = b
:
i

Visited 1 1 1 0 0
0
0
0
0
0
CC
1
1 1
Prev NIL a b b NIL NIL NIL NIL NIL NIL
) CC (d 1 .d d
,b b .a e
) Explore (e prev (e) = a :
i

Visited 1 1 1 1 0 0
0
0
0
0
CC
1
1 1 1
Prev NIL a b b a NIL NIL NIL NIL NIL
) CC (e 1 .e e
,a a ) Explore (a DFSCC
, , CCNUM 2" ) Explore (f
) Explore (f:
i

Visited 1 1 1 1 1 0
0
0
0
0
CC
1
1 1 1 1
Prev NIL a b b a NIL NIL NIL NIL NIL
, f " ,i ) Explore (i:
i

Visited 1 1 1 1 1 1
0
0
0
0
CC
1
1 1 1 1
2
Prev NIL a b b a NIL NIL NIL f NIL
i j ) ,Explore (j :
i

Visited 1 1 1 1 1 1
0
0
1 0
CC
1
1 1 1 1
2
2
Prev NIL a b b a NIL NIL NIL f i
j g ) ,Explore (g :
j

Visited 1 1 1 1 1 1 0 0 1 1
CC
1
1 1 1 1
2
2 2
Prev NIL a b b a NIL j NIL f i
99

7.3 :DFS

7 :

g , j ,
i , f ,h ),Explore (h
:
j

Visited 1 1 1 1 1 1 1 0 1 1
CC
1
1 1 1 1
2
2
2 2
Prev NIL a b b a NIL j f f i
h , f
) ,Explore (f DFSCC , :
j

Visited 1 1 1 1 1 1 1 1 1 1
CC
1
1 1 1 1
2
2 2 2 2
Prev NIL a b b a NIL j f f i
} {a, b, c, d, e } {f, g, h, i, j :
) (f

)(h

)(a

)(i

)(j

)(g

)(b

)(e

)(d

)(c

7.23 ,
f " .
7.24 , Prev .

7.3

DFS

7.25 : ) G = (V, E , U V
x, y U x y y .x
.
:
7.26 : ) G = (V, E , C V
.
7.27 .
7.28 .
7.29 :

100

7.3 :DFS

7 :

) G = (V, E C n n G
. C



: E E .C ,G = C, E

v C E .v n C E
n ,.
7.30" n n 1.
DFS
.
7.3.1

Depth-First-Forest

DFS DFS) G G
(Forest .
.
)
(
. :

DFS(G):
v V do:

Visited (v) 0

Prev (v) NIL

Clo k 1
v V do:

if Visited (v) = 0:
)Explore(v
Explore :

Explore(v):
)Previsit(v
Visited (v) 1

w V s.t (v, w) E

if Visited (w) = 0 then:


prev (w) v

)Explore(w
)Postvisit(v

Previsit,Postvisit :

Previsit(v):
Pre (v) lo k
101

7.3 :DFS

7 :

in rement lo k

Postvisit(v):
Post (v) lo k

in rement lo k

7.31:
ao
a
`
.1 Pre,Post | |V )
(.
.2 .
.3 DFS Previst,Postvisit )|.O (|V | + |E

.4 , prev .
:
.1 Pre .
.2 Post
.

. G
) G = (V, E } .E = {(prev (v) , v) E | prev (u) 6= NIL G
.

)
( . DFS )
( G :
.1

:(Tree ) G (.

)Edges
):(Ba k Edges

) (u, v G v u
.2
)" ) (u, v u v u (v

.3 ) : (Forward Edges ) (u, v G u v )"


) (u, v u v v (u

.4 ) :(Cross Edges G
.
:

7.32 DFS
) G = (V, E ) (

DFS

)(:

u, v V :

[pre (u) , post (u)] .1 ]) [pre (v) , post (v u, v


102

Forest

.DFS

7.3 :DFS

7 :

[pre (u) , post (u)] .2 ]) [pre (v) , post (v u v

Forest

.DFS

[pre (v) , post (v)] .3 ]) [pre (u) , post (u v u

Forest

.DFS

: .
" ) pre (u) < pre (v) < post (u) < post (v ) pre (u) < pre (v
v u .u
. " ) pre (u) < pre (v :
.1 ) pre (v) < post (u v u u .
) post (v) < post (u v u
.u ]) [pre (v) , post (v ]).[pre (u) , post (u

.2 ) post (u) < pre (v ) pre (u) < post (u < )pre (u) < post (u) < pre (v
) post (v ]) [pre (u) , post (u ]) [pre (v) , post (v .
.
u, v ) pre (v) < pre (u :
pre (u) < post (v) .1 ]) [pre (u) , post (u ]) [pre (v) , post (v u v
post (v) < pre (u) .2 .

7.33 DFS

)) G = (V, E ( v V v 6= u V G"
)< pre (v) < post (v) < post (u

)pre (u

: v u ]) [pre (v) , post (v ]).[pre (u) , post (u

Pre/Post

7.34 DFS
) G = (V, E ) (

) (:

DFS

(u, v) E :

[pre (u) , post (u)] .1 ])[pre (v) , post (v ) (u, v .


[pre (u) , post (u)] .2 ]) [pre (v) , post (v ) (u, v .
[pre (v) , post (v)] .3 ]) [pre (u) , post (u ) (u, v .

:
) (u, v :
.1 u, v ) (u, v .
.2 v u ) (u, v .
103

7.3 :DFS

7 :

.3 u v ) (u, v ) v (u .

7.35 Tree-Edges .Ba kward-Edges


7.36 )(:
) G = (V, E ) ( .DFS v V
u V " ) pre (u u v .
= : v = u u ) pre (u
. v u ) pre (u) < pre (v
v ) .pre (u v u" u
v . u v )
(.
= G " u v ) .pre (u
v u .DFS Tree" u
) v u ( . )) w = prev (v v( ,
w u )) post (w) post (u . (w = u v
u w ) .pre (u) < pre (v) < post (w) post (u
]) [pre (v) , post (v ]) [pre (u) , post (u v u
.

7.37 : ) G = (V, E {v0 , ..., vk } V < 0 i


k (vi , vi+1 ) E .(vk , v0 ) E
7.38 :
)) G = (V, E (

DFS

"

ba kward-edges

.G

= : )( , v DFS )(u, v
.v ) pre (v u ) v
( v ) Visited .(pre u v
v u . u
v ) (u, v .ba kward-edge
= .(u, v) ba kward-edge v u
G v .u ) (u, v )( ,G.

7.39 DFS :

)(i
l
)(j

)(e) (d
)(h

) (a) (b) (f

)(k
)(c
)(g

104

7.3 :DFS

7 :

Explore ,a ):Explore (a
k

Visited 0
0
0
0
0
0
0
0
0
0
0
pre
post
Prev NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
,pre (a) = 1 ,Clo k a" b ) (a, b
.b prev (b) = a ) ,Explore (b :
k

Visited 1 0 0
0
0
0
0
0
0
0
0
pre
1
post
Prev NIL a NIL NIL NIL NIL NIL NIL NIL NIL NIL
,pre (b) = 2 ,Clo k b b ) (b, d
.d prev (d) = b ) ,Explore (d :
k

Visited 1 1 0 0 0
0
0
0
0
0
0
pre
1
2
post
Prev NIL a NIL b NIL NIL NIL NIL NIL NIL NIL
,pre (d) = 3 ,Clo k d d ) (d, e
.e prev (e) = d ) ,Explore (e :
k

Visited 1 1 0 1 0 0
0
0
0
0
0
pre
1
2
3
post
Prev NIL a NIL b d NIL NIL NIL NIL NIL NIL
. e e a
a . e ,post (e) = 5
.d d ,post (d) = 6
.b b ,post (b) = 7
.a a k , prev (k) = a ) ,Explore (k
:
e
f
g
h
i
j
k
1
0
0
0
0
0
0
4
5
d NIL NIL NIL NIL NIL a

c
0

d
1
3
6
NIL b

b
1
2
7
a

Visited 1
pre
1
post
Prev NIL

pre (k) = 8 , k ,post (k) = 9


.a a ,post (a) = 10
.DFS " c ) ,Explore (c :
e
f
g
h
i
j
k
1
0
0
0
0
0
1
4
8
5
9
d NIL NIL NIL NIL NIL a

105

c
0

d
1
3
6
NIL b

b
1
2
7
a

Visited 1
pre
1
post
10
Prev NIL

7.3 :DFS

7 :

pre (c) = 11 c b .
post (c) = 12 .DFS " f ) ,Explore (f
:
e
f
g
h
i
j
k
1
0
0
0
0
0
1
4
8
5
9
d NIL NIL NIL NIL NIL a

c
1
11
12

d
1
3
6
NIL b

b
1
2
7
a

Visited 1
pre
1
post
10
Prev NIL

. f " i j ) Explore (j:


i j
1 0
14

k
1
8
9
a

g
0

h
0

f
1
13

NIL NIL NIL

b
1
2
7
a

c
1
11
12

d e
1 1
3 4
6 5
NIL b d

Visited 1
pre
1
post
10
Prev NIL

j i g i ) g ( . g
f f j
i f h
, ) Explore (h :
k
1
8
9
a

i
j
1 1
14 15
19 18
f
i

f
1
13

g h
1 0
16
17
NIL j f

c
1
11
12

d e
1 1
3 4
6 5
NIL b d

b
1
2
7
a

Visited 1
pre
1
post
10
Prev NIL

h f
.DFS DFS :
e
f
g h
i
j k
1
1
1 1 1 1 1
4 13 16 20 14 15 8
5 22 17 21 19 18 9
d NIL j
f
f
i a

c
1
11
12

d
1
3
6
NIL b

b
1
2
7
a

Visited 1
pre
1
post
10
Prev NIL

:
)(c
) (f

)(h
,

)(a

)(i

)(j

)(g

)(k
,

)(b

)(d

)(e

(c, b) E (f, b) E
) ) (f, b ) (c, b ( .
.
}.{a, b, d, e} , {f, i, j, g} , {c} , {k
106

7.3 :DFS

7 :

7.3.2

.
7.40
".

7.41 : ) G = (V, E G = V, E
} ,E = {(v, u) | (u, v) E
.G
7.42 G G u, v V
G" .G
7.43 : .

ReverseGraph(G):

|Init E array of size|E


lo 1
(u, v) E :
)E [lo ] (v, u

in rement
 lo

return G = V, E

E )|.O (|V | + |E
7.44 :Gs

) G = (V, E G ) Gs = (V s , E s
} V s = {v1 , ..., vk vi Ci (vi , vj ) E s
G ) (x, y x Ci .y Cj

7.45 Gs .
7.46 vi Ci V s ,Ci
.

7.47 DAG

) G = (V, E Gs .
: ,C1 C2 C3 ... Cn C1 G
) (v1 , u2 ) , (v2 , u3 ) , ..., (vn , u1 ) .(vi , ui Ci vi , ui
) vi ( .
i G ui
v1 u2 :
v1

v3 ... vn u1

v2 u3

u2

v1 , u2 G C1 = C2 .

107

7.3 :DFS

7 :

StronglyConne ted(G):
Perform DFS(G) and ompute post times for every vertex u.
Number the the verti es of G by order of post values.
Constru t the reversed graph G
Perform DFS(G ) starting with the vertex with the highest post value // If DFS doesn't rea h all
verti es start the next sear h from the vertex with the highest post value remaining
Constru t the DFS Trees a ording to the prev values omputed in the previous step, these are the
SCCs of G.
: DFS )| O (|V | + |E " )|O (|V | + |E
: .
DFS Post
) ( .
DFS Pre ,Post
Pre/Post DFS.
7.48 , U V:
})d (U ) = min {pre (u
uU

})f (U ) = max {post (u


uU

) d (U U ) f (U .U
7.49

) .G = (V, E (u, v) E u C
C C  

v C .f (C) > f C C DFS

.C

: C C :DFS


d (C) < d C x ,C ) pre (x

C C G x C

. (u, v) E w C )pre (x
(x .
uv
) ( x ) w w

) (7.36 C C x DFS Forest


DFS . 7.33 ) post (x) > post (u u C C



.post (x) = f (C) > f C



) d C < d (C y ,C ) pre (y

C C G x C

.  C y DFS Forest

7.33 ) post (y) > post (u u C .post (y) = f C

) (u, v C C GSCC DAG C .C

108

7.3 :DFS

7 :

) post (y C

C
.C ) post (y 


 C

post (w) > post (y) = f C w C ,f (C) > f C.


G
) ( .
7.50

C  C ) .G = (V, E (u, v) E u C

v C .f (C) < f C C .C
G G
: (u, v) E .(v, u) E



G C C .f (C) < f C

.
DFS .G post
C1 ) f (C1 . x C1

C1
.C1
G 


) " C f (C1 ) < f C ) f (C1


( . x .C1
C1 post )
( C2 . C2
G C2 C1 .
DFS

. Depth-Tree DFS
. " .
7.51 :
) G = (V, E

StronglyConne ted

.G

: DFS G
. k = 0
. k .
k + 1 , u
post
u G .Cu


7.49 post (u) = f (Cu ) > f C

C C . u
) Cu Cu
u .(u
Cu u .u



f (Cu ) > f C 7.50 G


Cu .
u . u
Cu .

109

7.3 :DFS

7 :

7.3.3 :
:
)(B) (A

) (E) (F

)(G

)(C

)(D

) (H

" .SCC

from/to A B C D E F

G H
0 0
0 0
0 0
0 1
1 1
1 0
0 0
1 0

1
0
0
0
1
0
0
0

0
1
0
0
0
0
0
0

1
0
0
0
0
0
0
0

0
0
1
0
0
0
0
0

1
0
0
0
0
1
0
0

A
B
C
D
E
F
G
H

0
0
0
1
0
0
0
0

] [A B C F
][B E
][C D
][D A H
][E F G H
][F B G
][G
][H G

A
B
C
D
E
F
G
H

: A
) ( . ),Explore (A
A B ) ,Explore (B :
H
0

G
0

F
0

E
0

D
0

C
0

B
0

A
1
1

Visited
pre
post
Prev NIL A NIL NIL NIL NIL NIL NIL
B E ) ,Explore (E :
H

Visited 1
1
0
0
0
0
0
0
pre
1
2
post
Prev NIL A NIL NIL B NIL NIL NIL
110

7.3 :DFS

7 :

E F, G, H ) ,Explore (F :
G

Visited 1
1
0
0
1 0
0
0
pre
1
2
3
post
Prev NIL A NIL NIL B E NIL NIL
F G ) ,Explore (G :
H
0

NIL

Visited 1
1
0
0
1 1 0
pre
1
2
3 4
post
Prev NIL A NIL NIL B E F

G , Post F
Post E ,H ) Explore(H :
G H
0

Visited 1
1 0
0
1 1 1
pre
1
2
3 4 5
post
7 6
Prev NIL A A NIL B E F

H G , H E ,
E B , B A C
) ,Explore(C :
G H
1
8
9
E

Visited 1
1 0
0
1 1 1
pre
1
2
3 4 5
post
11
10 7 6
Prev NIL A A NIL B E F

C D ) Explore (D :
G H
1
8
9
E

Visited 1
1 1 0 1 1 1
pre
1
2 12
3 4 5
post
11
10 7 6
Prev NIL A A C B E F

D A, H ,C A
.DFS :
G H
1
8
9
E

Visited 1
1 1 1 1 1 1
pre
1
2 12 13 3 4 5
post
16 11 15 14 10 7 6
Prev NIL A A C B E F

111

7.3 :DFS

7 :

" :
)(A

)(B

)(E

)(C

)(D

) (F

)(G

)(H

:
(A, B) , (A, C) , (C, D) , (B, E) , (E, H) , (E, F ) , (F, G) .1 .
(D, H) , (H, G) .2 .
(D, A) , (F, B) .3 .
(A, F ) , (E, G) .4 .
:

)(C

)(D

) (H

)(B) (A

) (E) (F

)(G

DFS Post .A A D
C A . DFS
Post B ) ,Explore (B :
H

Visited 1
0
1 0
0
0
0
0
pre
1
2 3
post
6
5 4
Prev NIL NIL D A NIL NIL NIL NIL
B ,A, F A F A, E A
.E E B .B E F
B B ,H :
H

Visited 1
0
1 0 0 0
0
0
pre
1
7
2 3 9 8
post
6
12
5 4 10 11
Prev NIL NIL D A F B NIL NIL
H D . H F E, A
G E, F ." :
H

Visited 1
0
1 0 0 0
0
0
pre
1
7
2 3 9 8
15
13
post
6
12
5 4 10 11 16
14
Prev NIL NIL D A F B NIL NIL
112

7.3 :DFS

7 :

:
)(B) (G) (H

) (F
,
,
)(E

)(A

)(D

,
)(C

, Gs:
] [B, F, E

][G

][A, D, C

][H

7.3.4 ) :(12



7.52 ) G = (V, E G = V, E :

.1 G .G

.2 G .G

E E .3 .
):G = (V, E
:
.1 .
.2 .
:
.

} {v1 , ..., vn v1 v2 ... vn v1
) (vi , vi+1 vi .vi+1
Gs

C C u C v C ) (u, v ,
Gs
) Gs
( .
, ):G = (V, E
.1 SCC Gs )|.O (|V | + |E


.2 G = V , E V = V )| .O (|V
113

7.4

7 :

.3 = E ).O (1
.4 :

} Ci = {v1 , ..., vki E ) (v1 , v2 ) , (v2 , v3 ) , ... (vki 1 , vki ) , (vki , v1

. )| O (|Ci
G X
)| .O (|V
. | |Ci | = |V

.5 Gs .E Gs
) Gs (

G G
.Gs = Gs )| O (|E Gs | |E.


.6 G = V , E .

" )|.O (|V | + |E

7.53

\ )

(.

7.4 :
7.54 : ) G = (V, E V
vj (vj , vk ) E vk.
7.55 ) G = (V, E v V:
.1 ) v .((v, ) E
.2 ) v .((, v) E
7.56 :
) G = (V, E .
: } V = {v1 , ..., vn" ) v1 v2 ... vn
( , v1 vn . v1 1 < k n
(vk , v1 ) E vk v1 . vn
1 k < n (vn , vk ) E vn vk .
7.57 : ) G = (V, E {v0 , ..., vk } V
0 i < k (vi , vi+1 ) E .(vk , v0 ) E
7.58 :
) G = (V, E .G
: v0 v1 ... vk v0 .G
v1 v0 (v0 , v1 ) E " v2 v1 v0
v1 , ..., vk .v0 (vk , v0 ) E v0
.vk vk v0 v0 vk .

114

7.4

7 :

7.59 :
) (DAG .
: :

)Topologi alSort(G
Perform DFS(G) and ompute post (v) for ea h v V.
Number the verti es by order of post values returned.

)| O (|V | + |E .DFS
7.60

) G = (V, E DAG ) DFS ( G


Post .G : (u, v) E )) Post (v) < Post (u
( . DFS u ,v :
)< Pre (v) < Post (v) < Post (u

)Pre (u

(u, v) E ) Explore (v ) Postvisit (v u


) .Postvisit (u DFS v u :
)< Pre (u) < Post (u) < Post (v

)Pre (v

)< Post (v) < Pre (u) < Post (u

)Pre (v

) Explore (u v v
.u " ) G ) ((u, v .
) ,Post (v) < Post (u.
DFS G Post .

7.61 post

.
.
7.62
. 7.38 " DFS Ba kward-Edge
DFS .
:

)Topologi alSort(G
Perform DFS(G) and ompute post (v) for ea h v V.
if there is a ba kward-edge in G:

"return "No topologi al sort exists


else:
Number the verti es by order of post values returned.
115

7.4

7 :

7.4.1 ) :(12
) G = ({v1 , ..., vn } , E 1 n Sn .
)) v(1) v(2) ... v(n ( .
:

IsTopologi al(G, ):
Init A as Array of size n.
for i = 1, ..., n:
)A [i] = (i


for all v(i) , v(j) E :


if A [i] > A [j]:
return false
return true.
: A
.u v
(u, v) E

.False v(i) , v(j) E )v(i) v(j
) ) (i) < (j ( ) , (i) = A [i] > A [j] = (j
.False

v(i) , v(j) E ) v(j) v(i )) (j) < (i ( .
] A [i] = (i) > (j) = A [j .False
True False ,.
: :
.1 )| O (|V .
.2 )| O (|E
.
" )|.O (|V |) + O (|E|) = O (|V | + |E
7.63 ) (:
| S|V ) G = (V, E
|) |E )|.( (|E
: " A ) G = (V, E | S|V
T
)| . (|E A )| , T (|E )|/ (|E
c = 1 n0 N .T (n0 ) < n0 ) G = (V, E .|E| = n0
.
" ,

| T (n0 ) < |E A v(i) , v(j) E A
) ) (i) < (j ( .:
 


)E = E\ v(i) , v(j) v(j) , v(i






G = V, E V . ) v(j) , v(i A

A ,G
) (i) < (j .
116

7.4

7 :



7.64 A ) v(j) , v(i "" ). v(i) , v(j

7.4.2

) :(12

)) T = (V, E (
. T )| .O (|V
":

CountTopoSorts(v):
if v.size == 1
return 1
//denote the hildren of v as Child (v) = {u1 , ..., uk }//

for all ui Child (v): // 1 i k

) ui .sort=CountTopoSorts(ui

X
Y
ui .size; u1 .size, ..., uk .size
Count =
ui .sort multi
1ik

1ik

return Count.

multi ) Multinomial Coe ient( .


:
"" )) O (1
) O (1 ( )| .O (|V
: :
: 1 .1
: n .n + 1
: v n + 1 n
. v
} k 1) {u1 , ..., uk( .#u1 , ..., #uk
ui
. u1 , ..., uk
k | |u1 | , ..., |uk
k
X
| |ui
. v
i=1


v . Y

ui .sort
1ik


,.

117

7.4

7 :

7.65


O |V |2 :

SubtreeSize(v) :

ount=0
if v .left = NULL and v.right = NULL:
return 1
else:
) ount=1+Subtreesize(v.left)+Subtreesize(v.right

Subtreesize )| O (|V | |V )
( )) O (1
| |V
( . 

Subtreesize

| .O |V

| |V
,
)| ) O (|V (.
) :(12

7.4.3

7.66 :DAG ) G = (V, E ,


.

7.67 DAG

) G = (V, E :
.1 v1 v2 ... vn v1 v2 ... vn .G
.2 G v1 v2 ... vn v1 v2 ... vn .
:
.1 1 i n 1 .(vi , vi+1 ) E
(vi+j , vi ) E ,j > 1 vi vi+1 ... vi+j vi
G . vi vj
) (vj , vi v1 v2 ... vn , .

.v1 v2 ... vn k < n vk 6= vk

j > k .vj = vk vk+1 , vk+2 , ..., vn

vj (vk+i , vk+i+1 ) E 0 i n k:

vj = vk vk+1 vk+2 ... vk+(nk) = vn


" j + (n k) = n + (j k) > n .
.2 G , v1 v2 ... vn v1 v2 ... vn .
) (vk , vk+1 v1 v2 ... vk+1 vk ... vn
k / E
, (vl , vm ) E :
l, m < k " .l, m > k + 1

) ,(vk , vk+1 m < k


l = k m = k + 1 / E
. m > k + 1 .
118

7.5

7 :

:BFS

) ,(vk , vk+1 l > k + 1


m = k + 1 l = k / E
. l < k .
m = k l > m .
l = k + 1 m < k + 1 .
.
. k" k (vk , vk+1 ) E
v1 v2 ... vn ,.

7.68
DAG
" (vk , vk+1 ) E k
" .

7.4.4

DAG

) :(12

s, t DAG

):G = (V, E

s s t x t
x .s x" t x t
. DAG
u v u v . :
.1 .
.2 | |V .
.3
) t t .(1
.
.
.4 .s
) t
(s )| O (|V | + |E ,
)| O (|V )| O (|E )
( " )|.O (|V | + |E

7.5

BFS

) G = (V, E s) s V (sour e BFS ""


) s s ( . BFS
w s ) (
s w s ) w (.
Breadth-First-Tree s
) ( s .
.

119

7.5 :BFS

7 :

7.69 Breadth-First
. DFS
.

BFS(G,s):
v V do :

dist (v)

prev (v) NIL

dist (s) 0
=Q

)Enqueue (Q, s
while Q 6= :

)u Dequeue (Q

w s.t (u, w) E do:

if dist (w) = :

dist (w) dist (u) + 1

prev (w) u
)Enqeue(Q, w

7.70 ) G = (V, E u V BFS v (u, v) E


).u = prev (v
:
s , 0 .
s " .

s E ) (s, w = )) dist (w
(w 6= s w , ) prev (w s .dist (w) = dist (s) + 1 = 1

, w ) (
)
= .(dist w ,
w .2
s
) (.
7.71 BFS
. DFS
)
(.
:
120

7.5 :BFS

7 :

7.72 ) G = (V, E :
.1 s, v V ) distan e (s, v s v .

.2 v V CCv v .{v} CCv V

7.73 BFS

) G = (V, E ) ( s V
)= distan e (s, v

)BFS (G, s

v V:

)dist (v

7.74 BFS .s

: :
7.75
) G = (V, E .s V ) BFS (G, s (1 j |V |) dist (vj ) = dj
) j .(d0 = dist (s) = 0
| 0 k |CCs :

.1 : 0 j < k .distan e (s, vj ) = dj dk


:

distan e=dj

.2 : } Q = {vk , ... vk
dist = dk w Q dist (w) = dk dist (w) = dk + 1
dist = dk . , w Q ).distan e (s, w) = dist (w
.3 : w V
= ) dist (w . distan e (s, w) dk + 1
7.76 | k |CCs s
) BF S (G, s .
: ,k k = 0 :
.1 .
.2 k = 0 } {s ). .d0 = dist (s) = 0 = distan e (s, s

.3 s dist .
:k = 1
.1 v0 = s s v1
.d1 = 1 s ,distan e (s, s) = d0 = 0 1 = d1.
.2 ) (0 s :
=1

{|}z
)dist (w) = d1 = distan e (s, w
121

7.5 :BFS

7 :

.3 dist = .dist
s distan e (s, w) 2 = d1 + 1
k vk+1 ) k + 1 vk (:
.1 v0 , ..., vk1 1 ,distan e (s, vj ) = dj dk
.dk dk+1 vk+1 , vk , vk+1
,dk = dk+1 vk+1 vk
vk .dk+1 = dk + 1 2
vk k distan e (s, vk ) = vk ":
0 j k : distan e (s, vj ) = dj dk+1
.2 } Q = {vk+1 , ... :
w Q k 2
} .dist (w) {dk , dk + 1 vk+1
vk+1 } dk+1 {dk , dk + 1
. "
).distan e (s, w) = dist (w
w Q vk
k 3 .distan e (s, w) dk + 1
" vk .dist (w) = dk + 1 distan e(w) dk+1
dk +1 )) distan e (s, w( = distan e (s, w) = dk +1
) .dist (w } dist (w) {dk+1 , dk+1 + 1
} | {z
=dk +1

}.dk+1 {dk , dk + 1

.3 = dist
.distan edk+1 + 1 3
w .distan e (w) dk + 1
w" distan e (s, w) = dk + 1 dk+1 = dk + 1
:

)distan e (s, w) = dk + 1 = dk+1 = dk+1 + 1 > distan e (s, w


, dk+1 = dk + 1 distan e (s, w) = dk
distan e=dk + 1 . k
.

: s
) s ) dist = = distan e (s, w
"(.

: DFS BFS
. \ "
)| .O (|V | + |E

.
.
122

7.6 :

7.6

7.6.1

:Dijkstra

7 :

7.77 : ) G = (V, E, w (u, v) E w (u, v) > 0


w : E R+ .
7.78 .

. Dijkstra BFS
s
.

Dijkstra(G,s):
u V do:

dist (u)

prev (u) = NIL

dist (s) 0

Q BuildMinHeap (V )// ordered by dist values

While not empty(Q) do:

)v Extra tMin (Q

u V s.t (v, u) E do:

if dist (u) > dist (v) + w (v, u) then:


)dist (u) dist (v) + w (v, u
prev (u) v

))De reaseKey (Q, u, dist (u


:
.1 s 6= u V = ) dist (u .prev (u) = NIL
) dist (s 0 .
.2 V dist s
.
.3 .

.4 ) (s u V s > )dist (u
) , dist (s) + w (v, u " .
.5 s dist ) ,dist (u) = dist (s) + l (v, u) = l (v, u
) dist (u) = distan e (s, u u" . s s
s dist.
.6 s )
(.

123

7.6 :

7 :

.7 dist ) + dist (u
. ,s s
.s
.8 ) dist (u) > dist (v) + w (v, u
s
.
7.79 :
u V ).dist (u) distan e (s, u
: u ) dist (u) < distan e (s, u .
= ) dist (u ) dist (u .u
} {s, ..., u ,u" u
) dist < distan e t t( .
) .dist (t) distan e (s, t t w ,
:

)dist (t) = dist (w) + w (w, t) distan e (s, t) + w (t, u) = distan e (s, u
) .dist (u) < distan e (s, u u" .
:Dijkstra

7.80 Dijkstra

)) G = (V, E, w ( Dijkstra
} R = {v1 , ..., vk , :

.1 v R ).dist (v) = distan e (s, v


R .2 k .s v R u V \R
).distan e (s, u
.3 u V \R })= min {distan e (s, t

.

distan e

tV \R

)distan e (s, u

)distan e (s, v

)distan e (s, u

= ).dist (u
dist

: ,k :k = 1
.1 k = 1 ,s } R = {s .
.2 k = 1 ,s } R = {s .
.3 1 s )
s "( . s ,s
.dist = distan e
k :k + 1
.1 1 k R .
k + 1
3 .

124

7 :

7.6 :

.2 2 k R k . s
k + 1 dist dist
3 dist=distan e s .
.3 v V \R .s .t R
t v:

)dist (v) = dist (t) + w (v, t


1 t ) dist (v = )dist (t
) distan e (s, t:
)dist (v) = distan e (s, t) + w (v, t) = distan e (s, v
v ,.

7.81 :
.1 3
dist.
.2 .

.1" t V \R distan e 3 = )dist (t


) .distan e (s, t " u V \R :
)dist (t) = distan e (s, t) < distan e (s, u) dist (u
}

{z

minimal

) .dist (u) > dist (t dist


) t distan e( . distan e
3 .dist = distan e
.2 1 .

: :
.1 V )| O (|V.
.2 | |V )| O (|V.
.3 | |V | |E
De reaseKey " )| (|E| + |V |) log (|V " "
))| .O ((|V | + |E|) log (|V
" ))| .O ((|V | + |E|) log (|V
125

7.6 :

7 :

7.82 '
))) O (log (n (Union Find .De reaseKey
))| O (|V | log (|V |) + |E| log (|V
.
)(:
7.83 , :

)(u
2
)(v

)(s
1
)(w

.s dist (s, u) = dist (s, v) = 2 .dist (s, w) = 1


w w . v
) ( )dist (s, v)+w (v, w) = 2 > 1 = dist (s, w
.dist u ) dist (s, v:

dist (s, v) = dist (s, u) + w (u, v) = 0 < 2


. dist (s, w) = 1
s u v w 0 .
7.6.2

Bellman-Ford

) (:

Dijkstra
.
"
.
Bellman-Ford
) ( .
. "" s
.
s }{ di V R = ) d0 (u u 6= s
.d0 (s) = 0 :1 i |V | 1
}di = min {di1 (v) , di1 (u) + w (u, v) | (u, v) E
) (13 u V ) di (u
s u i .
s .

BellmanFord(G, w, s):
u V d0 (u)

d0 (s) 0

for i = 1, ..., |V | 1 :
for v V do:

}di (v) = min {di1 (v) , di1 (u) + w (u, v) | (u, v) E


126

Find

:Union

|V | 1
dist .
: 13 .
: )| O (|V u V
P
for ) deg (v . = )vV deg (v
| .2 |E for |V | 1 :
)|O (|V |) + (|V | 1) 2 |E| = O (|V | |E

Find

:Union

, ) (ADT:
:Makeset (x) .1 .x
:Find (x) .2 .x
Union (x, y) .3 )( .x, y
) (
) ( .
. x ) (x .
:

Makeset(x):
(x) x

rank (x) 0
"" x x x
,0 ) O (1.
:

Find(x) :
while x 6= (x):
)x (x

return x


) ) .(x = (x
)) O ( (x ) O (n n
) ,O (log n
.

127

Find

:Union

Union(x, y) :
)rx Find (x

)ry Find (y

if rx = ry then return

if rank (rx ) > rank (ry ) then:


(ry ) rx

else:

(rx ) ry

if rank (rx ) = rank (ry ) then:


rank (ry ) rank (ry ) + 1
,

.

8.1 Union Find

Union Find

U .

: .U
: |U | = 0 |U | = 1 .
: U n U n .
n n .
Union )( Union )(
,.

8.2 Union Find

.1 x ) x 6= (x )).rank (x) < rank ( (x


.2 k 2k .
.3 n

n
2k

.k

:
.1 rank ( (x)) rank (x) + 1 x".

.2 , rank (x) = 0" . n


.n + 1 . n + 1
n .2n + 2n = 2n+1
128

Find

:Union

.3 k 2k .
k ) ( , m k m2k n
.m 2nk

8.3

Find

Union

n ).O (log n

: n log2 n
k > log2 n 2nk < nn = 1 . log2 n
Find n ) O (log n
. Union Find
Union ).O (log n
8.4 N ) O (log N
.log2 N
Find
)( ,
path- ompression :

Find(x):
if x 6= (x) then:

)) (x) Find ( (x

return x

8.5 ) x = log (n log .1


8.6 log2 (1000) = 4:
log2 (1000) 9.9 = log2 log2 (1024) 3.3

= log2 log2 log2 (1024) 1.7 = log2 log2 log2 log2 (10234) < 1

Find
. " " .
n  0 .log2 n

k + 1, ..., 2k k ,2:
  1





2 , 3, 4 = 22 , 5, 16 = 24 , 17, ..., 216 , ..., k + 1, ...., 2k
k ) k < log2 n 2k ( . :
.

..

.22




i i k + 1, ..., 2k log2 i < k + 1 ). log2 (n
129

Find

:Union

8.7
n m
)).O ((m + n) log (n

Find


8.8 ) log (n ) (log2 21000 = 5
) O (m + n m Find ).O (m log n
: , ""
"" . ""
.(n  "" ,
))log (n

k + 1, ..., 2k " 2k" . k , 2nk

X
n
n
.n
2j = 2k
j=k+1

) log2 (n ).n log2 (n

Find .
," :
.1 ) (x .x ) log2 (n
) ( )) .O (log2 (n m
)).O (m log2 (n
.2 ) (x ,x .1
 1 )

x
( . rank (x) k + 1, ..., 2k 2k
"
" . ) 2k ) n log2 (n"( "
)) O ((m + n) log (n .

130

9 :
9.1

 9.1 ) (ST : ) G = (V, E




T = V, E E E



9.2 ) :(MST ) G = (V, E, w G = V, E





X

E E )w (e
= .w G T = V, E G
eE
:
n 
o

w (T ) = min w T | T is a spanning tree of G


9.3 : ) (
G G .
. ,
E ,
.
) w (T .
9.4 ) G = (V, E " .|E| = |V | 1

9.2

MST

) G = (V, E, w )) T = (V, A, w
= (A T MST A " "
. A :
A .MST
) (u, v A ,
}) A {(u, v .
" .A :

Generi -MST(G):
=A

while A does not form a spanning Tree do:


nd an edge (u, v)that is safe for A
}A = A {u, v

return A

131

9.2 :MST

A 2 4
. A
.
.3
A MST
A .
.
9.5
" .MST
9.6 : ) G = (V, E V ) (S, V \S
, S .V \S
9.7 ) G = (V, E, w ) (S, V \S :
.1 A E A .
.2 .

.
9.8 :
) G = (V, E, w X E

T = V, E G

.X E ) (S, V \S X . e

} X {e T ) .(T
e
: , e T . , / T
} T {e . )) e = (u, v u, v

u v " e .e
(

n T o


}\ {e
E = E e ,T = V, E G |V | 1
| |V . , :


)w (x) + w e = w (T ) + w e w (e

}xE\{e

= )w (x

xE

w T


e w (e) w e < )w (e



w e ) w T < w (T .T w (e) = w e = ) w (T


w T T .
Generi MST ).G = (V, E, w
A A
. ) GA = (V, A, w
) A
| |V ( . ) (u, v A GA
}) A {(u, v .

While 4 2 |V | 1 |V | 1
. = A | |V ,GA
" 1 .
:
132

9.3

Kruskal

:MST

9.9 :
) G = (V, E, w . A E MST
G ) C = (VC , EC ) .GA = (V, A ) (u, v C
GA ) (u, v .A

9.10 C GA .
: ) .(VC , V \VC ,GA " A VC )(u, v
" }) A {(u, v MST G
,A.
.
. Kruskal A
A
. Prim A
A .

9.11 MST

MST

 MST .T 6= T
 :


) T T \ T T ( ,

.e " e T ,T
 . f 6= e
T e T T



} T {e .T w T = w (T ) + w (e) w (f ) < W T ) w (e) < w (f

e .T MST ,.

9.3

Kruskal MST

Kruskal
) (u, v . C1 C2 ) .(u, v )(u, v
C1 9.9 .C1
Union-Find )
GA ( .
) Find (u u
u, v ) .Find (v) = Find (u
:Union

)Kruskal-MST(G
A

v V do:

)Makeset (v

sort the edges of E in nonde reasing order by weight w.


(v, u) E do:

133

9.3

Kruskal

:MST

if Find (v) 6= Find (u) then:


})A A {(v, u

)Union (u, v
return A

: .9.9 :
1 3 A .
5 8 ) (u, v u, v
, )) (Find (v) = Find (u
, ) Find (v) 6= Find (u
9.9 .A
u, v ).Union (u, v
A
MST G ) Find (v) 6= Find (u
A MST .G
: :
.1 )| O (|V A ).O (1
.2 ))|.O (|E| log (|E
.3 | |E Find, Union
)| O (log |V " )| .O (|E| log |V
" ))| O (|E| log (|E )| |V | O (|E .

9.12 :

) G = (V, E )||V | O (|E


: ,|V | = n 7.14 n k
.n k n 1 |E| : )| n O (|E.
9.13 Find Path-Compression
.
9.14 :
)(a
1


)(d

)(b
4
3

1
)(c

)(e
2

5 } {a} , {b} , {c} , {d} , {e :


)(a, b) , (b, c) , (a, d) , (e, c) , (e, d) , (d, b
:
134

9.4

Prim

:MST

...

9.4

Prim MST

Prim
, G s:

Prim(G,s):
u V do:

key (u)
(u) NIL

key (s) 0

BuildMinHeap(V ) // ordered by key values.

while Q is not empty do:


)u Extra tMin (Q
(u, v) E do:

if v Q and w (u, v) < key (v):


(v) u

De reaseKey(v, w (u, v)).


}return E = {( (v) , v) | v V s.t (v) 6= NIL

9.15 .MST
MST ,
.



: T = V, E .G
:
9.16

while

MST

G :

}E = {( (v) , v) | v V \Q s.t (v) 6= NIL


.

135

9.4

Prim

:MST

:
)| O (|V
)| .O (|V

Extra tMin while )| O (log |V | |V .

v V while for )deg (v


) (v De reaseKey for
)| O (deg (v) log |V .
P
| vV deg (v) 2 |E " )| O (2 |E| log |V for
.
" )| .O (|V | log |V |) + O (|E| log |V |) = O ((|V | + |E|) log |V
9.17 ' De reaseKey
)| O (|V | log |V " Prim )| O (|V | log |V | + |E| log |V
)|.O (|V | log |V | + |E
9.18 )(:

136

10:

10
10.1


.
".
10.1.1

Sort

:Counting

" A n } ,{1, ..., k :

CountingSort(A):
Initialize an array C with k slots
for i = 1, ..., k do
C [i] 0

for i = 1, ..., n do
]]In rement C [A [i
for i = 2, ..., k do
]C [i] C [i] + C [i 1

for i = n, ..., 1 do

]B [C [A [i]]] A [i

]]De rement C [A [i

:
.1 .C
.2 A.
.3 A } .i {1, ..., k ]C [i
A i .1, ...k
.4 ] A [i B ]] C [A [i
B " ]] C [A [i
A ] .A [i ]] C [A [i
A .B
: } i {1, ..., k ni i ,A :
} i {1, ..., k .C [i] = ni
} i {1, ..., k:
X
X
= ]C [i
= ]C [j
nj
ji

ji

A .i
137

10:

10.1 :

} C [i] ,i {1, ..., k i .B


10.1
] C [i] ni , ..., C [i B .i
: ] C [i i .B
] C [i ni ) A (i
B .i
10.2
1 n C [i]
] ni , ..., C [i .i
10.3
B .
: } j {1, ..., n ] .B [j] B [j + 1 j "

] B [j
B [j] = i ) B [j + 1] = i h i .(i < i
h i
] C [i] ni , ..., C [i B ] B [j + 1 .C i ni , ..., C i
h i
h i
j + 1 = C i ni ] j = C [i ] C [i i C i ni

i . i < i C :
h i
X
X
< nj
nj = C [i] = j
= j + 1 = C i ni
ji

j<i

] B [j + 1] B [j ,j.
: )
( . n k
) .O (k) + O (n) = O (n + k ) k O (n ).O (n
10.4 CountingSort , i < j
A ] A [i] = A [j r, s ] A [i ] A [j
.r < s .
10.5 CountingSort :
A n } {1, ..., k "
A ] [a, b ) .O (1 ).O (n + k

: C k CountinSort
i A ] .A [i
C A
) .O (n + k ] [a, b :
.1 b < k b .b = k
.2 a < 1 a .a = 1
.3 b < a ] [a, b .0

138

10:

10.1 :

.4 ] C [b] C [a ] A [i ][a , b
] [a, b a, b ) [a, a
].(b, b
4
) ,O (1.
10.1.2

Sort

:Radix

" A k .
)Least Signi at
(Digit=LSD .CountingSort :

RadixSort(A,k):
for i = k, ..., 1 do // i is the number of the digit when k is the LSD
A CountingSort (A) // sorting on the i'th digit
10.6 .
ao
a
`
] A = [21, 22
A . CountingSort ] C = [0, 2
CountingSort 21 ] A [1 ] B [2 22
] A [2 ] B [2 ].B = [22, 21

] A = [150, 2, 77, 552, 17, 15 ] [150, 002, 077, 552, 017, 015:
.[150, 002, 552, 015, 077, 017] :
].[002, 015, 017, 150, 552, 077
].[002, 015, 017, 077, 150, 552
: } i {1, ..., n ] .A [i] A [i + 1

i ] A [i] > A [i + 1 A [i] = d1 ...dk k) A [i + 1] = d1 ....dk ( .


1 j k

, dj 6= dj 1 i < j .di = di ] A [i] > A [i + 1

.dj > dj j ,RadixSort j


] B [i + 1 ] .B [i
CountingSort ] B [i + 1 ] B [i ] B [i + 1
] B [i .
: n k 10 k
CountingSort n } {1, ..., 10 k ) O (n + 10 "
) .O (k (n + 10)) = O (nk )) k O (n
( ).O (n
10.1.3

Sort

:Insertion

InsertionSort A n :

InsertionSort(A):
139

10.1

10:

for i = 2, ..., n
for j = idownto 2
if A [j] < A [j 1]do

]swap A [j]with A [j 1

) ( :
, j
] A [j .
] A [j
. 1 j n
j ] A [1, ..., j.
: ,
X . j j "

n

)j = n(n+1
.O n2
2
j=1

10.1.4 :Bu ketSort

" A ] [a, b . :
.1 " "bu kets .
.2 A .Bu kets
.3 Bu ket .
.4 .
, ba .
n

Bu ketSort(A):
Initialize an array C of size n = |A| where ea h slot ontains a list
for i = 1, ..., n do

n
] A [i
Insert A [i] to the list in C ba

for i = 1, ..., n do

Sort the list C [i] using insertion sort.


Conatenate the lists C [1] , ...., [Cn] into an array B and return B .
: } i {1, ..., n ] .B [i] B [i + 1 :
n
n
ba Bu ket InsertionSort
B [i] = ba
.1 ] B [i + 1

].B [i] B [i + 1

n
n
ba B [i] L ]B [i + 1
B [i] < ba
.2 "] B [i + 1

L .C L L L L
].B [i] < B [i + 1

140

10:

10.1 :

:
n
) + O (n  InsertionSort

O n2 ) O (n . " .O n2
A ]) [a, b ][c, d] [a, b
( dc :
ba

n
X
E [number of values in the i'th bu ket] = E
1{A[j] is in the i'th bu ket}
j=1

n
n
h
i X
z}|{ X 1
=1
= }E 1{A[j] is in the i'th bu ket
= ]P [A [j] is in the i'th bu ket
n
i=1

i=1

] [a, b n
1
n

ba
n

ba

ba
n

n
X
j=1

= ]P [A [j] is in the i'th ell

.1 :
.1 ) O (n n .

.2 n InsertionSort 1 ).n O (1) = O (n


.3 n ).O (n
" ) ( ).O (n
10.1.5 :Sele tionSort
Sele tionSort :n

)]Sele tionSort(A [1, ..., n


for i = 1, ..., n 1:
min i

for j = i + 1, ..., n:
if A [j] < A [min]:
min j

: Sele tionSort .A
10.7
i

Sele tionSort

]Swap A [i] A [min

].A [i, ..., n

: .
i j ] A [min ].A [i, ..., j 1
:
: j = i + 1 = ]A [i, ...., j 1
] ,A [i i = min ] A [min )( ].A [i, ..., j 1

: j min ].A [i, ..., j 1


j :
141

10:

10.1 :

.1 ] A [j] A [min min


].A [i, ..., j

.2 ] A [j] < A [min .min = j


min ] A [i, ..., j 1 ] A [j] < A [min"
] A [j ] A [i, ..., j 1 min=j
min ].A [i, ..., j
.

" 1 i n 1 i
] A [i ] .A [i, ...., n ] A [1
A [2] , ] A [2, ..., n . 1 i n 1
j i ] A [i] A [j .
: n 1
) n (i + 1 ,
:
)n (n 1
2

i = (n 1)2

n1
X
i=1

(n 1)

n1
X
i=1

= ])[n (i + 1

n1
X
i=1


)(n 1) (n 2
1 2
](n 1) [2 (n 1) n
n 3n + 2
=
=
=
2
2
2

2
2


" n .O n 
2
2
n " . n
10.1.6

] A [1, ..., n k ,A
" ) .O (n
) .O (log n :

BinarySear h(A [l, r]):




= k return k .
if A lr+1
2

" = 0 return "value not found


if lr+1
2

else:

< k do:
if A lr+1
2


) 1
BinarySear h(A l, lr+1
2


else:

) + 1, r
BinarySear h(A lr+1
2

) lr+1 "" (
2
lr+1
k . 2 = 0
1 k .

lr+1 ,k k
2
142

10.2 :

10:

. "
.
: log2 n 1
) .O (log n " k
) (log n .
10.8 ) (log n
".

10.2

)( ) " } ({0, 1

.
10.9 ) :(Prex Code "
.
10.10 .
:
.
."
"
" .
10.11 :
T T .
: 1 ...n a1 ...am ,b1 ...bk i
ai 6= bi j ) a1 ...ai1 (1 ...j ai
j+1 ...j+l(ai )1 bi j+1 ...j+l(bi )1
.
10.12 T" :
.1 ] f : [0, 1 " .
.2 l : N " )
( .
10.13 T" f l T:
X
= ) $ (T
)l () f (

: "
) ( .

143

10:

10.2 :


. C " :

Human(C):
|n |C

Q BuildMinHeap (C)// built a ording to frequen ies of letters

for i = 1, ..., n 1:

allo ate a new node z

)z.left Extra tMin (Q

)z.right Extra tMin (Q

z.key z.left.key + z .right.key

)InsertKey(Q, z

)retrun Extra tMin(Q


: " )
( .
: :
). (n

2 Extra tMin InsertKey ). (log n


n 1 " ). (n log n
.
" ). (n log n

: T " , T
 
) .$ T < $ (T :
10.14 :

T " a, b ).f (a) < f (b) l (a) l (b


: a, b ) f (a) < f (b ) l (a) < l (b .T

T T ,a, b l T

) l (a) = l (b ) l (b) = l (a 6= a, b ) .l () = l ( :

)=l(
|}
{
z

X

l () f () + l (b) f (b) + l (a) f (a)


$ (T ) $ T =
l () f () + l (b) f (b) + l (a) f (a)

6=a,b

6=a,b

h
i

])= [l (b) f (b) + l (a) f (a)] l (a) f (b) + l (a) f (a) = [l (b) f (b) + l (a) f (a)] [l (a) f (b) + l (b) f (a
))= f (a) [l (a) l (b)] + f (b) [l (b) l (a)] = (f (b) f (a)) (l (b) l (a

) f (a) < f (b ) l (a) < l (b



) $ T < $ (T T .
144

10.2 :

10:

10.15 :
T ) ( T .
: T .
" 1
.
. ) (
.
10.16 :
" || > 1 T .
: T
) ( .
.

.
.
10.17 :
T " || > 2 x, y .

} T \ {x, y} {z z x, y) . f (z) = f (x) + f (y


 T

)+ f (z

.$ (T ) = $ T

: z () l (z) = l (x) 1 :

X
X
= $ T
= )l () f () + l (z) f (z
))l () f () + (l (x) 1) (f (x) + f (y
6=x,y

6=x,y

)=f (z

|}
{
z
))l () f () + l (x) f (x) + l (x) f (y) (f (x) + f (y

6=x,y

x, y ) l (x) = l (y :

X
= $ T
)l () f () + l (x) f (x) + l (y) f (y) f (z) = $ (T ) f (z
6=x,y

:
10.18
" T T.
: | .| || = 2
.1 || < n .n T
W ) .$ (W ) < $ (T "
x, y W" T .

" } = \ {x, y} {z ) .f (z) = f (x) + f (y W, T

145

10:

10.2 :

} T = T \ {x, y} {z } .W = W \ {x, y} {z T

:


$ W = $ (W ) f (z) < $ (T ) f (z) = $ T

T " n .
T ,.

10.19
T " .f () > 0.4 " .
: .
" )
( ) (
."
:

hara ter with heighest likelihood

Tree that ontains all other hara ters

Tree that ontains all other hara ters

hara ter with heighest likelihood


) ( .
.
10.20
.
0.4
. x ) fx = 25 +
0 < < 0.6(
) y, z ( fy , fz " fz > fx
.fz > fy
10.21 " fz > fx fz > fy " (fz > fx
2
5

1 fy + fz 35 +


1
2
3
+ = 2
fy <
5
5
5

= fz > fx :

fx fz
. ) fw , fv"
(fw fv .fw + fv = fz fz > 52 + fw fw fw f2z = 51 + 2
.fw > fy = 15 2 fy
.fy fw
fz " . fz
,.

146

10.2 :

10.2.1

10:

: " } {a, b, c, d, e, f, g, h, i }.{1, 2, 3, 5, 8, 13, 21, 35, 40


, :

h:35

i:40

f:13

g:21

d:5

e:8

:3

b:2

a:1

:i = 1 z
z.left = a ) extra t (
.z.right = b ) (key z , .z.key = 3
) z (z , :

h:35

i:40

f:13

g:21

d:5

e:8

:3

T (z1 ):3

:
z1 : 3

a:1

b:2

:i = 2 ,z2 ) T (z1 c : 3
. 6 z2 ) T (z2 :

i:40

g:21

h:35

f:13

e:8

T (z2 ) : 6

d:5

) T (z2 :
z2 : 6
c:3

b:2

z1 : 3

a:1

:i = 3 ,z3 ,d : 5 ) T (z2
.11 z3 ) T (z3 :

i:40

h:35

g:21

f:13

) T (z3 :

147

T (z3 ) : 11

e:8

10.2 :

10:

z3 : 11

T (z2 ) : 6

d:5

:i = 4 ,z4 ,e : 8 ) T (z3 .19


) T (z4 :

i:40

g:21

h:35

T (z4 ) : 19

f:13

) T (Z4 :
z4 : 19

T (z3 ) : 11

e:8

:i = 5 ,z5 ,f : 13 ) T (z4 .32


) T (z5 :

h:35

i:40

g:21

T (z5 ) : 32

) T (Z5 :
z5 : 32
) T (z4

f : 13

:i = 6 ,z6 ,g : 21 T (z5 ) : 32 .53


) T (z6 :

i:40

T (z6 ) : 53

h:35

) T (z6 :
z6 : 53
T (z5 ) : 32

g : 21

:i = 7 ,z7 ,h : 35 i : 40 .75
) T (z7 :

T (z7 ) : 75

148

T (z6 ) : 53

10:

10.2 :

) T (z7 :
z7 : 75

i : 40

h : 35

:i = 8 z8 ,T (z6 ) : 53 T (z7 ) : 75 ,128


) T (z8 :
z8 : 128

T (z7 ) : 75

T (z6 ) : 53

z7 : 75

i : 40

z8 : 128

h : 35

z5 : 32

z4 : 19

z3 : 11

z2 : 6

c:3

z6 : 53

g : 21

f : 13

e:8

d:5

z1 : 3

a:1

b:2

. ,
:

40
128

35
128

21
128

13
128

8
128

5
128

3
128

2
128

1
128

:
l () :
f () :

:
14
18
25
32
42
70
80
327
7
+
+
+
+
+
+
+
=
2.555
128 128 128 128 128 128 128 128
128

= ) $ (T

)
( :
i = 11 h = 10 g = 00 f = 010 e = 0110 d = 01110 c = 011111 b = 0111101 a = 0111100

: " } {a, b, c, d, e } {5, 2, 2, 4, 5 ,


:
149

10.2 :

10:

e : 5

d:4

a:5

. b:2

c:2

i = 1 ,b : 2 c : 2 ,4 .T1
e : 5

d:4

a:5

. T1 : 4

i = 2 ,T1 : 4 d : 4 ,8 .T2
T2 : 8

. a:5

e:5

i = 3 ,a : 5 e : 5 ,10 .T3
T3 : 10

. T2 : 8

i = 4 ,T2 : 8 T3 : 10 ,18 T4 :
z4 : 18

a:5

d:4

z3 : 10

e:5

z2 : 8

z1 : 4

b:2

c:2
" .
:

5
18

4
18

2
18

2
18

5
18

:
l () :
f () :

:
6
6
8
10
40
10
+
+
+
+
=
2.222
18 18 18 18 18
18

= ) $ (T

:
e = 11 a = 10 d = 01 c = 001 b = 000
abedade adebade ae:
1001110001001110011001110001001110011011
" 40.
, ad, eb, ec, ae 4, 2, 2, 1 ,
:
ad : 4

ec : 2

eb : 2

. ae : 1

i = 1 ,ae : 1 eb : 2 , 3 .T1
ad : 4

T1 : 3

. ec : 2

150

10:

10.2 :

i = 2 ,ec : 2 T1 : 3 , 5 .T2
T2 : 5

. ad : 4

i = 3 ,ad : 4 T2 : 5 ,9" :
z3 : 9

z2 : 5

z1 : 3

eb : 2

ad : 4

ec : 2

ae : 1

" .
:

ae

eb

ad

1
9

2
9

2
9

4
9

:
l () :
f () :

:
15
4 4 6 3
= + + +
1.667
9 9 9 9
9

= ) $ (T

:
ad = 0, ec = 10, eb = 111, ae = 110
" abedade adebade ae 01110100111011010 17.

.

151

You might also like