Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
»ù±¾Êý¾Ý½á¹¹(Ëã·¨µ¼ÂÛ)Óëpython
 
  2597  次浏览      28
 2017-12-14  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚCSDN,Ö÷Òª½²ÁËÊý¾Ý½á¹¹Ëã·¨¼°python£¬ÆäÖÐÓÐStack, Queue¡¢Á´±íºÍ¶àÖØÊý×顢ɢÁÐ±í¡¢¶þ²æ²éÕÒÊ÷¡¢ºìºÚÊ÷¡¢Í¼µÄ±íʾºÍËÑË÷¡£

Stack, Queue

StackÊǺó½øÏȳö, LIFO, ¶ÓÁÐΪÏȽøÏȳö, FIFO

ÔÚpythonÖÐÁ½Õß, ¶¼¿ÉÒÔ¼òµ¥µÄÓÃlistʵÏÖ,

½ø, ÓÃappend()

³ö, StackÓÃpop(), QueueÓÃpop(0), popµÄʱºò×¢ÒâÅжÏlen(l)

¶ÔÓÚÓÅÏȶÓÁÐ, ÒªÓõ½Ç°Ãæ½²µ½µÄ¶Ñ

Á´±íºÍ¶àÖØÊý×é

ÕâЩÊý¾Ý½á¹¹ÔÚpythonÖоÍûÓдæÔڵļÛÖµ, ÓÃlist¶¼ÄÜÇáËÉʵÏÖ

É¢Áбí

ΪÁËÂú×ãʵʱ²éѯµÄÐèÇó¶ø²úÉúµÄÊý¾Ý½á¹¹, ²éѯ¸´ÔÓ¶ÈµÄÆÚÍûÊÇO(1), ×î²îΪO(n)

ÎÊÌâÃèÊö, ¶ÔÓÚn¸ö(key, value)¶Ô, ÔõÑù´æ´¢¿ÉÒÔÔÚO(1)µÄʱ¼ä¸´ÔÓ¶ÈÄÚ»ñÈ¡ÌØ¶¨keyËù¶ÔÓ¦µÄvalue. Õâ¸öÎÊÌâÀï, keyĬÈÏÊÇint, µ±È»key¿ÉÒÔÊÇ×Ö·û´®»òÆäËû, ÄǾÍÏë°ì·¨°Ñkeyת»»³Éint.

×î¼òµ¥µÄ·½·¨ÊÇÖ±½ÓѰַ±í , ¾ÍÊÇ´´½¨ºÍkey¿Õ¼äÒ»Ñù´óСµÄÊý×éA, °Ñvalue´æ´¢µ½Êý×éA[key]ÖÐ.

Õâ¸ö·½·¨¼òµ¥, ¶ÔÓ¦key¿Õ¼ä²»´óµÄÇé¿öÒ²¿ÉÒÔÓÃ, µ«Êǵ±key¿Õ¼äºÜ´óʱ, Õâ¸öÌ«ºÄÄÚ´æÁË, ¶øÇÒûÓбØÒª, ±ÈÈçÖ»ÓÐ10¸ö·¶Î§ÔÚ1µ½1000000µÄkey, ÄãÒª·ÖÅä¸öÄÇô´óµÄÊý×é, Ã÷ÏÔ²»ºÏÊÊ

É¢Áз½·¨ , ×ÔÈ»Ïëµ½ÎÒÃÇÓ¦¸ÃÓÃÒ»¸ö½ÏСµÄÊý×éÀ´´æ´¢, ÄÇô¾ÍÐèÒª°Ñkey¿Õ¼ä·¶Î§ÖеÄÊý×ÖÓ³Éäµ½½ÏСËù´æ´¢¿Õ¼äÉÏÀ´. Õâ¸öÓ³ÉäµÄ·½·¨, ³ÆÎªÉ¢Áк¯Êý . É¢Áк¯ÊýµÄÑ¡ÔñÊǺܹؼüµÄ, ¶øÇÒÕâ¸öûÓоø¶ÔµÄºÃ»µ, ÿ¸öÉ¢Áк¯Êý¶¼ÓÐËüµÄÊÊÓ÷¶Î§.

³£ÓõÄÉ¢Áк¯ÊýÈçÏÂ, ½«¹Ø¼ü×ÖkÓ³Éäµ½m¸ö²Û

³ý·¨É¢Áз¨, h(k) = k mod m

³Ë·¨É¢Áз¨, h(k) = |m(KA mod 1)|, 0 È«ÓòÉ¢ÁÐ, Ïë·¨¾ÍÊÇ×¼±¸Ò»×éÉ¢Áк¯Êý, ÿ´ÎʹÓÃÊ±Ëæ»úÑ¡ÔñÒ»¸ö, À´¿Ë·þÉ¢Áк¯ÊýµÄ¾ÖÏÞÐÔ. ±ÈÈ綨ÒåÉ¢Áк¯Êý×é,h(k) = ((ak+b) mod p)mod m, pÊÇ×ã¹»´óµÄÖÊÊý, Ëæ»úÑ¡Ôñ²»Í¬µÄa,b²úÉú²»Í¬µÄÉ¢Áк¯Êý

ÄÇô°ÑÒ»¸ö´óµÄÊý×Ö¿Õ¼äÓ³Éäµ½Ò»¸ö½ÏСµÄÊý×Ö¿Õ¼äÉÏ, ÄÇô¿Ï¶¨»áÓÐÖØ¸´, ÕâÊDz»¿É±ÜÃâµÄ, ÕâÖÖÖØ¸´³ÆÎªÅöײ (collision).

ÓÐÅöײ¾ÍÒªÏë°ì·¨½â¾ö, ×î¼òµ¥µÄÏë·¨, ¾ÍÊÇÁ´½Ó·¨ .

ÀíÏë״̬ÿ¸ö²ÛÀïÃæÖ»·ÅÒ»¸ökey, ÄÇôsearch¿Ï¶¨ÊÇO(1)µÄ, Ö±½Ó¾ÍÕÒµ½. µ«ÊÇÖØ¸´ÊDz»¿É±ÜÃâ, Èç¹ûÓжà¸ökey±»·ÖÅ䵽ͬһ¸ö²Û, Ôõô°ì

ÄÇôÔÚ²ÛÖдæ·ÅÒ»¸ökeyµÄÁ´±íÀ´´æ´¢¶à¸ökey, ÕâÑùsearch¿Ï¶¨´óÓÚO(1), ×î²îµÄÇé¿öΪO(n). ƽ¾ùΪO(1+a), aÎª×°ÔØÒò×Ó(load factor), Ò»¸ö²ÛÖÐÆ½¾ù´æ´¢µÄÔªËØÊý.

ËùÒÔÎÒÃÇÓ¦¸Ã¾¡Á¿¼õÉÙÅöײµÄ¿ÉÄÜÐÔ, ×îÖ±½ÓµÄ·½·¨ÊǼõÉÙ×°ÔØÒò×Ó

ÁíÒ»ÖÖ½â¾öÅöײµÄ·½·¨¾ÍÊÇ¿ª·ÅѰַ·¨ , ×ö·¨ÊdzöÏÖÅöײʱ, ¸ù¾Ý¹æÔò̽²âÁíÒ»¸ö²Û´æ·Å¸ÃÔªËØ

Õâ¸ö·½·¨µÄºÃ´¦¾ÍÊÇûÓÐÓÃÁ´±í, ²»ÓÃÖ¸Õë, ½ÚÊ¡µÄ¿Õ¼ä¿ÉÒÔÌṩ¸ü¶àµÄ²Û, »µ´¦ÊÇÊý¾Ý¿ÉÄÜ»áÒç³ö, ËùÒÔҪȷ±£×°ÔØÒò×Ó²»ÄÜ´óÓÚ1

ÏÖÔÚµÄÎÊÌâ¾ÍÊǵ±·¢ÉúÅöײʱ, ÔõôÑùȥ̽²âÏÂÒ»¸ö²Û

ÏßÐÔ̽²â, h(k,i)=(h'(k)+i) mod m,i=0,1,¡­¡­£¬m-1, Õâ¸ö·½·¨»áÓиöÎÊÌâ, Ò»´Î¼¯Èº, Á¬Ðø±»Õ¼ÓõIJۻ᲻¶ÏÔö¼Ó, ÄÇôºóÃæÕì²âµÄʱ¼ä»á±ä³¤

¶þ´Î̽²â, h(k,i)=(h'(k)+c1*i+c2*i2 ) mod m, ÕâÑù²»ÓÃÒ»¸ö¸öÁ¬ÐøÈ¥Ì½²â, ÒòΪÓиöƽ·½, »á¸ôµÄԶЩ, µ«»¹ÊÇ»áÓжþ´Î¼¯Èº, ÒòΪ³õʼ̽²â¾ö¶¨ÁËÕû¸ö̽²âÐòÁÐ

Ë«ÖØ¹þÏ£ , h(k,i)=(h1(k)+i*h2(k)) mod m, ÕâʱÏÖÔÚ×îºÃµÄ̽²â·½·¨

¿ª·ÅѰַ·¨search¸´ÔÓ¶ÈΪO(1/(1-a)), aÎª×°ÔØÒò×Ó

Ö¹ÓÚÖÁÉÆ, ÓÐûÓÐÒ»ÖÖ·½·¨¿ÉÒÔÔÚ×î²îÇé¿öÏÂÒ²ÄÜ´ïµ½O(1), ÀíÂÛÉÏÊÇÓеÄ, µ«±ØÐëÊÇÊäÈëÊý¾ÝΪ¾²Ì¬Êý¾Ý, ·½·¨½Ðperfect hashing, ÍêÃÀÉ¢ÁÐ
˼·Ҳ²»¸´ÔÓ, ²ÉÓÃÁ½¼¶hash, Ò»¼¶ÀàËÆÓÚÁ´½Ó·¨, ²ÉÓÃÈ«ÓòÉ¢ÁаÑn¸öÊäÈë»®·Öµ½m¸ö²ÛÄÚ, È»ºóÔÚÿ¸ö²ÛÄÚ½øÐжþ¼¶É¢ÁÐ, ²¢È·±£¶þ¼¶É¢ÁÐÊÇÎÞ³åÍ»µÄ.

¿ÉÒÔÖ¤Ã÷µ±, m = n2 ʱ, ³öÏÖ³åÍ»µÄ¸ÅÂÊСÓÚ0.5, ËùÒÔÖ»Òª±£Ö¤Ò»¼¶É¢Áк¯ÊýѡȡºÏÊÊ, ¿ÉÒÔ¾ùÔȵİÑn¸öÔªËØ·Ö²¼µ½m¸ö²ÛÖÐ, ²¢±£Ö¤²ÛÖжþ¼¶É¢ÁеĿռä×ã¹»´ó, ¾Í¿ÉÒԴﵽЧ¹û.

ÔÚpythonÖÐ, ÎÞÐè×Ô¼ºÊµÏÖÉ¢Áбí, ÓÃdict¾Í¿ÉÒÔ

¶þ²æ²éÕÒÊ÷

¶þ²æ²éÕÒÊ÷, Ò²ÊÇÒ»ÖÖ±ãÓÚ²éÕÒµÄÊý¾Ý½á¹¹, ÈÎÒâÒ»¸öÊ÷½ÚµãµÄ×ó×ÓÊ÷¶¼Ð¡Óڸýڵã, ÓÒ×ÓÊ÷¶¼´óÓڸýڵã. Ëæ»ú¹¹ÔìµÄ¶þ²æÊ÷, ÀíÏëÊ÷¸ßΪlogn, ÆäÉϲÙ×÷µÄƽ¾ù¸´ÔÓ¶ÈΪO(logn)

¼ÈÈ»Ç°ÃæµÄHash¿ÉÒÔÌṩO(1)µÄsearch, Ϊʲô»¹ÐèÒªÕâ¸öÊý¾Ý½á¹¹ÁË, Ëû¸üÁé»î, Ëû¿ÉÒÔÌṩ³ýsearchÍâµÄÆäËû²Ù×÷, ÈçMinimum, Maximum, Predecessor, Successor, InsertµÈ²Ù×÷.

Ëû¿ÉÒÔÓÃÓÚ×Öµä, »òÓÅÏȶÓÁÐ, ¿ÉÊÇÈç¹û×Öµä, ÎÒÊ×Ñ¡Hash, ÓÅÏȶÓÁÐ, ÎÒÊ×Ñ¡¶Ñ, ûÓÐÏëµ½·ÇÒªÓöþ²æÊ÷µÄÀý×Ó, ÍùÍùÊǶþ²æÊ÷µÄ±äÖÖ¸üÓÐʵÓüÛÖµ.

¶þ²æÊ÷×î´óµÄÎÊÌâ, Êǹ¹Ôì˳Ðò²»Äܱ£Ö¤ÊÇËæ»úµÄ, ¾ÍÊÇ˵²»Äܱ£Ö¤¶þ²æÊ÷ÊÇÆ½ºâµÄ, ²»Æ½ºâ¾ÍÂé·³ÁË, ¼«ÏÞÇé¿öÊǸöµ¥Á´±í. ³£ÓõÄÒ»ÖÖÆ½ºâ¶þ²æÊ÷, ΪºìºÚÊ÷.

BÊ÷Ò²ÊǶþ²æÊ÷ºÜÓÐÓõıäÖÖ, ³£ÓÃÓÚ´´½¨Êý¾Ý¿âË÷Òý, ºóÃæ»á¾ßÌåÌÖÂÛ.

ÏÂÃæ¸ø³öpythonʵÏÖ

1 class Node:
2
3 def __init__(self,data):
4 self.left = None
5 self.right = None
6 self.parent = None
7 self.data = data
8
9 def insert(self, data):
10 # #recursion version
11 # if data < self.data:
12 # if self.left:
13 # self.left.insert(data)
14 # else:
15 # self.left = self.createNode(data)
16 # self.left.parent = self
17 # else:
18 # if self.right:
19 # self.right.insert(data)
20 # else:
21 # self.right = self.createNode(data)
22 # self.right.parent = self
23 #non-recursion version
24 node = self
25 while node:
26 if data < node.data:
27 next = node.left
28 else:
29 next = node.right
30 if next:
31 node = next
32 else:
33 break
34 nn = self.createNode(data)
35 if data < node.data:
36 node.left = nn
37 node.left.parent = node
38 else:
39 node.right = nn
40 node.right.parent = node
41 return nn
42
43 def createNode(self, data):
44 return Node(data)
45
46 def printTree (self):
47 """ÖÐÐò±éÀú"""
48 if self.left:
49 self.left.printTree()
50 print self.data
51 if self.right:
52 self.right.printTree()
53
54 def maxNode(self):
55 if self.right:
56 return self.right.maxNode()
57 else:
58 return self
59
60 def minNode (self):
61 if self.left:
62 return self.left.maxNode()
63 else:
64 return self
65
66 def lookup(self, data):
67 if self.data == data:
68 return self
69
70 if self.data > data:
71 if self.left:
72 return self.left.lookup(data)
73 else:
74 return None
75 else:
76 if self.right:
77 return self.right.lookup(data)
78 else:
79 return None
80
81 def successor(self):
82 """
83 ÓÐÓÒ×ÓÊ÷ʱ,ºÜÈÝÒ×Àí½â, È¡ÓÒ×ÓÊ÷µÄ×îСֵ
84 ûÓÐÓÒ×ÓÊ÷ʱ, Ò²¾ÍÊÇ˵¸Ã½ÚµãÊǵ±Ç°×ÓÊ÷µÄ×î´ó½Úµã, ¸Ã½ÚµãµÄºó¼ÌΪ°Ñ¸Ã×ÓÊ÷×÷Ϊ×ó×ÓÊ÷µÄ×î½üµÄ¸ù½Úµã
85 Èç¹ûҪȡǰÇý, µÀÀíÒ»Ñù
86 """
87 n= self
88 if n.right:
89 return n.right.minNode()
90 else:
91 p = n.parent
92 while p and p.right == n:
93 n = p
94 p = p.parent
95 return p
96
97 def delete(self, root):
98 """
99 ¶ÔÓÚûÓÐ×ÓÊ÷,»òÖ»ÓÐÒ»¸ö×ÓÊ÷, ¶¼ºÜºÃ´¦Àí
100 Èç¹ûÓÐÁ½¸ö×ÓÊ÷, ×ö·¨Êǰѽڵãºó¼Ì½Úµã¿½±´µ½µ±Ç°½Úµã, È»ºóɾ³ýºó¼Ì½Úµã
101 Õâ²»ÊÇΨһµÄ×ö·¨, µ«ÕâÑù×ö¶ÔÊ÷Ô­ÓÐµÄÆ½ºâÐÔÆÆ»µ×îС
102 µ±root±»É¾³ýʱ, root»á±ä, ËùÒÔÐèÒª·µ»ØÐµÄroot
103 """
104 n= self
105
106 if n.left and n.right:
107 s = n.right.minNode()
108 n.data = s.data
109 root = s.delete(root)
110 return root
111
112 #ÌØÊâ´¦Àí¸ù½Úµã
113 if not n.parent:
114 if n.left:
115 root = n.left
116 n.left = None
117 root.parent = None
118 elif n.right:
119 root = n.right
120 n.right = None
121 root.parent = None
122 else:
123 root = None
124
125 return root
126
127 if not n.left and not n.right:
128 if n.parent.left == n:
129 n.parent.left = None
130 else:
131 n.parent.right = None
132 else:
133 if n.parent.left == n:
134 n.parent.left = n.left or n.right
135 else:
136 n.parent.right = n.left or n.right
137 n.parent = None
138 return root
139 def buildTree():
140 root = Node(8)
141 root.insert(3)
142 root.insert(10)
143 root.insert(1)
144 root.insert(6)
145 root.insert(4)
146 root.insert(7)
147 root.insert(14)
148 root.insert(13)
149 root.printTree()

ºìºÚÊ÷

Ç°ÃæËµÁË, ¶þ²æ²éÕÒÊ÷×î´óµÄÎÊÌâ¾ÍÊÇÆ½ºâÐÔ, ¶øºìºÚÊ÷¾ÍºÜºÃµÄ½â¾öÁËÕâ¸öÎÊÌâ, ʲôÊǺìºÚÊ÷

1£©Ã¿¸ö½áµãҪôÊǺìµÄ£¬ÒªÃ´ÊǺڵġ£

2£©¸ù½áµãÊǺڵġ£

3£©Ã¿¸öÒ¶½áµã£¬¼´¿Õ½áµã£¨NIL£©ÊǺڵġ£

4£©Èç¹ûÒ»¸ö½áµãÊǺìµÄ£¬ÄÇôËüµÄÁ©¸ö¶ù×Ó¶¼ÊǺڵġ£

5£©¶Ôÿ¸ö½áµã£¬´Ó¸Ã½áµãµ½Æä×ÓËï½áµãµÄËùÓз¾¶Éϰüº¬ÏàͬÊýÄ¿µÄºÚ½áµã¡£

Âú×ãÉÏÃæ¼¸µã¾Í½Ð×öºìºÚÊ÷, ̹°×µÄ½², Õâ¸öÊý¾Ý½á¹¹ÕæÊÇÓй»¸´ÔÓµÄ, ¶ÔÓÚÄÜÏë³öÕâÑù·½·¨µÄNB, ³ç°ÝÖ®ÇéÈçÌÏÌϽ­Ë®

Õâ¸öÊ÷ÓÐʲô, Ã÷ÏÔ¾ÍÊÇ±È½ÏÆ½ºâ, ÒòΪ¸ùµ½Ò¶µÄ×¾àÀë×î¶àÊÇ×î¶Ì¾àÀëµÄ2±¶, Ϊʲô

ÒòΪºÚ¸ß(°üº¬µÄºÚ½ÚµãÊý)¶¼ÊÇÒ»ÑùµÄ, ËùÒÔ×î¶Ì·¾¶¾ÍÊÇÈ«ºÚ, ×·¾¶ÎªºìºÚ½»Ìæ, ËùÒÔ××î¶àÊÇ×î¶Ì2±¶.

¿ÉÒÔÖ¤Ã÷ºìºÚÊ÷µÄ¸ß¶ÈÖÁ¶àΪ2lg(n+1), Ê÷µÄ²Ù×÷¸´ÔÓ¶ÈÍêȫȡ¾öÓÚÊ÷¸ß, Õâ¾ÍºÜºÃµÄ½â¾öÁ˶þ²æÊ÷µÄ²»Æ½ºâÎÊÌâ.

ºìºÚÊ÷±È½ÏÓÐÌØÉ«µÄ²Ù×÷ΪÐýת(pivot) ,

ºìºÚÊ÷µÄ²åÈë²Ù×÷

¶ÔÓÚºìºÚÊ÷µÄ²åÈë, ĬÈϲåÈë½ÚµãΪºì½Úµã, ±ØÐëÊǺìµÄ, ¸ùÊǺڵÄ, Èç¹û²åºÚµÄ, ¾ÍºÍ¶þ²æÊ÷ûÓÐÇø±ðÁË. ¶øÇÒ²åºìµÄ²»»á´òÆÆºÚ¸ßÏàͬ¹æÔò5), Ö»»á´òÆÆ¹æÔò2), 4), ËùÒÔÖ»ÐèÒªÕë¶ÔÕâÁ½¸ö¹æÔò½øÐÐrebalance. Å׿ªrebalance²»Ì¸, ºìºÚÊ÷µÄ²åÈë²Ù×÷ºÍ¶þ²æÊ÷ÏàͬµÄ, µ«Êǹؼü¾ÍÊDzåÍêºóµÄrebalance¹ý³ÌÀ´±£Ö¤ºìºÚÊ÷µÄ¹æÔò.

rebalanceµÄ¹ý³ÌÊDZȽϸ´ÔÓµÄ, ²»¹ýÎÒÃÇ¿ÉÒÔcase by caseµÄ·ÖÎö, ×ܵÄÀ´ËµÖ»ÓÐÁ½ÖÖ²Ù×÷, Ðýת ºÍ±äÉ« , ²¢ÇÒÖ»ÓгöÏÖÁ¬ÐøÁ½¸öºÚÉ«½Úµãʱ²ÅÐèÒªÐýת.

1) ²åÈëµÄÊǸù½áµã,Ö±½Ó°Ñ´Ë½áµã±äΪºÚÉ«

2) ²åÈëµÄ½áµãµÄ¸¸½áµãÊǺÚÉ«, ºÜºÃʲôҲ²»ÓÃ×ö

3) µ±Ç°½áµãµÄ¸¸½áµãÊǺìÉ«ÇÒ׿¸¸½áµãµÄÁíÒ»¸ö×Ó½áµã£¨ÊåÊå½áµã£©ÊǺìÉ«

¸¸½ÚµãºìÉ«, ´òÆÆÁ˹æÔò4), ¶øÇÒ¿ÉÒÔÍÆ¶Ï׿¸¸¿Ï¶¨ÊǺڵÄ, ²¢ÇÒÊåÊå½áµãÊǺìÉ«, ˵Ã÷Õâ¸ö×ÓÊ÷ÊÇÆ½ºâµÄ(ºÚºìÏà¼ä), ²»ÐèÒªÐýת.

¼ÈÈ»²»Ðýת¾Í±äÉ«, ¸¸½ÚµãºÍÊåÊå½Úµã±äºÚ£¬×游½áµã±äºì£¬ÄÇÕâÑù׿¸¸½Úµã¾ÍÓпÉÄÜÎ¥·´¹æÔò, ËùÒÔ¼ÌÐø¶Ô׿¸¸½Úµã½øÐÐrebalance

4)µ±Ç°½ÚµãµÄ¸¸½ÚµãÊǺìÉ«,ÊåÊå½ÚµãÊǺÚÉ«

ÕâÖÖÇé¿ö±È½Ï¸´ÔÓ, ÒòÎª×æ¸¸¿Ï¶¨ÊǺڵÄ, ÊåÊå½ÚµãÒ²ÊǺڵÄ, ËùÒÔ³öÏÖÁ¬ÐøÁ½¸öºÚÉ«½Úµã, Ê÷²»Æ½ºâ, ¿Ï¶¨ÐèÒªÐýת, Ôõô¸öÐýת·¨

Ê×ÏÈÒª¿´ÊåÊå½ÚµãÊÇ׿¸¸½ÚµãµÄ×ó½Úµã, »¹ÊÇÓÒ½Úµã, Õâ¸ö¾ö¶¨ÁËÐýתµÄ·½Ïò, ÎÒÃÇÖ»ÐèÒªÌÖÂÛÆäÖÐÒ»ÖÖÇé¿ö, ÁíÒ»ÖÖÇé¿ö¾ÍÊÇÍùÏà·´µÄ·½ÏòÐýת¾Í¿ÉÒÔÁË

ÎÒÃǾÍÌÖÂÛÒ»ÏÂÊåÊå½ÚµãÊÇ׿¸¸½ÚµãµÄÓÒ½ÚµãµÄÇé¿ö, ¾ÍÊǸ¸½ÚµãÎª×æ¸¸½ÚµãµÄ×ó½Úµã, Õâ¶ù¸ù¾Ýµ±Ç°½ÚµãλÖÃÓÖ·ÖΪÁ½ÖÖÇé¿ö,

a)µ±Ç°½ÚµãΪ¸¸½ÚµãµÄÓÒ½Úµã, ÒÔ¸¸½Úµã×óÐý, ²¢°Ñ¸¸½Úµã×÷Ϊµ±Ç°½Úµã

b)µ±Ç°½ÚµãΪ¸¸½ÚµãµÄ×ó½Úµã, ÒÔ׿¸¸½ÚµãÓÒÐý, ²¢¸Ä±ä¸¸½Úµã, ׿¸¸½ÚµãÑÕÉ«

´ó¼ÒÏëÒ»ÏÂ, ÕâÖÖÇé¿öÏÂÐýתµÄÄ¿µÄÊÇÒòΪÔÚ׿¸¸½ÚµãµÄÓÒ×ÓÊ÷ÉÏÁ¬Ðø³öÏÖÁ½¸öºÚ½Úµã, ËùÒÔÎÒÃÇ×îÖÕÐèҪͨ¹ýÒ»´ÎÓÒÐýÀ´Ôö¼ÓÓÒ×ÓÊ÷µÄ¸ß¶È, ¾ÍÈçb)Çé¿öËùʾ, ͨ¹ýÒ»´ÎÓÒÐý, ²¢¸ÄÉ«, ´ïµ½Á˻ָ´ºìºÚÊ÷µÄËùÓйæÔò.

µ«¶ÔÓÚa), Äã¿ÉÒÔÊÔ×ÅÖ±½ÓÓÒÐý, Äãû·¨¸ÄÉ«À´Âú×ãºìºÚÊ÷µÄ¹æÔò, ËùÒÔÒªÏÈͨ¹ýÒ»´Î×óÐýÀ´´ïµ½b), ½ø¶ø½øÐÐÓÒÐý, ËùÒÔa)Ö»ÊÇÒ»¸öÖм䲽Öè.

ºÃÁË, Õâ±ß·ÖÎöÍêÊåÊå½ÚµãÊÇ׿¸¸½ÚµãµÄÓÒ½ÚµãµÄÇé¿ö, ¶ÔÓÚÊåÊå½ÚµãÊÇ׿¸¸½ÚµãµÄ×ó½ÚµãµÄÇé¿ö, ÀàËÆÏëÏëÒ²ÄÜÃ÷°×.

ºìºÚÊ÷µÄɾ³ý²Ù×÷

»ØÏëÒ»ÏÂÇ°Ãæ¶þ²æÊ÷µÄɾ³ý²Ù×÷£¬ Èç¹ûÐèҪɾ³ýµÄ½ÚµãÓÐÁ½¸ö¶ù×Ó£¬ÄÇôÎÊÌâ¿ÉÒÔ±»×ª»¯³Éɾ³ýÁíÒ»¸öÖ»ÓÐÒ»¸ö¶ù×ӵĽڵãµÄÎÊÌâ £¨ÕâÀïµÄ¶ù×Ó£¬Îª·ÇÒ¶×Ó½ÚµãµÄ¶ù×Ó£¬ºìºÚÊ÷ÖÐleaf½Úµã¶¼ÊÇNull½Úµã£©¡£ÎªÊ²Ã´£¿ÒòΪÕâ¶ùµÄɾ³ý²Ù×÷¹ý³Ì£¬ ÊÇÕÒµ½¸Ã½ÚµãµÄºó¼Ì£¬ copyµ½µ±Ç°½Úµã£¬ È»ºóɾ³ýºó¼Ì£¨ÓÒ×ÓÊ÷ÖÐ×îС½Úµã£©£¬´ËʱµÄºó¼Ì½Úµã×î¶àÖ»ÓÐÒ»¸ö¶ù×Ó£¨²¢ÇÒÊÇÓÒ¶ù×Ó£©£¬·ñÔò¾Í²»ÊǺó¼Ì¡£

ËùÒÔÎÊÌâ¼ò»¯Îª£¬ÎÒÃÇÖ»ÐèÒªÌÖÂÛɾ³ýÖ»ÓÐÒ»¸ö¶ù×ӵĽڵã (Èç¹ûËüÁ½¸ö¶ù×Ó¶¼Îª¿Õ£¬¼´¾ùΪҶ×Ó£¬ÎÒÃÇÈÎÒ⽫ÆäÖÐÒ»¸ö¿´×÷ËüµÄ¶ù×Ó)£¬µ½Õâ¶ùÎÒÃǾͰÑÒ»¸ö¿´ËƸ´ÔÓµÄÎÊÌâת»¯ÎªÏà¶Ô¼òµ¥µÄÎÊÌâ¡£

ÔÚɾ³ýÕâ¸ö½Úµãʱ£¬¸ù¾ÝÑÕÉ«²»Í¬£¬·ÖΪ3ÖÖÇé¿ö£¬

1£©¸Ã½ÚµãΪºìÉ«£¬ÕâÖÖÇé¿öÒ»¶¨Ã»Óжù×Ó£¬Ö±½Óɾ³ýûÓÐÈκÎÓ°Ïì

2£©¸Ã½ÚµãΪºÚÉ«£¬Èç¹ûÓжù×ÓÒ»¶¨ÊÇÓÐÇÒÖ»ÓÐÒ»¸öºìÉ«µÄ¶ù×Ó£¬Õâ¸öÒ²ºÃ°ì£¬°ÑºìÉ«µÄ¶ù×ÓÌæ»»¸Ä½Úµã£¬ ²¢¸ÄΪºÚÉ«¡£

3£©¸Ã½ÚµãΪºÚÉ«£¬ÇÒûÓжù×Ó£¬¼´Ö»ÓÐÁ½¸öÒ¶×Ó£¬Õâ¸öÎÊÌâ¾Í±È½Ï¸´ÔÓÁË£¬ÄãÖ±½Óɾ³ýÕâ¸ö½Úµã£¬ ÆÆ»µÁ˹æÔò5£©£¬Õâ¸ö·ÖÖ§Ã÷ÏÔ±ÈÆäËûºÚ¸ßÉÙ1.

ÏÖÔھͶÔÉÏÃæÇé¿ö3£©¾ßÌå·ÖÎö£¬Ë¼Â·ÊÇʲô£¬Ã÷ÏÔÖ±½Ó´Ó¸Ã½ÚµãÉÏû·¨½â¾öÎÊÌ⣬Ëû±»¸ÉµôÁË£¬ËûҲûÓжù×Ó£¬ÄǾÍÕÒËû¸¸Ç×£¬Ðֵܰɣ¬×ÜÒªÓÐÈ˸ºÔðµÄÂ𣬠Èç¹ûËûûÓи¸Ç×ÁË£¬¹Â¶ù£¬ Ëû¾ÍÊǸù½Úµã£¬ Ëû±»¸Éµô£¬ Ê÷¶¼Ã»ÁË£¬µ±È»²»ÓÃ×öɶÁË¡£¶øÇÒÈç¹ûÓи¸Ç×£¬Ëû¾ÍÒ»¶¨ÓÐÐֵܣ¬²»Á÷ÐÐÖ»ÉúÒ»¸ö¡£

ÄÇô¾Í°ÑËûµÄ¸¸½Úµã£¬ÐֵܽڵãÒ»Æð¿¼ÂǽøÀ´£¬ÐγÉÒ»¸ö×ÓÊ÷À´½â¾öÕâ¸öÎÊÌâ¡£Ôõô½â¾ö£¿ ÄÇôÎÒ¾ÍÀ´Ì¸Ì¸ÎÒµÄÀí½â,

ÈÁÍâ±ØÏȰ²ÄÚ£¬µÚÒ»²½ÎÒÃÇÊ×Ïȱ£Ö¤Õâ¸ö×ÓÊ÷ÄÚ²¿ÊÇÂú×ãºìºÚÊ÷¹æÔòµÄ(ÎÒÃǼÙÉ豻ɾ³ýµÄ½ÚµãÔÚ×ó×ÓÊ÷, ÔÚÓÒ×ÓÊ÷Ò»Ñù´¦Àí, Ö»ÊÇÐýת·½ÏòÏà·´)

ÏÖÔÚµÄÇé¿öʱ±»É¾³ý×ÓÊ÷µÄºÚ¸ß±ÈËûµÄÐÖµÜ×ÓÊ÷ºÚ¸ßÉÙ1, Ôõô°ì

a)×î¼òµ¥µÄÊÇ, °ÑÐֵܽڵã¸Äºì, ÕâÑùÈÃËûµÄºÚ¸ßÒ²¼õ1

ÕâÖָ퍱ØÐëÂú×ãµÄÌõ¼þÊÇ, ÐֵܽڵãÊ×ÏÈÊǺڵÄ, ¶øÇÒËûµÄ×Ó½ÚµãÒ²¶¼ÊǺڵÄ(Case 2 ), ÕâÑù¿ÉÒÔÖ±½Ó°ÑÐֵܽڵãÓɺڸĺì, ÔÚ²»ÆÆ»µÆäËû¹æÔòµÄǰÌáÏÂ, ʹÁ½¸ö×ÓÊ÷ºÚ¸ßÏàͬ.

µ«ÊÇÄã²»Äܱ£Ö¤ÕâÖÖcaseÒ»¶¨³öÏÖ, ÆäËûÇé¿öÈçÏÂ,

b)ÐֵܽڵãÊǺìµÄ, ÕâÖÖÇé¿öÏÂ, ÐֵܽڵãÒ»¶¨ÊÇÁ½¸öºÚÉ«×Ó½Úµã(Case1 ). ÕâÖÖÇé¿öÏÂ, ͨ¹ý¶Ô¸¸½ÚµãµÄÒ»´Î×óÐý²¢¸ÄÉ«, ¾ÍÄܹ»Âú×ã(Case 2)µÄÌõ¼þ.

c)ÐֵܽڵãÊǺڵÄ, µ«ÐֵܽڵãµÄ×Ó½ÚµãÖÁÉÙÓÐÒ»¸öÊǺìÉ«µÄ. ÕâÑùÄãҲû·¨Ö±½Ó¸ÄÐֵܽڵãµÄÑÕÉ«, ¸ÄÁ˾ͺͺì×Ó½Úµãì¶ÜÁË.

c1)Èç¹ûÐֵܽڵãµÄÓÒ¶ù×ÓSR ÊǺìÉ«µÄ(Case4 ), ×ö·¨ÊǰѸ¸½Úµã×öÒ»´Î×óÐý, ²¢°Ñ¸¸½ÚµãºÍ¶¼¸Ä³ÉSR ºÚÉ« , ÕâÑù×óÓÒ×ÓÊ÷µÄºÚ¸ß¾ÍÏàͬÁË.

c2)Èç¹ûÐֵܽڵãÖ»ÓÐ×ó¶ù×ÓSL ÊǺìÉ«µÄ(Case3 ), ÎÞ·¨Ö±½Ó°´c1´¦Àí, ÒòΪͨ¹ý×óÐý°ÑÓÒ×ÓÊ÷ŲÁËÒ»¸öºÚ½Úµã, µ½×ó×ÓÊ÷, µ«ÓÒ×ÓÊ÷ûÓпÉÒԸĺڵĺì½Úµã, µ¼ÖÂÓÒ×ÓÊ÷ºÚ¸ßÉÙ1.

ËùÒÔÐèҪͨ¹ý¶ÔÐֵܽڵãS½øÐÐÒ»´ÎÓÒÐý, ²¢¸ÄÉ«, ¾Í¿ÉÒÔÂú×ã(Case 4 )µÄÌõ¼þ.

µÚ¶þ²½, ÏÖÔÚ×ÓÊ÷ÄÚ²¿ºÚ¸ßÒѾ­Æ½ºâ, µ«¶ÔÓÚÕû¸öºìºÚÊ÷¶øÑÔ, ºÚ¸ßÊÇ·ñƽºâ

¿ÉÒÔ¿´µ½¶ÔÓÚc)¶øÑÔ, ×ÓÊ÷Äڵĺڸ߲»Ôö²»¼õ, ¶ÔÈ«¾ÖûÓÐÓ°Ïì

µ«¶ÔÓÚa)b)¶øÑÔ, ΪÁËÆ½ºâÄÚ²¿ºÚ¸ß, ×ÓÊ÷µÄºÚ¸ßÕû¸ö¼õÉÙ1 (Case 2 )

Èç¹û×ÓÊ÷µÄ¸ù½áµãΪºì, °ÑËü±äºÚ¾Í¿ÉÒÔ½â¾öÕâ¸öÎÊÌâ(ºìºÚÊ÷ÖÐ, ½Úµã±äºÚ±È½Ï·½±ãÖ»Ð迼ÂǺڸß, ±äºì±È½ÏÂé·³)

Èç¹û×ÓÊ÷¸ù½ÚµãΪºÚ, Õâ¾ÍÏ൱ÓÚ, °ÑÎÒÃǸսâ¾öµÄÎÊÌâ(×ÓÊ÷ºÚ¸ßÉÙ1), ÍùÉÏ(³¯¸ù½Úµã·½Ïò)ÌáÉýÁËÒ»²ã, µÝ¹éÈ¥½â¾ö. Èç¹ûÕâ¸öÎÊÌâÒ»Ö±ÎÞ·¨½â¾ö, ×îÖÕ»áÌáÉýµ½¸ù½ÚµãµÄλÖÃ, ÕâʱÕâ¸öÎÊÌâ¾Í²»Óýâ¾öÁË, Ï൱ÓÚ°ÑÕû¸öºìºÚÊ÷µÄºÚ¸ß¶¼¼õÁË1, ÕâÑùҲƽºâÁË.

ÓÐÁËÉÏÃæµÄÀí½âÔÙÈ¥¿´Wiki»òËã·¨µ¼ÂÛ¾ßÌåµÄËã·¨¾Í±È½ÏÈÝÒ×ÁË, ¸ö¶ù¾õµÃËüÃǶÔÓÚɾ³ý½âÊ͵IJ»¹»Çå³þ, ¶øÇÒͼ»­µÄ±È½ÏÈÃÈËÀ§»ó, ±ÈÈçÄã¿´¿´(Case1 )µÄͼ, ¶ÔÓÚ×óͼÊÇɾ³ýºóµÄÇé¿ö, Ҫת»¯ÎªÓÒͼ, Äã¿´¿´×óͼÓкڸ߲»Æ½ºâÂð, Ã÷ÏÔÊÇÆ½ºâµÄÂð, ÄÇ»¹×öʲô ¶ÔÓÚN¶øÑÔ, ҪôÊÇÒ¶½Úµã, ҪôÊÇÒ»¿Ã×ÓÊ÷, ËûµÄºÚ¸ßÓ¦¸ÃºÍ3,4,5,6½Úµã(»ò×ÓÊ÷)Ò»ÖµÄ, Äã˵Õâ¸öͼ»­µÄ¹Ö²»¹Ö, Îóµ¼ÐÔºÜÇ¿, Ö»ÄÜ´ó¸ÅʾÒâ, ²»¹ý´ó¼Ò¶¼ÓÃÕâ¸öͼ, ÎÒÒ²¾Í²»¸ÄÁË.

1£©ÐÖµÜS ÊǺìÉ«¡£

ÔÚÕâÖÖÇé¿öÏÂÎÒÃÇÔÚNµÄ¸¸Ç×ÉÏ×ö×óÐýת £¬°ÑºìÉ«ÐÖµÜת»»³ÉNµÄ׿¸¸¡£ÎÒÃǽÓ×ŶԵ÷ N µÄ¸¸Ç׺Í׿¸¸µÄÑÕÉ«¡£

2£©ÐÖµÜS ºÍ S µÄ¶ù×Ó¶¼ÊǺÚÉ«µÄ

ÏÂÃæÁ½ÖÖÇé¿öµÄÇø±ð½ö½öÊÇ×ÓÊ÷¸ù½ÚµãµÄÑÕÉ«²»Í¬, ÉÏÃæÒѾ­½âÊ͹ýÁË.

ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃǼòµ¥µÄÖØ»æ S ΪºìÉ«¡£½á¹ûÊÇͨ¹ýSµÄËùÓз¾¶£¬ËüÃǾÍÊÇÒÔǰ²» ͨ¹ý N µÄÄÇЩ·¾¶£¬¶¼ÉÙÁËÒ»¸öºÚÉ«½Úµã¡£ÒòΪɾ³ý N µÄ³õʼµÄ¸¸Ç×ʹͨ¹ý N µÄËùÓз¾¶ÉÙÁËÒ»¸öºÚÉ«½Úµã£¬ÕâʹÊÂÇ鶼ƽºâÁËÆðÀ´¡£µ«ÊÇ£¬Í¨¹ý P µÄËùÓз¾¶ÏÖÔڱȲ»Í¨¹ý P µÄ·¾¶ÉÙÁËÒ»¸öºÚÉ«½Úµã£¬ËùÒÔÈÔȻΥ·´ÊôÐÔ4¡£ÒªÐÞÕýÕâ¸öÎÊÌ⣬ÎÒÃÇÒª´ÓÇé¿ö 1 ¿ªÊ¼£¬ÔÚ P ÉÏ×öÖØÐÂÆ½ºâ´¦Àí¡£

S ºÍ S µÄ¶ù×Ó¶¼ÊǺÚÉ«£¬µ«ÊÇ N µÄ¸¸Ç×ÊǺìÉ«¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃǼòµ¥µÄ½»»» N µÄÐֵܺ͸¸Ç×µÄÑÕÉ«¡£Õâ²»Ó°Ï첻ͨ¹ý N µÄ·¾¶µÄºÚÉ«½ÚµãµÄÊýÄ¿£¬µ«ÊÇËüÔÚͨ¹ý N µÄ·¾¶É϶ԺÚÉ«½ÚµãÊýÄ¿Ôö¼ÓÁËÒ»£¬Ìí²¹ÁËÔÚÕâЩ·¾¶ÉÏɾ³ýµÄºÚÉ«½Úµã¡£

3£©S ÊǺÚÉ«£¬S µÄ×ó¶ù×ÓÊǺìÉ«£¬S µÄÓÒ¶ù×ÓÊǺÚÉ«£¬¶ø N ÊÇËü¸¸Ç×µÄ×ó¶ù×Ó¡£ÔÚÕâÖÖÇé¿öÏÂÎÒÃÇÔÚ S ÉÏ×öÓÒÐýת£¬ÕâÑù S µÄ×ó¶ù×Ó³ÉΪ S µÄ¸¸Ç×ºÍ N µÄÐÂÐֵܡ£ÎÒÃǽÓ׎»»» S ºÍËüµÄи¸Ç×µÄÑÕÉ«¡£

4£©S ÊǺÚÉ«£¬S µÄÓÒ¶ù×ÓÊǺìÉ«£¬¶ø N ÊÇËü¸¸Ç×µÄ×ó¶ù×Ó¡£ÔÚÕâÖÖÇé¿öÏÂÎÒÃÇÔÚ N µÄ¸¸Ç×ÉÏ×ö×óÐýת£¬ÕâÑù S ³ÉΪ N µÄ¸¸Ç×ºÍ S µÄÓÒ¶ù×ӵĸ¸Çס£ÎÒÃǽÓ׎»»» N µÄ¸¸Ç×ºÍ S µÄÑÕÉ«£¬²¢Ê¹ S µÄÓÒ¶ù×ÓΪºÚÉ«¡£

ÏÂÃæ¸ø³öºìºÚÊ÷µÄpythonʵÏÖ, ɾ³ýûд, ÒÔºóÓпղ¹

1 class RBTreeNode(Node):
2 """ red-black tree node"""
3 def __init__(self, data):
4 Node.__init__(self, data)
5 self.color = 'red'
6
7 def createNode(self, data):
8 return RBTreeNode(data)
9
10 def pivotLeft(self):
11 """ """
12 p = self.parent
13 l = self.left
14 r = self.right
15 #if has right child, save the left child of it
16 if r:
17 rl= r.left
18 else:
19 return
20 #after left pivot, r become new root of the child tree, so update r.parent
21 if p:
22 if p.left == self:
23 p.left = r
24 else:
25 p.right = r
26 r.parent = p
27 else:
28 r.parent = None
29 # update r.left, r.right not change
30 r.left = self
31 #update self.parent and self.right, left not change
32 self.parent = r
33 self.right = rl
34
35 return self, r
36 def pivotRight(self):
37 """ same logic with pivotLeft, just exchange the r and l"""
38 p = self.parent
39 l = self.left
40 r = self.right
41 if l:
42 lr= l.right
43 else:
44 return
45 if p:
46 if p.left == self:
47 p.left = l
48 else:
49 p.right = l
50 l.parent = p
51 else:
52 l.parent = None
53 l.right = self
54 self.parent = l
55 self.left = lr
56 return self, l
57
58 def insert(self, data):
59 """"""
60 n = Node.insert(self, data)
61 print n.data
62 #rebalance for insert
63 n.rebalance()
64
65 def rebalance(self):
66 """"""
67 n = self
68 p = n.parent
69 if not p:
70 n.black()
71 return
72 g = p.parent
73 #parent is black, no problem
74 if p and p.isBlack(): return
75
76 u = g.getOtherChild(p)
77 #p is red, u is red, then g must be black
78 if p.isRed()and u and u.isRed():
79 p.black()
80 u.black()
81 g.red()
82 g.rebalance()
83
84 #p is red, but u isn't red, black or leaf
85 if p.isRed():
86 if n.isRight() and p.isLeft():
87 print 'nr, pl'
88 p.pivotLeft()
89 n, p = p, n
90 if n.isLeft() and p.isLeft():
91 print 'nl, pl'
92 p.black()
93 g.red()
94 g.pivotRight()
95 return
96
97 if n.isLeft() and p.isRight():
98 print 'nl, pr'
99 p.pivotRight()
100 n, p = p, n
101 if n.isRight() and p.isRight():
102 print 'nr, pr'
103 p.black()
104 g.red()
105 g.pivotLeft()
106 return
107
108
109 def isLeft(self):
110 n = self
111 p = self.parent
112 if p and n == p.left:
113 return True
114 else:
115 return False
116 def isRight(self):
117 n = self
118 p = self.parent
119 if p and n == p.right:
120 return True
121 else:
122 return False
123 def isBlack(self):
124 if self.color == 'black':
125 return True
126 else:
127 return False
128 def isRed(self):
129 if self.color == 'red':
130 return True
131 else:
132 return False
133 def black(self):
134 self.color = 'black'
135 def red(self):
136 self.color = 'red'
137
138 def getOtherChild(self,child):
139 """ Give one child, and return other child"""
140 if self.left == child:
141 return self.right
142 else:
143 return self.left
144
145 def Print(self, indent):
146 for i in range(indent):
147 print " ",
148 print "%s (%s)" % (self.data, self.color)
149 if not self.left:
150 for i in range(indent+1):
151 print " ",
152 print "None(Black)"
153 else:
154 self.left.Print(indent+1)
155 if not self.right:
156 for i in range(indent+1):
157 print " ",
158 print "None(Black)"
159 else:
160 self.right.Print(indent+1)
161
162 class RBTree:
163 """ red-black tree"""
164 def __init__(self):
165 self.root = None
166
167 def insert(self, data):
168 if self.root:
169 self.root.insert(data)
170 self.updateRoot()
171 else:
172 self.root = RBTreeNode(data)
173 self.root.color = 'black'
174
175 def updateRoot(self):
176 """Update root node when root changes"""
177 n = self.root.parent
178 while n:
179 if n.parent:
180 n = n.parent
181 else:
182 break
183 if n:
184 self.root = n
185
186 def Print(self):
187 if self.root == None:
188 print "Empty"
189 else:
190 self.root.Print(1)
191 def buildRBTree():
192 tree = RBTree()
193 for i in range(10):
194 tree.insert(i)
195 tree.Print()

ͼ

ͼµÄ±íʾºÍËÑË÷

ͼ,G=(V,E) ,µÄ±íʾÁ½ÖÖ·½·¨, ÁÚ½Ó±íºÍÁÚ½Ó¾ØÕó. Á½Õ߸÷ÓÐÀû±×, ¶¼¿ÉÒÔÊÊÓÃÓÚÓÐÏòͼ, ÎÞÏòͼ, ¼ÓȨͼ

ÁÚ½Ó±í , ×î³£Óõıíʾ·½·¨, ÊÊÓÃÓÚÏ¡Êèͼ»ò±È½ÏСµÄͼ, ¿Õ¼ä¸´ÔÓ¶ÈΪ(V+E), ÓŵãÊǼòµ¥,¿Õ¼äºÄ·ÑС, ȱµã¾ÍÊÇÈ·¶¨±ßÊÇ·ñ´æÔÚЧÂʵÍ

ÁÚ½Ó¾ØÕó , ÓÃÓÚ³íÃÜͼ»òÐèҪѸËÙÅжÏÁ½µã¼ä±ß´æÔڵij¡¾°, ¿Õ¼ä¸´ÔÓ¶ÈΪ(V2 ), ÓŵãÊÇÅжϱߴæÔÚÎÊÌâ¿ì, ȱµã¾ÍÊǿռäºÄ·Ñ±È½Ï´ó, ÊÇÒ»ÖÖÓÿռ任ʱ¼äµÄ·½·¨. ÓÐЩ¶Ô¿Õ¼äµÄÓÅ»¯, ±ÈÈç¶ÔÓÚÎÞÏòͼ, ¾ØÕóÊǶԳƵÄ, ËùÒÔÖ»ÐèÒª´æ´¢Ò»°ë. ¶ÔÓڷǼÓȨͼ, ÿ¸ö±ßÖ»ÐèÒªÓÃ1bit´æ´¢.

ÄÇôÓÃpythonÔõô±íʾͼ, ûÓÐÓïÑÔÖ±½ÓÓÐͼÕâÑùµÄÊý¾Ý½á¹¹, ²»¹ý¶ÔÓÚpython¶øÑÔ, ͨ¹ý×Öµä¼ÓÉÏlist¿ÉÒÔºÜÈÝÒ׵ıíʾͼ(http://www.python.org/doc/essays/graphs.html), Àý×ÓÈçÏÂ

1 #A -> B
2 #A -> C
3 #B -> C
4 #B -> D
5 #C -> D
6 #D -> C
7 #E -> F
8 #F -> C
9 graph = {'A': ['B', 'C'],
10 'B': ['C', 'D'],
11 'C': ['D'],
12 'D': ['C'],
13 'E': ['F'],
14 'F': ['C']}

ͼµÄËÑË÷·½·¨ ·Ö¹ã¶ÈÓÅÏÈ ºÍÉî¶ÈÓÅÏÈ Á½ÖÖ, ÕâÊÇ×î»ù±¾µÄͼËã·¨, Ò²ÊÇͼËã·¨µÄºËÐÄ. ÆäËûµÄͼËã·¨Ò»°ã¶¼ÊÇ»ùÓÚͼËÑË÷Ëã·¨»òÊÇËüµÄÀ©³ä.

¹ã¶ÈÓÅÏÈËÑË÷ (breadth-first search)

¹ã¶ÈÓÅÏÈÊÇ×î¼òµ¥µÄͼËÑË÷Ëã·¨Ö®Ò», Ò²ÊÇÐí¶àÖØÒªµÄͼËã·¨µÄÔ­ÐÍ. ÔÚPrim×îСÉú³ÉÊ÷Ëã·¨ºÍDijkstraµ¥Ô´×î¶Ì·¾¶Ëã·¨ÖÐ, ¶¼²ÉÓÃÁËÀàËÆµÄ˼Ïë.
¹ËÃû˼Òå, ¸ø¶¨Ò»¸öÔ´¶¥µãs, ¹ã¶ÈÓÅÏÈËã·¨»áÑØÆä¹ã¶È·½ÏòÏòÍâÀ©Õ¹, ¼´ÏÈ·¢ÏÖºÍs¾àÀëΪkµÄËùÓж¥µã, È»ºó²Å·¢ÏÖºÍs¾àÀëΪk+1µÄËùÓж¥µã.

ÏÔÈ»ÕâÑùµÄËÑË÷·½Ê½, °´Õսڵ㱻·¢ÏÖµÄ˳Ðò, ×îÖÕ»áÉú³ÉÒ»¿ÃÊ÷, ³ÆÖ®Îª¹ã¶ÈÓÅÏÈÊ÷ , ÿ¸ö½ÚµãÖÁ¶à±»·¢ÏÖÒ»´Î(µÚÒ»´Î, ºóÃæÔÙ±éÀúµ½¾Í²»ËãÁË), ½öµ±½Úµã±»·¢ÏÖʱ, ËûµÄǰÇ÷½ÚµãΪËûµÄ¸¸½Úµã, ËùÒÔ¹ã¶ÈÓÅÏÈÊ÷ÓÖÐÎʽ»¯µÄ³ÆÎª¸ÃͼµÄǰÇ÷×Óͼ .

ÎÒÃÇ»¹¿ÉÒÔÖ¤Ã÷, ÔÚ¹ã¶ÈÓÅÏÈÊ÷, ÈÎÒâ½Úµãµ½Ô´¶¥µãsµÄ¾àÀë(Ê÷¸ß)ΪËûÃÇÖ®¼äµÄ×î¶Ì¾àÀë .

Õâ¸öºÜÈÝÒ×Ö¤Ã÷, ¼ÙÉèÔÚ¹ã¶ÈÓÅÏÈÊ÷Éϸýڵãnµ½sµÄ¾àÀëΪk, ¶ønµ½sµÄ×î¶Ì¾àÀëΪk-1.

ÓÉÓÚÊǹã¶ÈÓÅÏÈËÑË÷, ±ØÐëÒªÏÈ·¢ÏÖºÍs¾àÀëΪk-1µÄËùÓж¥µã, È»ºó²Å»áÈ¥·¢ÏÖºÍs¾àÀëΪkµÄ¶¥µã, ËùÒÔ²úÉúì¶Ü, ÔÚ¹ã¶ÈÓÅÏÈÊ÷ÉϾàÀëÓ¦¸ÃÊÇk-1, ¶ø²»¿ÉÄÜÊÇk, ´Ó¶øµÃÖ¤Õâ¾ÍÊÇ×î¶Ì¾àÀë.

ËùÒÔ¹ã¶ÈÓÅÏÈËã·¨¿ÉÓÃÓÚÇóͼÖÐÁ½µã¼ä(a,b)µÄÎÞȨ×î¶Ì·¾¶. ·½·¨Ê×ÏÈÒÔaΪԴÇóǰÇ÷×Óͼ(¼´¹ã¶ÈÓÅÏÈÊ÷), È»ºóÔÚÊ÷ÖÐÕÒµ½b, ²»¶ÏÇóÆäǰÇ÷, µ½aΪֹ, Öм侭¹ýµÄ½Úµã¾ÍÊÇÆä×î¶Ì·¾¶. Èç¹ûÎÞ·¨´ïµ½a, Ôòa,b¼ä²»¿É´ï.

ʵÏÖÈçÏÂ, ÔÚʵÏÖBFSË㷨ʱ, ÎÒÃÇÐèÒªÓõ½queueÊý¾Ý½á¹¹, À´´æ·ÅÈÔÐè¼ÌÐøËÑË÷µÄ½Úµã...

1 def BFS(graph, start):
2 parent = {start:None}
3 dist = {start:0}
4 queue = [start]
5
6 while queue:
7 v = queue.pop(0)
8 print v
9 e = graph[v]
10 for n in e:
11 if not parent.get(n) and not dist.get(n):
12 parent[n] = v
13 dist[n]= dist[v]+1
14 queue.append(n)
15 print n, parent[n], dist[n]
16 return parent
17
18 def shortestPath(parent, start, end):
19 if start == end:
20 print start
21 return
22 p = parent.get(end)
23 if not p:
24 print 'no path'
25 return
26 shortestPath(parent, start, p)
27 print end
28 if __name__ == "__main__":
29 graph = {'A': ['B', 'C','E'],
30 'B': ['A','C', 'D'],
31 'C': ['D'],
32 'D': ['C'],
33 'E': ['F','D'],
34 'F': ['C']}
35 p = BFS(graph,'A')
36 shortestPath(p, 'A', 'F')

Éî¶ÈÓÅÏÈËÑË÷ (Depth-first search)

Éî¶ÈÓÅÏÈËÑË÷Ëù×ñÑ­µÄËÑË÷²ßÂÔÊǾ¡¿ÉÄÜ¡°ÉµØËÑË÷ͼ¡£ÔÚÉî¶ÈÓÅÏÈËÑË÷ÖУ¬¶ÔÓÚ×îз¢ÏֵĶ¥µã£¬Èç¹ûËü»¹ÓÐÒÔ´ËΪÆðµã¶øÎ´Ì½²âµ½µÄ±ß£¬¾ÍÑØ´Ë±ß¼ÌÐøººÏÂÈ¥¡£µ±½áµãvµÄËùÓб߶¼¼º±»Ì½Ñ°¹ý£¬ËÑË÷½«»ØËÝ µ½·¢ÏÖ½áµãvÓÐÄÇÌõ±ßµÄʼ½áµã¡£ÕâÒ»¹ý³ÌÒ»Ö±½øÐе½ÒÑ·¢ÏÖ´ÓÔ´½áµã¿É´ïµÄËùÓнáµãΪֹ¡£

Éî¶ÈÓÅÏÈËÑË÷ËùÒª»Ø´ðµÄ»ù±¾ÎÊÌâÊÇ"What parts of the graph are reachable from a given vertex ", ÕâÆäʵ¾ÍÊÇÀúÊ·ÓÆ¾ÃµÄÃÔ¹¬ÎÊÌâ, ÔÚÈë¿ÚµãÊÇ·ñ¿ÉÒÔ´ïµ½³ö¿Úµã, Õâ¾ÍÊÇÉî¶ÈÓÅÏÈ×î»ù±¾µÄÓ¦ÓÃ. ¿ÆÑ§À´Ô´ÓÚÉú»î, "Everybody knows that all you need to explore a labyrinth is a ball of string and a piece of chalk.", ¶ÔÓÚÃÔ¹¬ÎÒÃDZØÐëÓз۱ʺÍÏßÍÅ , ·Û±ÊÊÇÓÃÀ´±ê¼Ç×ß¹ýµÄ·, ·ÀÖ¹ÏÝÈëcycle, ÏßÍÅÊÇÓÃÀ´×¼È·µÄ»ØËݵ½ÉÏÒ»¸ö·¿Ú.

ÄÇôÔõôÓóÌÐòÀ´Ä£Äâ·Û±ÊºÍÏßÍÅÀ´ÊµÏÖÉî¶ÈÓÅÏÈËÑË÷, ·Û±ÊºÜÈÝÒ×½â¾ö, ¶Ôÿ¸ö½ÚµãÓÃ0/1À´±íʾÊÇ·ñÒÑ·ÃÎÊ. ¶øÏßÍžÍÐèÒªÓÃstackÀ´±íʾ, push¾ÍÊÇunwind, pop¾ÍÊÇrewind, ÊDz»ÊǺÜÓÐÒâ˼. »ùÓÚÕâ¸ö˼·ÈκÎÃÔ¹¬¶¼ÊǿɽâµÄ. ¶øÍùÍùstackÒ²ÊÇÓÃÒþÐεķ½Ê½À´ÊµÏÖµÄ, ͨ¹ýº¯ÊýµÝ¹é. ÎÒÏÂÃæµÄʵÏÖ¼´¸ø³öÁ˵ݹ麯ÊýµÄʵÏÖ, Ò²¸ø³öÁËÖ±½ÓÓÃstackµÄʵÏÖ, ¸üÇåÎúµÄ¿´³öchalkµÄʹÓ÷½Ê½.

1 pre = {}
2 post = {}
3 clock = 1
4 stack = []
5 def DFS(graph):
6 global pre
7 for v in graph.keys():
8 if not pre.get(v):
9 visit_stack(graph, v)
10
11 def visit(graph, v):
12 global pre
13 global post
14 global clock
15 pre[v] = clock
16 clock = clock + 1
17 print v, pre[v]
18 edges = graph[v]
19 for e in edges:
20 if not pre.get(e):
21 visit(graph, e)
22 post[v] = clock
23 clock = clock + 1
24 print v, pre[v], post[v]
25
26 def visit_stack(graph, v):
27 """
28 use stack to replace recursion
29 """
30 global pre
31 global post
32 global clock
33 global stack
34 stack.append(v)
35 while stack:
36 print stack
37 next = stack.pop()
38 print 'pop:', next
39 while next:
40 if not pre.get(next):
41 pre[next] = clock
42 clock = clock + 1
43 print next, pre[next]
44 edges = graph.get(next)
45 vec = get_white_v(edges)
46 if vec:
47 print 'push:', next
48 stack.append(next)
49 else:
50 post[next] = clock
51 clock = clock + 1
52 print next, pre[next], post[next]
53 next = vec
54
55 def get_white_v(edges):
56 global pre
57 for e in edges:
58 if not pre.get(e):
59 return e
60 return None

ÒÀ¾ÝÉî¶ÈÓÅÏÈËÑË÷¿ÉÒÔ»ñµÃÓйØÍ¼µÄ½á¹¹µÄ´óÁ¿ÐÅÏ¢¡£Éî¶ÈÓÅÏÈËÑË÷ËùÒª½â¾öµÄ»ù±¾ÎÊÌâÊǿɴïÐÔÎÊÌâ, ¼´Á¬Í¨ÐÔÎÊÌâ, ͨ¹ýÕâ¸öËã·¨, ÎÒÃÇ¿ÉÒÔÇáËɵÄÕÒµ½ËùÓÐÁ¬Í¨×Óͼ , ¶ÔÓÚÿ¸ö×Óͼ¿ÉÒÔÉú³ÉÒ»¸öÉî¶ÈÓÅÏÈÊ÷, ´Ó¶øÉî¶ÈÓÅÏÈËÑË÷×îÖÕ²úÉúµÄÊÇÉî¶ÈÓÅÏÈÉ­ÁÖ .

³ý´ËÖ®Íâ, Éî¶ÈÓÅÏÈËÑË÷»¹Äܵõ½µÄºÜÖØÒªµÄÐÅÏ¢ÊÇ, for each node, we will note down the times of two important events, the moment of first discovery (corresponding to previsit ) and that of final departure (postvisit ). ¼´ÔÚµÚÒ»´Î·¢Ïָýڵã, ºÍÍê³É¸Ã½ÚµãËùÓÐÏàÁÚ½Úµã±éÀúʱ, ¼ÇÏÂÁ½¸öʱ¼ä´Á(ÈçÏÂͼ).

È»ºó»ùÓÚprevisitºÍpostvisit, ¾ÍÓÐһЩÓÐȤµÄÍÆÂÛ,

1. ×ÓÊ÷µÄÔ´µãÒ»¶¨ÊÇprevisit×îС, ¶øpostvisit×î´ó, ÒòΪÊǵݹé, ×îÏÈ¿ªÊ¼µÄ×îºóÍê³É.

2. ¶ÔÓÚÁ½¸ö½Úµãu,v, Èç¹û´æÔÚºóÒáºÍ׿ÏȵĹØÏµ, ÄÇÃ´×æÏÈÇø¼ä(pre(u),post(u))±Ø¶¨°üº¬ºóÒáÇø¼ä(pre(v),post(v)). Èç¹ûu,vÁ½¸öÇø¼äûÓаüº¬¹ØÏµ(ÍêÈ«·ÖÀëµÄ), ÄǾÍÒ»¶¨²»´æÔÚºóÒá׿ÏȹØÏµ.

3. ͼÖеıßÓÉ´ËÒ²¿ÉÒÔ·ÖΪ¼¸Àà,

Ê÷Ö¦ (tree)£¬ÊÇÉî¶ÈÓÅÏÈÉ­ÁÖÖеıߣ¬Èç¹û½áµãvÊÇÔÚ̽Ѱ±ß(u,v)ʱµÚÒ»´Î±»·¢ÏÖ£¬ÄÇô±ß(u,v)¾ÍÊÇÒ»¸öÊ÷Ö¦¡£

·´Ïò±ß (back)£¬ÊÇÉî¶ÈÓÅÏÈÊ÷ÖÐÁ¬½á½áµãuµ½ËüµÄ׿ÏÈvµÄÄÇЩ±ß£¬»·Ò²±»ÈÏΪÊÇ·´Ïò±ß¡£

ÕýÏò±ß (forward)£¬ÊÇÖ¸Éî¶ÈÓÅÏÈÊ÷ÖÐÁ¬½Ó¶¥µãuµ½ËüµÄºóÒáµÄ·ÇÊ÷Ö¦µÄ±ß¡£

½»²æ±ß (cross)£¬ÊÇÖ¸ËùÓÐÆäËûÀàÐ͵ıß, ¼´Á½¸ö½ÚµãµÄÇø¼äÍêÈ«·ÖÀë.

ÕâÑù¾Í¿ÉÒÔÒý³öÉî¶ÈÓÅÏÈËÑË÷µÄµÚ¶þ¸öÓ¦ÓÃ, ÓÐÏòÎÞ»·Í¼(Directed acyclic graphs, Dags)µÄÍØÆËÅÅÐòÎÊÌâ

Dags are good for modeling relations like causalities(Òò¹û¹ØÏµ), hierarchies(²ã¼¶¹ØÏµ), and temporal dependencies(ʱ¼äÒÀÀµ¹ØÏµ).

Õâ¸öÔÚÈÕ³£Éú»îÖо­³£»áÅöµ½ÕâÑùµÄÇé¿ö, Ò»¶ÑÊÂÇéÖ®¼äÓÐÒò¹û, ʱ¼ä¹ØÏµ, ÏÈ×öË­, ºó×öË­, Õâ¸ö¾ÍÊǵäÐ͵ÄÍØÆËÅÅÐòÎÊÌâ.

ÏÂÃæµÄͼ¿ÉÒÔ¸ø³öÒ»¸ö´©Ò·þµÄÀý×Ó,

ÍØÆËÅÅÐòµÄʵÏֺܼòµ¥, ÓÐÁ½ÖÖ˼·,

1. ¶ÔͼÍê³ÉÉî¶ÈÓÅÏÈËÑË÷, È»ºó°´½ÚµãµÄpostvisitµÝ¼õÅÅÁо͵õ½ÁËÍØÆËÅÅÐò.

2. µÚ¶þÖÖ˼·²»ÒÀÀµÓÚpostvisit, Ê×ÏÈÑ¡ÔñÒ»¸öÎÞǰÇýµÄ¶¥µã£¨¼´Èë¶ÈΪ0µÄ¶¥µã£¬Í¼ÖÐÖÁÉÙÓ¦ÓÐÒ»¸öÕâÑùµÄ¶¥µã£¬·ñÔò¿Ï¶¨´æÔÚ»ØÂ·£©£¬È»ºó´ÓͼÖÐÒÆÈ¥¸Ã¶¥µãÒÔ¼°ÓÉËû·¢³öµÄËùÓÐÓÐÏò±ß£¬Èç¹ûͼÖл¹´æÔÚÎÞǰÇýµÄ¶¥µã£¬ÔòÖØ¸´ÉÏÊö²Ù×÷£¬Ö±µ½²Ù×÷ÎÞ·¨½øÐС£Èç¹ûͼ²»Îª¿Õ£¬ËµÃ÷ͼÖдæÔÚ»ØÂ·£¬ÎÞ·¨½øÐÐÍØÆËÅÅÐò£»·ñÔòÒÆ³öµÄ¶¥µãµÄ˳Ðò¾ÍÊǶԸÃͼµÄÒ»¸öÍØÆËÅÅÐò¡£

Ç°ÃæÌÖÂÛµÄÎÞÏòͼµÄÁ¬Í¨ÐÔ, ¶ÔÓÚÓÐÏòͼµÄÁ¬Í¨ÐÔÎÊÌâ, ¸ü¼Ó¸´ÔÓÒ»µã, ¶ÔÓÚÓÐÏòͼ±ØÐ뻥Ïà¿É´ï, ²ÅÈÏΪÊÇÁ¬Í¨µÄ.

ÔÚÓÐÏòͼGÖУ¬Èç¹ûÈÎÒâÁ½¸ö²»Í¬µÄ¶¥µãÏ໥¿É´ï £¬Ôò³Æ¸ÃÓÐÏòͼÊÇÇ¿Á¬Í¨ µÄ¡£ÓÐÏòͼGµÄ¼«´óÇ¿Á¬Í¨×Óͼ³ÆÎªGµÄÇ¿Á¬Í¨·ÖÖ§ ¡£

°ÑÓÐÏòͼ·Ö½âΪǿÁ¬Í¨·ÖÖ§ÊÇÉî¶ÈÓÅÏÈËÑË÷µÄÒ»¸ö¾­µäÓ¦ÓÃʵÀý. ºÜ¶àÓйØÓÐÏòͼµÄËã·¨¶¼´Ó·Ö½â²½Ö迪ʼ£¬ÕâÖÖ·Ö½â¿É°ÑԭʼµÄÎÊÌâ·Ö³ÉÊý¸ö×ÓÎÊÌ⣬ÆäÖÐÿ¸ö×Ó×ÓÎÊÌâ¶ÔÓ¦Ò»¸öÇ¿Á¬Í¨·ÖÖ§¡£¹¹ÔìÇ¿Á¬Í¨·ÖÖ§Ö®¼äµÄÁªÏµÒ²¾Í°Ñ×ÓÎÊÌâµÄ½â¾ö·½·¨ÁªÏµÔÚÒ»Æð£¬ÎÒÃÇ¿ÉÒÔÓÃÒ»ÖÖ³ÆÖ®Îª·Ö֧ͼµÄͼÀ´±íʾÕâÖÖ¹¹Ôì, ¶ø·Ö֧ͼһ¶¨ÊÇdags.

ͨ¹ýÉî¶ÈÓÅÏÈËÑË÷À´°ÑÓÐÏòͼ·Ö½âΪǿÁ¬Í¨·ÖÖ§µÄ·½·¨Ò²ºÜ¼òµ¥,

procedure Strongly_Connected_Components(G);

begin

1.µ÷ÓÃDFS(G)ÒÔ¼ÆËã³öÿ¸ö½áµãuµÄÍê³Éʱ¿Ìpost[u];

2.¼ÆËã³öGT ;

3.µ÷ÓÃDFS(GT )£¬µ«ÔÚDFSµÄÖ÷Ñ­»·Àï°´Õëpost[u]µÝ¼õµÄ˳Ðò¿¼ÂǸ÷½áµã(ºÍµÚÒ»ÐÐÖÐÒ»Ñù¼ÆËã);

4.Êä³öµÚ3²½ÖвúÉúµÄÉî¶ÈÓÅÏÈÉ­ÁÖÖÐÿ¿ÃÊ÷µÄ½áµã£¬×÷Ϊ¸÷×Ô¶ÀÁ¢µÄÇ¿Á¬Í¨Ö§¡£

end;

ΪʲôÕâÑù¾Í¿ÉÒÔÕÒµ½Ç¿Á¬Í¨·ÖÖ§, ´ÓÉÏÃæµÄͼ¿ÉÖª, ͼÓëתÖÃͼµÄÇ¿Á¬Í¨·ÖÖ§ÊÇÒ»ÑùµÄ. ÏȶÔGÍê³ÉDFS, È»ºó°´postµÝ¼õµÄ˳Ðò,

ÏÖÔÚ»ùÓÚ·Ö֧ͼÀ´¿¼ÂÇ, ·Ö֧ͼÊÇdag, ËùÒÔÆäʵÇóÇ¿Á¬Í¨·ÖÖ§ºÍÍØÆËÅÅÐòµÄ˼·ÓÐЩÏàËÆ, ÏÈDFS(G), ²¢°´postµÝ¼õµÄÅÅÐò, Æäʵ¾ÍÊǰѷÖÖ§(component)½øÐÐÁËÍØÆËÅÅÐò, Èç¹ûÎÒÃÇÄܹ»ÕÒµ½µÚÒ»¸öÇ¿Á¬Í¨·ÖÖ§, °ÑËüɾ³ý, ÔÙ¼ÌÐøÍùÏÂÒ»¸ö¸ö¿ÉÒÔÕÒ³öËùÓеÄÇ¿Á¬Í¨·ÖÖ§.

ΪʲôҪ°´ÍØÆËÅÅÐòµÄ˳ÐòÕÒ, ÒòΪ·Ö֧ͼÀïÃæpost×î´óµÄÄǸö·ÖÖ§, Ö»Óгö¶ÈÎÞÈë¶È, µ±È¡Í¼µÄתÖÃͼʱ, ¾Í±ä³ÉÁËûÓгö¶È, ËùÒÔ¶ÔתÖÃͼ½øÐÐÉî¶ÈÓÅÏÈËÑË÷²»»áÕÒµ½ÆäËû·ÖÖ§µÄ½Úµã, ¿ÉÒÔ׼ȷµÄÕÒ³öÊôÓÚµÚÒ»¸öÇ¿Á¬Í¨·ÖÖ§µÄËùÓнڵã. ËùÒÔÉÏÃæËã·¨ÖÐ, ¶ÔתÖÃͼ°´postµÝ¼õ½øÐÐÉî¶ÈÓÅÏÈËÑË÷¾Í¿ÉÒÔ°´·Ö֧ͼµÄÍØÆË˳ÐòÕÒ³öËùÓÐÇ¿Á¬Í¨·ÖÖ§.

1 def transpose(graph):
2 """
3 create transposed graph
4 """
5 t_graph = {}
6
7 for key, edges in graph.items():
8 for edge in edges:
9 if not t_graph.get(edge):
10 t_graph[edge] = [key]
11 else:
12 t_graph[edge].append(key)
13 #print t_graph
14 return t_graph
15 def SCC(graph):
16 """
17 Strongly_Connected_Components
18 """
19 global post
20 global pre
21 global clock
22 DFS(graph)
23 p = post.items()
24 p.sort(key=lambda x:x[1],reverse=True)
25 print p
26 t_graph = transpose(graph)
27 post = {}
28 pre = {}
29 clock = 1
30 for v,num in p:
31 if not pre.get(v):
32 print v, '=========================='
33 visit(t_graph, v)

¹ã¶ÈºÍÉî¶ÈÓÅÏÈËÑË÷µÄÇø±ð

¶ÔÓÚÕâÁ½ÖÖËã·¨»ù±¾µÄÄ¿µÄ¶¼ÊÇÒª±éÀúËùÓнڵãÒ»´Î, ËùÒÔʱ¼ä¸´ÔÓ¶ÈÊÇÒ»ÖµÄO(V+E)

Á½ÕßÔÚʵÏÖÉÏΨһµÄÇø±ðÊÇ, BFSʹÓÃQueue, ¶øDFSʹÓÃStack, Õâ¾ÍÊÇÁ½ÕßËùÓÐÇø±ðµÄ¸ùÔ´, QueueµÄÏȽøÏȳöÌØÐÔÈ·±£ÁËÖ»ÓÐÉÏÒ»²ãµÄËùÓнڵ㶼±»·ÃÎʹý, ²Å»á¿ªÊ¼·ÃÎÊϲã½Úµã, ´Ó¶ø±£Ö¤Á˹ã¶ÈÓÅÏÈ, ¶øStackµÄÏȽøºó³öµÄÌØÐÔ, »á´ÓÒ¶½Úµã²»¶Ï»ØËÝ, ´Ó¶ø´ïµ½Éî¶ÈÓÅÏÈ.

Á½ÕßÓ¦Óó¡¾°²»Í¬, BFS±È½Ï¼òµ¥, Ö÷ÒªÓÃÓÚÇó×î¶Ì·¾¶, DFS¸´ÔÓЩ, Ö÷ÒªÓÃÓÚgraph decomposition, ¼´ÔõÑù°ÑÒ»¸öͼ·Ö½â³ÉÏ໥Á¬Í¨µÄ×Óͼ, ÆäÖаüº¬ÁËÓÐÏòͼµÄÍØÆËÅÅÐòÎÊÌâ.

   
2597 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ