Professional Documents
Culture Documents
140204-2-PTI EDC-130-PT Systems-40
140204-2-PTI EDC-130-PT Systems-40
ﺎ ﻫ
ﻲ ﺣ
ﻠ ﻋ
ﻪ
ﺍ
ﻲ
ﺎ ﻄ
ﺐ
ﻟ
١
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
٢ ۱
ﻱ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
٩ ۲
ﺎ ﻬ ﻤ ﺘ ﻳ ﺭ ﻮ ﮕ ﻟ ﺍ ﻞ ﻴ ﻠ ﺤ ﺗ
-
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ﻣﺴﺌﻠﻪ ﺍﺩﻏﺎﻡ ﺩﻭﺩﻭﻳﻲ ﻭ ﺑﻬﻴﻨﻪ ﻓﺎﻳﻠﻬﺎ)ﻳﺎ ﺁﺭﺍﻳﻪ ﻫﺎﯼ ﻣﺮﺗﺐ( ٢٢ ........................................................... -٢-٣
ﻛﺪﻳﻨﮓ ٢٤ ..................................................................................................................... Huffman -٣-٣
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Divide & Conquer ﻞ ﺣ ﻭ ﻢ ﻴ ﺴ ﻘ ﺗ ﺵ ﻭ ﺭ
-
۵
)(Dynamic Programming
٥ ٠
ﺎ ﻳ ﻮ ﭘ ﯼ ﺯ ﺎ ﺳ ﺎ ﺮ ﺑ ﺵ ﻭ ﺭ
-
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
)(Backtracking ﺩ ﺮ ﮕ ﺒ ﻘ ﻋ ﺵ ﻭ ﺭ
-
ﻣﻮﻟﺪ ﺗﺮﻛﻴﺒﺎﺕ٧٠ ............................................................................................................................ -۱-۶
ﺗﻌﻴﻴﻦ ﻧﻘﺎﻁ ﺭﻭﻱ ﻣﺤﻮﺭ xﻫﺎ ﺍﺯ ﺭﻭﻱ ﻓﻮﺍﺻﻞ ﺁﻧﻬﺎ٧٤ ....................................................................... -٣-٦
ﻧ
ﻳ ﺤ ﺗ ﻭ ﺏ ﺎ ﻌ ﺸ ﺍ ﺵ ﻭ ﺭ
-
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ﺪ
ﺕ
ﻣ ﯽ
ﺎ ﺒ ﺳ ﺎ ﺤ ﮔ ﻴ ﭽ ﻴ ﭘ
-
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
٨ ٨
ﻣ ﻣ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ﺭ ﺎ ﺘ ﻔ ﮔ ﺶ ﻴ ﭘ
ﺩﺭﺱ ﻃﺮﺍﺣﯽ ﻭ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ ﺍﺯ ﺩﺭﻭﺱ ﺍﺻﻠﯽ ﺩﻭﺭﻩ ﮐﺎﺭﺷﻨﺎﺳﯽ ﻣﻬﻨﺪﺳﯽ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻭ ﻓﻦﺁﻭﺭﯼ ﺍﻃﻼﻋﺎﺕ ﻣﺤﺴﻮﺏ
ﻣﻴﺸﻮﺩ ﮐﻪ ﻧﻘﺶ ﺑﺴﻴﺎﺭ ﺍﺳﺎﺳﯽ ﺩﺭ ﺩﺭﮎ ﻭ ﻓﻬﻢ ﺩﺭﻭﺱ ﺩﻳﮕﺮ ﺭﺍ ﻧﻴﺰ ﺑﺎﺯﯼ ﻣﻴﮑﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﺩﺭ ﺩﻭﺭﻩ ﮐﺎﺭﺷﻨﺎﺳﯽ ﺍﺭﺷﺪ ﻧﻴـﺰ
ﺩﺭﻭﺳﯽ ﻣﺒﺘﻨﯽ ﺑﺮ ﺍﻳﻦ ﺩﺭﺱ ﻭﺟﻮﺩ ﺩﺍﺭﻧﺪ ﮐﻪ ﺍﺯ ﺁﻥ ﺟﻤﻠﻪ ﻣﻴﺘﻮﺍﻥ ﺑـﻪ ﺩﺭﻭﺳـﯽ ﻧﻈﻴـﺮ ﻫﻨﺪﺳـﻪ ﻣﺤﺎﺳـﺒﺎﺗﯽ ،ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎﯼ
ﭘﻴﺸﺮﻓﺘﻪ ،ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﮊﻧﺘﻴﮏ ﻭ ﭘﺮﺩﺍﺯﺵ ﺗﮑـﺎﻣﻠﯽ ،ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎﯼ ﻃﺮﺍﺣـﯽ ﻓﻴﺰﻳﮑـﯽ ﻣـﺪﺍﺭﺍﺕ VLSIﻭ ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎﯼ
ﮔﺮﺍﻑ ﺍﺷﺎﺭﻩ ﮐﺮﺩ.
ﺩﺭ ﺍﻳﻦ ﮐﺘﺎﺏ ﺑﺎ ﺭﻭﺷﻬﺎﯼ ﻃﺮﺍﺣﯽ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ ﻭ ﺍﺻﻮﻝ ﺍﺳﺎﺳﯽ ﻭ ﻣﺒﻨـﺎﻳﻲ ﺗﺤﻠﻴـﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎ ﺁﺷـﻨﺎ ﻣﻴﺸـﻮﻳﻢ .ﻫﻤﭽﻨـﻴﻦ
ﺟﻬﺖ ﺁﺷﻨﺎﻳﻲ ﺑﺎ ﺭﻭﺷﻬﺎﯼ ﻃﺮﺍﺣﯽ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ ﻣﺜﺎﻟﻬﺎﻳﻲ ﺍﺯ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﻫﻨﺪﺳﯽ ﻧﻴﺰ ﺑﻴﺎﻥ ﺷﺪﻩ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﻣﻴﺎﻥ ﻓﺼـﻮﻝ
ﮐﺘﺎﺏ ﺑﻪ ﺁﻧﻬﺎ ﺍﺷﺎﺭﻩ ﺷﺪﻩ ﺍﺳﺖ .ﺍﻳﻦ ﮐﺘﺎﺏ ﻣﺸـﺘﻤﻞ ﺑـﺮ ۸ﻓﺼـﻞ ﺍﺳـﺖ ﮐـﻪ ﺩﺭ ﻓﺼـﻞ ۱ﻳـﺎﺩﺁﻭﺭﯼ ﻣﺨﺘﺼـﺮﯼ ﺍﺯ ﺩﺭﺱ
ﺳﺎﺧﺘﻤﺎﻥ ﺩﺍﺩﻩ ﻫﺎ ،ﺩﺭ ﻓﺼﻞ ۲ﺍﺻﻮﻝ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎ ﻭ ﻧﻤﺎﺩﻫـﺎﯼ ﻣﺠـﺎﻧﺒﯽ ،ﻓﺼـﻞ ۳ﺗـﺎ ۷ﻧﻴـﺰ ﺭﻭﺷـﻬﺎﯼ ﻃﺮﺍﺣـﯽ
ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ ﺭﺍ ﺩﺭ ﺑﺮ ﮔﺮﻓﺘﻪ ﺍﺳﺖ .ﺩﺭ ﻓﺼﻞ ﺁﺧﺮ ﻧﻴﺰ ﻣﻘﺪﻣﻪ ﺍﯼ ﺑﺮ ﺗﺌﻮﺭﯼ NPﺑﻴﺎﻥ ﺷﺪﻩ ﺍﺳﺖ.
ﺩﺭ ﺍﻳﻨﺠﺎ ﻻﺯﻡ ﻣﻴﺪﺍﻧﻢ ﮐﻪ ﺍﺯ ﺁﻗﺎﯼ ﻣﺤﻤﺪﺭﺿﺎ ﺑﺎﻗﺮﯼ ﻭ ﺧﺎﻧﻢ ﻓﺮﺯﺍﻧﻪ ﺻﺒﻮﺣﯽ ﮐـﻪ ﺩﺭ ﺟﻤـﻊ ﺁﻭﺭﯼ ﻭ ﺗﻨﻈـﻴﻢ ﺍﻭﻟﻴـﻪ ﮐﺘـﺎﺏ
ﺯﺣﻤﺎﺕ ﻓﺮﺍﻭﺍﻧﯽ ﺭﺍ ﻣﺘﺤﻤﻞ ﺷﺪﻧﺪ ﺗﺸﮑﺮ ﻧﻤﺎﻳﻢ.
۱
ﻱ
ﺗﻌﺮﻳﻒ ﺍﻟﮕﻮﺭﻳﺘﻢ :ﻫﺮ ﺩﺳﺘﻮﺍﻟﻌﻤﻠﯽ ﮐﻪ ﻣﺮﺍﺣﻞ ﻣﺨﺘﻠﻒ ﺍﻧﺠﺎﻡ ﮐﺎﺭﯼ ﺭﺍ ﺑﻪ ﺯﺑﺎﻥ ﺩﻗﻴﻖ ﻭ ﺑﺎ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﯽ ﺑﻴـﺎﻥ ﻧﻤﺎﻳـﺪ ﺑـﻪ
ﻃﻮﺭﻳﮑﻪ ﺗﺮﺗﻴﺐ ﻣﺮﺍﺣﻞ ﻭ ﺷﺮﻁ ﺧﺎﺗﻤﻪ ﻋﻤﻠﻴﺎﺕ ﺩﺭ ﺁﻥ ﮐﺎﻣﻼﹰ ﻣﺸﺨﺺ ﺑﺎﺷﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﺎﻡ ﺩﺍﺭﺩ.
١ ١
ﺎ ﻬ ﻧ ﺁ ﻭ ﯼ ﺯ ﺎ ﺳ ﺐ ﺗ ﺮ ﻣ ﯼ ﺎ ﻬ ﺷ ﻭ ﺭ ﺮ ﺑ ﯼ ﺭ ﻭ ﺮ ﻣ
- -
Insertion Sort
( )
ﺩﺭ ﻣﺮﺣﻠﻪ jﺍﻡ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﻋﻨﺎﺻﺮ ﺍﻭﻝ ﺗﺎ j-1ﺍﻡ ﺁﺭﺍﻳﻪ ﻣﺮﺗﺐ ﻫﺴﺘﻨﺪ ﻭ ﻋﻨﺼـﺮ jﺍﻡ ﺩﺭ ﻋﻨﺎﺻـﺮ
ﻗﺒﻞ ﺍﺯ ﺧﻮﺩ ﺩﺭ ﻣﺤﻞ ﻣﻨﺎﺳﺐ ﺩﺭﺝ ﻣﻴﺸﻮﺩ .ﺣﺎﻝ ﺑﻪ ﺍﺯﺍﯼ jﺍﺯ ۲ﺗﺎ nﺍﻳﻦ ﻋﻤﻞ ﺍﻧﺠﺎﻡ ﻣﻴﺸﻮﺩ.
ﻣﺮﺣﻠﻪ x[1] :١ﺧﻮﺩﺵ ﺑﻪ ﺗﻨﻬﺎﻳﻲ ﺑﻄﻮﺭ ﺑﺪﻳﻬﻲ ﻣﺮﺗﺐ ﺍﺳﺖ.
ﻣﺮﺣﻠﻪ x[2] :٢ﺭﺍ ﻳﺎ ﻗﺒﻞ ﺍﺯ ﻳﺎ ﺑﻌﺪ ﺍﺯ ] x[1ﺩﺭﺝ ﻣﻲ ﮐﻨﻴﻢ ﻃﻮﺭﻳﮑﻪ ] x[1ﻭ ] x[2ﻣﺮﺗﺐ ﺷﻮﻧﺪ.
ﻣﺮﺣﻠﻪ x[3] :٣ﺭﺍ ﺩﺭ ﻣﮑﺎﻥ ﺻﺤﻴﺢ ﺩﺭ ] x[1ﻭ] x[2ﺩﺭﺝ ﻣﻲ ﮐﻨﻴﻢ ﺑﻪ ﮔﻮﻧﻪ ﺍﻱ ﮐـﻪ ] x[3],x[2],x[1ﻣﺮﺗـﺐ ﺷـﺪﻩ
ﺑﺎﺷﻨﺪ.
...
ﻣﺮﺣﻠﻪ x[n] :nﺭﺍ ﺩﺭ ﻣﮑﺎﻥ ﺻﺤﻴﺢ ﺧﻮﺩ ﺩﺭ ] x[n-1] …,x[2], x[1ﺑﻪ ﮔﻮﻧﻪ ﺍﻱ ﺩﺭﺝ ﻣﻲ ﮐﻨﻴﻢ ﮐﻪ ﮐﻞ ﺁﺭﺍﻳﻪ ﻣﺮﺗﺐ
ﺷﺪﻩ ﺑﺎﺷﺪ.
٣ ﻳﺎﺩﺁﻭﺭﻱ
For j← 2 to n do
]k← x[j
i←j-1
while x[i]>k and i>0 do
]x[i+1] ← x[i
i ← i-1
repeat
x[i+1] ← k
repeat
ﺑﻪ ﺭﺍﺣﺘﯽ ﻗﺎﺑﻞ ﻣﻼﺣﻈﻪ ﺍﺳﺖ ﮐﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﻭﺿﻌﻴﺖ )ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳﻪ ﻧﺰﻭﻟﯽ ﺑﺎﺷﻨﺪ( ﺩﺭ ﻣﺮﺣﻠﻪ jﺍﻡ ﺑـﻪ ﺍﺯﺍﯼ
ﻋﻨﺼﺮ jﺍﻡ j-1ﻣﻘﺎﻳﺴﻪ ﺍﻧﺠﺎﻡ ﻣﻴﺪﻫﺪ ﻭ ﻟﺬﺍ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n2ﺧﻮﺍﻫﺪ ﺑـﻮﺩ! .ﻭ ﺩﺭ ﺑﻬﺘـﺮﻳﻦ ﻭﺿـﻌﻴﺖ )ﻋﻨﺎﺻـﺮ
ﺁﺭﺍﻳﻪ ﺍﺯ ﻗﺒﻞ ﺻﻌﻮﺩﯼ ﺑﺎﺷﻨﺪ( ﺩﺭ ﻣﺮﺣﻠﻪ jﺍﻡ ﺑﻪ ﺍﺯﺍﯼ ﻋﻨﺼﺮ jﺍﻡ ﻳﮏ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﻋﻨﺼﺮ j-1ﺍﻡ ﺍﻧﺠﺎﻡ ﻣﻴﺪﻫﺪ ﻭ ﻟﺬﺍ ﺩﺍﺭﺍﯼ
ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(nﺧﻮﺍﻫﺪ ﺑﻮﺩ .ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻄﻮﺭ ﻣﺘﻮﺳﻂ ﻧﻴﺰ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n2ﺧﻮﺍﻫﺪ ﺑـﻮﺩ! .ﻫﻤﭽﻨـﻴﻦ ﺍﺯ
ﻟﺤﺎﻅ ﻣﺼﺮﻑ ﺣﺎﻓﻈﻪ ﮐﻤﮑﯽ ﻧﻴﺰ ﭼﻮﻥ ﺁﺭﺍﻳﻪ ﺑﺪﻭﻥ ﻧﻴﺎﺯ ﺑﻪ ﺣﺎﻓﻈﻪ ﮐﻤﮑﯽ ﻣﺮﺗـﺐ ﻣﻴﺸـﻮﻧﺪ ﻟـﺬﺍ ﻣﻴـﺰﺍﻥ ﻣﺼـﺮﻑ ﺣﺎﻓﻈـﻪ
ﮐﻤﮑﯽ ﺑﺮﺍﺑﺮ ﺑﺎ ) O(1ﺧﻮﺍﻫﺪ ﺑﻮﺩ.
ﻧﮑﺘﻪ :ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺩﺭﺟﯽ ﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺻﻮﺭﺕ ﺩﻳﮕﺮﯼ ﺑﺎﺯﻧﻮﻳﺴﯽ ﮐﺮﺩ ﮐﻪ ﺁﻥ ﺭﺍ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺩﺭﺟﯽ ﺩﻭﺩﻭﻳـﻲ ﻣﻴﻨﺎﻣﻨـﺪ
ﮐﻪ ﺩﺭ ﺁﻥ ﻋﻤﻞ ﺟﺴﺘﺠﻮ ﺑﺮﺍﯼ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﻣﺤﻞ ﻋﻨﺼﺮ jﺍﻡ ﺗﻮﺳﻂ ﺟﺴﺘﺠﻮﯼ ﺩﻭﺩﻭﻳﻲ ﺍﻧﺠﺎﻡ ﻣﻴﺸﻮﺩ ﻭﻟﯽ ﺯﻣﺎﻥ ﺍﺟﺮﺍﯼ ﺁﻥ
ﺗﻔﺎﻭﺗﯽ ﻧﺨﻮﺍﻫﺪ ﮐﺮﺩ.
)(Merge Sort
٢ ١ ١
ﺍﮔﺮ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﺍﺯ ﺍﻋﺪﺍﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﻭ ﺍﻳﻦ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﺩﻭ ﺑﺨﺶ ﺗﻘﺴﻴﻢ ﮐﻨﻴﻢ ﻭ ﻫﺮ ﺑﺨﺶ ﺭﺍ ﺟﺪﺍﮔﺎﻧﻪ ﻣﺮﺗﺐ ﮐﻨـﻴﻢ
ﻭ ﺣﺎﺻﻞ ﺭﺍ ﺑﻪ ﮔﻮﻧﻪ ﺍﻱ ﺍﺩﻏﺎﻡ ﮐﻨﻴﻢ ﮐﻪ ﺭﻋﺎﻳﺖ ﺗﺮﺗﻴﺐ ﺷﻮﺩ ﺁﻧﮕﺎﻩ ﮐﻞ ﻣﺠﻤﻮﻋﻪ ﺍﻋﺪﺍﺩ ﻣﺮﺗﺐ ﺧﻮﺍﻫﻨﺪ ﺷﺪ.
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﻌﺪ ﺍﺯ ﺗﻘﺴﻴﻢ ﮐﺮﺩﻥ ﺩﺍﺩﻩ ﻫﺎﻱ ﺍﻭﻟﻴﻪ ﺑﻪ ﺩﻭ ﺑﺨﺶ ،ﻫﺮ ﺑﺨﺶ ﺭﺍ ﻧﻴﺰ ﺑـﻪ ﻫﻤـﻴﻦ ﺗﺮﺗﻴـﺐ ،ﻳﻌﻨـﻲ ﺗﻘﺴـﻴﻢ ﺑـﻪ
ﻣﺠﻤﻮﻋﻪ ﻫﺎﻱ ﮐﻮﭼﮑﺘﺮ ﻭ ﻣﺮﺗﺐ ﮐﺮﺩﻥ ﻭ ﺍﺩﻏﺎﻡ ﮐﺮﺩﻥ ﺁﻧﻬﺎ ﺑﺎ ﻫﻢ ﻣﺮﺗﺐ ﻣﻲ ﮐﻨﻴﻢ .ﺍﻣﺎ ﺷﮑﺴﺘﻦ ﺯﻳﺮ ﻟﻴﺴـﺖﻫـﺎ ﺭﺍ ﺗـﺎ ﭼـﻪ
ﺯﻣﺎﻧﯽ ﺍﻧﺠﺎﻡ ﻣﻲ ﺩﻫﻴﻢ؟ ﺗﺎ ﺯﻣﺎﻧﻲ ﮐﻪ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﻫﺮ ﻟﻴﺴﺖ ﺑﺮﺍﺑﺮ ﺑﺎ ﻳﮏ ﺷﻮﺩ .ﺁﻧﮕﺎﻩ ﺩﻭ ﻟﻴﺴﺖ ﮐﻮﭼﮏ ﺗﮏ ﻋﻨﺼﺮﻱ ﺭﺍ
ﺍﺩﻏﺎﻡ ﮐﺮﺩﻩ ﻭ ﺑﻪ ﺻﻮﺭﺕ ﺑﺎﺯﮔﺸﺘﻲ ﻋﻤﻞ ﻣﻲ ﮐﻨﻴﻢ ،ﻣﺮﺍﺣﻞ ﮐﺎﺭ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻪ ﺻﻮﺭﺕ ﺧﻼﺻﻪ ﺩﺭ ﺫﻳﻞ ﺁﻣﺪﻩ ﺍﺳﺖ:
ﺍﮔﺮ ﺗﻌﺪﺍﺩ ﺩﺍﺩﻩ ﻫﺎ ﻳﮑﻲ ﻳﺎ ﮐﻤﺘﺮ ﺍﺳﺖ ﻧﻴﺎﺯﻱ ﺑﻪ ﻣﺮﺗﺐ ﮐﺮﺩﻥ ﻧﻴﺴﺖ ،ﺑﺮﮔﺮﺩ.
ﺩﺭ ﻏﻴﺮﺍﻳﻨﺼﻮﺭﺕ ﻭﺳﻂ ﺩﺍﺩﻩ ﻫﺎ ﺭﺍ ﭘﻴﺪﺍ ﮐﻦ
ﻧﻴﻤﻪ ﺍﻭﻝ ﺩﺍﺩﻩ ﻫﺎ ﺭﺍ ﺑﻪ ﺭﻭﺵ ) merge Sortﻫﻤﻴﻦ ﺭﻭﺵ( ﻣﺮﺗﺐ ﮐﻦ
ﻧﻴﻤﻪ ﺩﻭﻡ ﺩﺍﺩﻩ ﻫﺎ ﺭﺍ ﺑﻪ ﺭﻭﺵ ) merge Sortﻫﻤﻴﻦ ﺭﻭﺵ( ﻣﺮﺗﺐ ﮐﻦ
ﺩﻭﻧﻴﻤﻪ ﻣﺮﺗﺐ ﺷﺪﻩ ﺭﺍ ﺑﻪ ﮔﻮﻧﻪ ﺍﻱ ﺍﺩﻏﺎﻡ ﮐﻦ ﮐﻪ ﺣﺎﺻﻞ ﻣﺮﺗﺐ ﺑﺎﺷﺪ.
)Procedure mergesort(A,l,u
If l<u then
mid ← (l+u) / 2
)Mergesort(A,l, mid
)Mergesort(A,mid+1, u
)Merge(A, l, mid, u
endif
end.
٤ ﻳﺎﺩﺁﻭﺭﻱ
n
T (n) = 2T ( ) + n
2
n n n
= 2[T ( ) + ] + n = 4T ( ) + 2n
4 2 4
n
= 8T ( ) + 3n
8
n
= 2i T ( i ) + in
2
)= 2 T (1) + n. log n = c.n + n.log n = Ο(n. log n
log n
ﺍﺯ ﺍﻳﻦ ﺭﻭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺍﺩﻏﺎﻣﯽ ﺩﺭ ﻫﻤﻪ ﺣﺎﻻﺕ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n. log nﻣﻴﺒﺎﺷﺪ .ﻫﻤﭽﻨـﻴﻦ ﺑـﺪﻟﻴﻞ
ﺑﺎﺯﮔﺸﺘﯽ ﺑﻮﺩﻥ ﺑﻪ ﺍﻧﺪﺍﺯﻩ ) O(log nﺍﺯ ﺣﺎﻓﻈﻪ ﭘﺸﺘﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻴﮑﻨﺪ .ﻭﻟﯽ ﺑـﺎ ﻋﻴـﺮ ﺑﺎﺯﮔﺸـﺘﯽ ﻧﻮﺷـﺘﻦ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﻣﻴﺘـﻮﺍﻥ
ﺣﺎﻓﻈﻪ ﻣﺼﺮﻓﯽ ﺭﺍ ﺑﻪ ) O(1ﮐﺎﻫﺶ ﺩﺍﺩ ﻭﻟﯽ ﺯﻣﺎﻥ ﻭﺍﻗﻌﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻴﺸﺘﺮ ﺧﻮﺍﻫﺪ ﺷﺪ!.
ﻧﮑﺘﻪ :ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺍﺩﻏﺎﻣﯽ ﺑﺎﺯﮔﺸﺘﯽ ﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺻﻮﺭﺗﻬﺎﯼ ﻣﺘﻔﺎﻭﺗﯽ ﺍﺯ ﺟﻤﻠﻪ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺍﺩﻏﺎﻣﯽ ﻃﺒﻴﻌﯽ (Natural
) Merge Sortﻭ ﻳﺎ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺍﺩﻏﺎﻣﯽ ﻏﻴﺮ ﺑﺎﺯﮔﺸﺘﯽ ﺑﺎﺯﻧﻮﻳﺴﯽ ﮐﺮﺩ.
)(Quick Sort
٣ ١ ١
ﺑﺮﺍﺳﺎﺱ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﻴﺰ ﻣﺠﻤﻮﻋﻪ ﺍﻋﺪﺍﺩ ﻳﺎ ﺑﻪ ﻃﻮﺭﮐﻠﻲ ﺩﺍﺩﻩ ﻫﺎ ﺑﻪ ﺩﻭ ﺑﺨﺶ ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﻫـﺮ ﺑﺨـﺶ ﺟﺪﺍﮔﺎﻧـﻪ
ﻣﺮﺗﺐ ﻣﻲ ﺷﻮﻧﺪ .ﺗﻔﺎﻭﺕ ﻫﺎﻱ ﻋﻤﺪﻩ ﺑﻴﻦ ﺭﻭﺵ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﻭ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺍﺩﻏﺎﻡ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﻫﺴﺘﻨﺪ:
ﺍﻭﻝ ﺍﻳﻨﮑﻪ ﺩﺭ ﺭﻭﺵ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺳﺮﻳﻊ ﻳﮑﻲ ﺍﺯ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ ﻋﻨﺼﺮ ﻣﺤﻮﺭﻱ ﺍﻧﺘﺨﺎﺏ ﻣﻲﮐﻨﻴﻢ ﮐﻪ ﻓﺮﻗـﻲ
ﻧﻤﻲ ﮐﻨﺪ ﮐﺪﺍﻡ ﻋﻨﺼﺮ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﺑﺎﺷﺪ.
ﺩﻭﻡ ﺍﻳﻨﮑﻪ ﻣﺠﻤﻮﻋﻪ ﺩﺭﻭﺍﻗﻊ ﺑﻪ ﺳﻪ ﻗﺴﻤﺖ ﺷﮑﺴﺘﻪ ﻣـﻲ ﺷـﻮﺩ ﺍﻟـﻒ( ﻋﻨﺼـﺮ ﻣﺤـﻮﺭﻱ ﺏ( ﻋﻨﺼـﺮ ﮐـﻮﭼﮑﺘﺮ ﺍﺯ ﻋﻨﺼـﺮ
ﻣﺤﻮﺭﻱ ﺝ( ﻋﻨﺎﺻﺮ ﺑﺰﺭﮔﺘﺮ ﺍﺯ ﻋﻨﺼﺮ ﻣﺤﻮﺭﻱ
ﺳﻮﻡ ﺍﻳﻨﮑﻪ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻣﺤﻞ ﻋﻨﺼﺮ ﻣﺤﻮﺭﻱ ﺩﺭ ﺁﺭﺍﻳﻪ ﺛﺎﺑﺖ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﻭﺍﻗﻊ ﻣﮑﺎﻧﺶ ﭘﻴﺪﺍ ﻣﻲ ﺷﻮﺩ ﻭ ﭼﻬﺎﺭﻡ ﺍﻳﻨﮑـﻪ
ﺍﺣﺘﻴﺎﺟﻲ ﺑﻪ ﺍﺩﻏﺎﻡ ﻫﺮ ﻣﺠﻤﻮﻋﻪ ﻧﻴﺴﺖ .ﺑﻠﮑﻪ ﺩﺭ ﺣﻘﻴﻘﺖ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﺍﺟﺮﺍﺀ ﻣﺤﻞ ﻳﮏ ﻋﻀﻮ ﺍﺯ ﺁﺭﺍﻳﻪ ﺛﺎﺑﺖ ﻣـﻲ ﺷـﻮﺩ.
)ﻫﻤﺎﻥ ﻋﻀﻮ ﻣﺤﻮﺭﻱ(
ﺑﻌﺪ ﺍﺯ ﻳﺎﻓﺘﻦ ﻣﺤﻞ ﺛﺎﺑﺖ ﻋﻀﻮ ﻣﺤﻮﺭﻱ ) (Partition Phaseﻫﺮ ﻳﮏ ﺍﺯ ﺩﻭ ﺑﺨﺶ ﺩﻳﮕﺮ ﻧﻴﺰ ﺑﻪ ﺭﻭﺵ ﻓﻮﻕ ﺑﻪ ﺻﻮﺭﺕ
ﺑﺎﺯﮔﺸﺘﯽ ﻣﺮﺗﺐ ﻣﻲ ﺷﻮﻧﺪ).(Recursion Phase
ﺑﻪ ﺭﺍﺣﺘﯽ ﻗﺎﺑﻞ ﻣﻼﺣﻈﻪ ﺍﺳﺖ ﮐﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﻭﺿﻌﻴﺖ )ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳﻪ ﺍﺯ ﻗﺒﻞ ﻣﺮﺗﺐ ﺑﺎﺷﻨﺪ( ﺩﺭ ﻫـﺮ ﻣﺮﺣﻠـﻪ
ﻟﻴﺴﺖ ﺭﺍ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺑﺎ ﺍﻧﺪﺍﺯﻩ ﻫﺎﯼ ﮐﺎﻣﻼﹰ ﺩﻭﺭ ﺍﺯ ﻫﻢ ﺗﻘﺴﻴﻢ ﻣﻴﮑﻨﺪ ﻭ ﻟﺬﺍ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n2ﺧﻮﺍﻫﺪ ﺑـﻮﺩ! .ﻭ
ﺩﺭ ﺑﻬﺘﺮﻳﻦ ﻭﺿﻌﻴﺖ )ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳﻪ ﺑﻪ ﮔﻮﻧﻪﺍﯼ ﺑﺎﺷﻨﺪ ﮐﻪ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻋﻨﺼﺮ ﻣﻴﺎﻧﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﻗﻠﻢ ﻣﺤﻮﺭﯼ ﺍﻧﺘﺨﺎﺏ ﺷﻮﺩ(
ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻟﻴﺴﺖ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺑﺎ ﺍﻧﺪﺍﺯﻩ ﻧﺰﺩﻳﮏ ﺑﻪ ﻫﻢ ﺗﻘﺴﻴﻢ ﻣﻴﺸـﻮﺩ ﻭ ﻟـﺬﺍ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒـﻪ ﺯﻣـﺎﻧﯽ )O(n. log n
ﺧﻮﺍﻫﺪ ﺑﻮﺩ! .ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻄﻮﺭ ﻣﺘﻮﺳﻂ ﻧﻴﺰ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n. log nﺧﻮﺍﻫﺪ ﺑﻮﺩ! .ﻫﻤﭽﻨﻴﻦ ﺍﺯ ﻟﺤﺎﻅ ﻣﺼﺮﻑ
ﺣﺎﻓﻈﻪ ﮐﻤﮑﯽ ﻧﻴﺰ ﺑﻪ ﺩﻟﻴﻞ ﺑﺎﺯﮔﺸﺘﯽ ﺑﻮﺩﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ ﺑﺮﺍﺑـﺮ ﺑـﺎ ) O(nﻭ ﺩﺭ ﺑﻬﺘـﺮﻳﻦ ﺣﺎﻟـﺖ ﻭ ﺣﺎﻟـﺖ
ﻣﺘﻮﺳﻂ ﺑﺮﺍﺑﺮ ﺑﺎ ) O(log nﺧﻮﺍﻫﺪ ﺑﻮﺩ.
٥ ﻳﺎﺩﺁﻭﺭﻱ
)(Heap Sort
٤ ١ ١
ﻩ
ﺗ ﺐ ﺗ ﺮ ﻣ
ﮐﻪ ﺩﺭ ﺁﻥ iﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﺳﻄﺢ ﮔﺮﻩ ﻫﺎﯼ ﺩﺭﺧﺖ k ،ﺑﺮﺍﺑﺮ ﺑﺎ ﻋﻤﻖ ﺩﺭﺧﺖ ) ( log (n + 1)ﻣﻴﺒﺎﺷﺪ .ﻭﺍﺿﺢ ﺍﺳـﺖ ﮐـﻪ
ﺗﻌﺪﺍﺩ ﮔﺮﻩ ﻫﺎﯼ ﺳﻄﺢ iﺍﻡ ﺩﺭﺧﺖ ﺣﺪﺍﮐﺜﺮ ﺑﺮﺍﺑﺮ ﺑﺎ 2i-1ﻣﻴﺒﺎﺷﺪ .ﺩﺭ ﻣﺮﺗﺐﺳﺎﺯﻱ ﺗﻮﺩﻩﺍﯼ ﺍﺑﺘﺪﺍ ﻟﻴﺴﺖ ﻳﺎ ﺁﺭﺍﻳﻪ ﺭﺍ ﺑﻪ ﻳﮏ
Heapﺗﺒﺪﻳﻞ ﻣﻴﮑﻨﻴﻢ )ﺑﻪ ﮐﻤﮏ ﺍﻟﮕﻮﺭﻳﺘﻢ (Heapifyﻭ ﺳﭙﺲ ﺑﻌﺪ ﺍﺯ Heapﺷﺪﻥ ﻟﻴﺴﺖ ﻋﻨﺎﺻﺮ ﺳﺮ ﺩﺭﺧﺖ )ﻋﻨﺼـﺮ
ﻣﺎﮐﺰﻳﻤﻢ( ﺭﺍ ﺑﺎ ﻋﻨﺼﺮ ﺍﻧﺘﻬﺎﯼ ﻟﻴﺴﺖ ﺟﺎﺑﻪﺟﺎ ﮐﺮﺩﻩ ﻭ ﺩﻭﺑﺎﺭﻩ ﺑﺪﻭﻥ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻋﻨﺼﺮ ﺟﺎﺑﻪﺟﺎ ﺷﺪﻩ )ﺩﺭ ﺍﻧﺘﻬﺎ( ﺩﺭﺧـﺖ
ﺭﺍ ﺑﺎ ﮐﻤﮏ ﺍﻟﮕﻮﺭﻳﺘﻢ adjustﺑﻪ ﻳﮏ Heapﺗﺒﺪﻳﻞ ﻣﻴﮑﻨﻴﻢ .ﺍﻳﻦ ﻋﻤﻞ n-1ﺑﺎﺭ ﺻﻮﺭﺕ ﻣﻴﮕﻴﺮﺩ ﻭ ﺑﻪ ﺍﻳﻦ ﺗﺮﺗﻴﺐ ﻋﻨﺎﺻﺮ
ﺍﺯ ﺑﻴﺸﻴﻨﻪ ﺑﻪ ﮐﻤﻴﻨﻪ ﺍﺯ ﺍﻧﺘﻬﺎﯼ ﺁﺭﺍﻳﻪ ﺑﻪ ﺳﻤﺖ ﺍﺑﺘﺪﺍﯼ ﺁﺭﺍﻳﻪ ﭼﻴﺪﻩ ﺧﻮﺍﻫﺪ ﺷﺪ.
ﺑﺮﺍﻱ ﻣﺮﺗﺐﺳﺎﺯﻱ ﻟﻴﺴﺖ ،ﺍﺑﺘﺪﺍ ﻳﻚ heapﺑﺰﺭﮒ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻓﺮﺧﻮﺍﻧﻲ ﻣﺘﻮﺍﻟﻲ adjustﺍﻳﺠﺎﺩ ﻣﻲﻛﻨـﻴﻢ ﻭ ﺳـﭙﺲ n-1
ﮔﺬﺭ ﺭﻭﻱ ﻟﻴﺴﺖ ﺩﺍﺭﻳﻢ .ﺩﺭ ﻫﺮﮔﺬﺭ ﺍﻭﻟﻴﻦ ﺭﻛﻮﺭﺩ heapﺭﺍ ﺑﺎ ﺁﺧﺮﻳﻦ ﺭﻛﻮﺭﺩ ﺗﻌﻮﻳﺾ ﻣـﻲﻛﻨـﻴﻢ .ﭼـﻮﻥ ﺍﻭﻟـﻴﻦ ﺭﻛـﻮﺭﺩ
ﺷﺎﻣﻞ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻛﻠﻴﺪ ﺍﺳﺖ ،ﺍﻳﻦ ﺭﻛﻮﺭﺩ ﺍﻛﻨﻮﻥ ﺩﺭ ﻣﻮﻗﻌﻴﺖ ﻣﺮﺗﺐ ﺷﺪﻥ ﺧـﻮﺩﺵ ﺍﺳـﺖ ﭘـﺲﺍﻧـﺪﺍﺯﻩ heapﺭﺍ ﻛـﺎﻫﺶ
ﻣﻲﺩﻫﻴﻢ ﻭ ﺩﻭﺑﺎﺭﻩ ﺁﻥ ﺭﺍ ﺗﺮﺍﺯ ﻣﻲﻛﻨﻴﻢ ،ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺜﺎﻝ ،ﺩﺭ ﺍﻭﻟﻴﻦ ﮔﺬﺭ ،ﺭﻛﻮﺭﺩﻱ ﺑﺎ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻛﻠﻴـﺪ ﺭﺍ ﺩﺭ nﺍﹸﻣـﻴﻦ ﻣﺤـﻞ
ﻣﻲﮔﺬﺍﺭﻳﻢ ،ﺩﺭ ﮔﺬﺭ ﺩﻭﻡ ﺭﻛﻮﺭﺩﻱ ﺑﺎ ﺩﻭﻣﻴﻦ ﻛﻠﻴﺪ ﺑﺰﺭﮔﻲ ﺭﺍ ﺩﺭ ﻣﺤﻞ n-1ﻣﻲﮔﺬﺍﺭﻳﻢ ﻭ iﺍﹸﻣﻴﻦ ﮔﺬﺭ ﺭﻛﻮﺭﺩﻱ ﺑﺎ iﺍﹸﻣـﻴﻦ
ﻛﻠﻴﺪ ﺑﺰﺭﮔﻲ ﺭﺍ ﺩﺭ ﻣﺤﻞ n-i+1ﻣﻲﮔﺬﺍﺭﻳﻢ.
ﺍﺯ ﺍﻳﻦ ﺭﻭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺗﻮﺩﻩﺍﯼ ﺩﺭ ﻫﻤﻪ ﺣﺎﻻﺕ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n. log nﻣﻴﺒﺎﺷﺪ! .ﻫﻤﭽﻨـﻴﻦ ﺑـﺪﻟﻴﻞ
ﻏﻴﺮ ﺑﺎﺯﮔﺸﺘﯽ ﺑﻮﺩﻥ ﺩﺍﺭﺍﯼ ﺣﺎﻓﻈﻪ ﻣﺼﺮﻓﯽ ) O(1ﺧﻮﺍﻫﺪ ﺑﻮﺩ.
٢ ١
- -
ﻢ ﻤ
)(Kruskal
ﻝ
ﺎ ﺷ
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺩﺭﺧﺖ ﭘﻮﺷﺎﻱ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ،Tﻟﺒﻪ ﺑﻪ ﻟﺒﻪ ﺳﺎﺧﺘﻪ ﻣﻲ ﺷﻮﺩ .ﻟﺒﻪ ﻫﺎﻱ ﻣـﻮﺭﺩ ﺍﺳـﺘﻔﺎﺩﻩ ﺩﺭ ،Tﺑـﻪ ﺗﺮﺗﻴـﺐ
ﺻﻌﻮﺩﻱ ﻭﺯﻧﻬﺎ ﻣﻲ ﺑﺎﺷﺪ .ﻳﮏ ﻟﺒﻪ ﺩﺭ Tﺧﻮﺍﻫﺪ ﺑﻮﺩ ،ﺍﮔﺮ ﺑﺎ ﻟﺒﻪ ﻫﺎﻱ ﻗﺒﻞ ﮐﻪ ﺩﺭ Tﺑﻮﺩﻩ ﺍﻧﺪ ﺗﺸﮑﻴﻞ ﺣﻠﻘﻪ ﻧﺪﻫﺪ.
٧ ﻳﺎﺩﺁﻭﺭﻱ
)(Prim
٢ ٢ ١
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺩﺭﺧﺖ ﭘﻮﺷﺎﻱ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ، Tﺭﺍﺱ ﺑﻪ ﺭﺍﺱ ﺑﻪ Tﮐﻪ ﺩﺭ ﺍﺑﺘﺪﺍ ﺷﺎﻣﻞ ﻳﮑﯽ ﺍﺯ ﺭﺋـﻮﺱ )ﺑـﻪ ﺩﻟﺨـﻮﺍﻩ(
ﺍﺳﺖ ،ﺍﺿﺎﻓﻪ ﻣﻴﺸﻮﻧﺪ .ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻳﺎﻝ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﮐﻪ ﻳﮏ ﺭﺍﺱ ﻣﺠﺎﻭﺭ ﺁﻥ ﺩﺍﺧـﻞ Tﻭ ﺭﺍﺱ ﻣﺠـﺎﻭﺭ ﺩﻳﮕـﺮﺵ
ﺧﺎﺭﺝ ﺍﺯ Tﺑﺎﺷﺪ ﺑﻪ ﺩﺭﺧﺖ ﺍﺿﺎﻓﻪ ﻣﻴﺸﻮﺩ.
ﺩﻭ ﺍﻟﮕﺮﻳﺘﻢ ﺑﺎﻻ ﺑﻪ ﻃﻮﺭ ﮐﺎﻣﻞ ﺩﺭ ﻓﺼﻞ ﻣﺮﺑﻮﻁ ﺑﻪ ﺭﻭﺵ ﻃﺮﺍﺣﯽ ﺣﺮﻳﺼﺎﻧﻪ ﺷﺮﺡ ﺩﺍﺩﻩ ﺧﻮﺍﻫﻨﺪ ﺷﺪ.
ﻑ ﺍ
٣ ١
ﺎ ﻫ ﺮ ﯼ ﻮ ﺠ ﺘ ﺴ ﺟ ﻭ ﺶ ﻳ ﺎ
- -
ﻤ
DFS
( )
ﻘ
ﺶ
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﭘﻴﻤﺎﻳﺶ ﮔﺮﻩ ﻫﺎ ﺩﺭ ﺍﻣﺘﺪﺍﺩ ﻳﮏ ﺷﺎﺧﻪ ﺗﺎ ﺍﻧﺘﻬﺎﻱ ﺁﻥ ﺍﺩﺍﻣﻪ ﭘﻴﺪﺍ ﻣﻲ ﮐﻨﺪ ﻭ ﺑﺎ ﭘﺎﻳﺎﻥ ﻳﺎﻓﺘﻦ ﺷﺎﺧﻪﻫﺎ ﻳﮏ ﻣﺮﺣﻠﻪ
ﺑﻪ ﻋﻘﺐ ﺑﺮﮔﺸﺖ ﮐﺮﺩﻩ ﻭ ﻣﺠﺪﺩﺍﹰ ﺑﺮﺭﺳﯽ ﻣﻴﮑﻨﻴﻢ .ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﺎ ﻣﺸﺎﻫﺪﻩ ﻳﮏ ﮔﺮﻩ ﺟﺪﻳﺪ ،ﭘﻴﻤﺎﻳﺶ ﺳﺎﻳﺮ ﻓﺮﺯﻧﺪﺍﻥ ﮔـﺮﻩ
ﻗﺒﻠﻲ ﺑﻪ ﺗﻌﻮﻳﻖ ﺍﻓﺘﺎﺩﻩ ﻭ ﮔﺮﻩ ﺟﺪﻳﺪ ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﺩ .ﺩﺭ ﻭﺍﻗﻊ ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﺎ ﮔﺬﺭ ﺍﺯ ﻫﺮ ﮔﺮﻩ ﺑﻪ ﺳﻤﺖ ﻋﻤـﻖ ﺩﺭﺧـﺖ
ﮔﺮﻩ ﻓﻌﻠﯽ ﺩﺭ ﭘﺸﺘﻪ ﻗﺮﺍﺭ ﺩﺍﺩﻩ ﻣﻴﺸﻮﺩ ﮐﻪ ﺑﺎ ﺑﺎﺯﮔﺸﺘﯽ ﻃﺮﺍﺣﯽ ﮐﺮﺩﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ ﭘﺸﺘﻪ ﻣﻮﺭﺩ ﻧﻈﺮ ﺑﻪ ﺻـﻮﺭﺕ ﭘﻨﻬـﺎﻥ ﺳـﺎﺧﺘﻪ
ﺧﻮﺍﻫﺪ ﺷﺪ.
)Procedure DFS(v
)Visit(v
For each vertex w adjacent to v do
If not visited w then
)DFS( w
Endif
repeat
end
ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﻭﺿﻌﻴﺖ )ﮔﺮﺍﻑ ﻫﻤﺒﻨﺪ ﺑﺎﺷﺪ( ﻫﺮ ﻳﺎﻝ ﺣﺪﺍﮐﺜﺮ ﺩﻭ ﺑﺎﺭ ﭘﻴﻤﻮﺩﻩ ﻣﻴﺸـﻮﺩ )!( ﻭ ﻫـﺮ ﺭﺍﺱ ﻧﻴـﺰ
ﻳﮑﺒﺎﺭ ﻣﻼﻗﺎﺕ ﻣﻴﺸﻮﺩ ﻭ ﻟﺬﺍ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ) O(n+eﺍﺳﺖ.
(BFS
)
ﺶ
ﺍﮔﺮ ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻗﺒﻠﯽ ﺑﻪ ﺟﺎﯼ ﭘﺸﺘﻪ ﻳﮏ ﺻﻒ ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﻢ ﺑﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺟﺪﻳﺪﯼ ﺧﻮﺍﻫﻴﻢ ﺭﺳﻴﺪ ﮐﻪ BFSﻧـﺎﻡ ﺩﺍﺭﺩ.
ﺑﺮﺍﻱ ﭘﻴﻤﺎﻳﺶ ﮐﻠﻴﻪ ﮔﺮﻩ ﻫﺎ ﮔﺮﻩ ﺁﻏﺎﺯ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻲ ﮐﻨﻴﻢ .ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﻌﺪ ﺍﺯ ﺩﻳﺪﻥ ﻫﺮﮔﺮﻩ ﮐﻠﻴﻪ ﻓﺮﺯﻧـﺪﺍﻥ ﻫﻤـﺎﻥ ﮔـﺮﻩ
ﻣﻼﻗﺎﺕ ﺷﺪﻩ ﻭ ﺳﭙﺲ ﻓﺮﺯﻧﺪﺍﻥ ﺍﻭﻟﻴﻦ ﻓﺮﺯﻧﺪ ﮔﺮﻩ ﺍﺻﻠﻲ ﻭ ﺑﻌﺪ ﻓﺮﺯﻧﺪﺍﻥ ﺩﻭﻣﻴﻦ ﻓﺮﺯﻧﺪ ﮔﺮﻩ ﺍﺻﻠﻲ ﻭ ﺗﺎ ﺍﻧﺘﻬﺎ ﭘﻴﺶ ﻣﻲ ﺭﻭﺩ.
٨ ﻳﺎﺩﺁﻭﺭﻱ
ﺑﻨﺎﺑﺮﺍﻳﻦ ﺭﻭﺵ ﮐﺎﺭ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﻧﺨﺴﺖ ﺩﻭﻣﻴﻦ ﮔﺮﻩ ﺭﺍ ﻣﻼﻗﺎﺕ ﻣﻲ ﮐﻨﻴﻢ ﻭ ﺳﭙﺲ ﮐﻠﻴﻪ ﻓﺮﺯﻧﺪﺍﻥ ﺁﻥ ﺭﺍ ﻣﻼﻗـﺎﺕ ﮐـﺮﺩﻩ ﻭ
ﺩﺭ ﺍﻧﺘﻬﺎﯼ ﺻﻒ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﻴﻢ ﻭ ﺳﭙﺲ ﺍﺯ ﺩﺍﺧﻞ ﺻﻒ ،ﺍﻭﻟﻴﻦ ﮔﺮﻩ ﺭﺍ ﺑﺮﺩﺍﺷـﺘﻪ ﻭ ﻓﺮﺯﻧـﺪﺍﻥ ﺁﻥ ﺭﺍ ﻣﻼﻗـﺎﺕ ﮐـﺮﺩﻩ ﻭ ﺑـﻪ
ﺍﻧﺘﻬﺎﻱ ﺻﻒ ﻣﻲ ﺍﻓﺰﺍﻳﻴﻢ.
)Procedure BFS(v
)Visit(v
)AddQueue(v
While Queue is not empty do
)DeleteQueue(v
For each w adjacent to v do
If not visited w then
)Visit(w
)AddQueue(w
Endif
Repeat
Repeat
end
ﻃﺒﻖ ﺩﻟﻴﻞ ﻣﻄﺮﺡ ﺷﺪﻩ ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ DFSﻟﺬﺍ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﻴﺰ ) O(n+eﺍﺳﺖ.
ﺗﻮﺳﻂ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ DFSﻭ BFSﻣﻴﺘﻮﺍﻥ ﻳﮏ ﮔﺮﺍﻑ ﻏﻴﺮ ﻫﻤﺒﻨﺪ ﺭﺍ ﻧﻴﺰ ﭘﻴﻤﺎﻳﺶ ﮐﺮﺩ .ﺑﻪ ﺍﻳﻦ ﺻـﻮﺭﺕ ﮐـﻪ ﻫـﺮ ﺑـﺎﺭ ﺍﺯ
ﻳﮏ ﮔﺮﻩ ﻣﻼﻗﺎﺕ ﻧﺸﺪﻩ ﺷﺮﻭﻉ ﮐﺮﺩﻩ ﻭ ﺁﻥ ﺭﺍ DFSﻳﺎ BFSﻣﻴﮑﻨﻴﻢ ﻭ ﻟﺬﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﻳﻲ ﻣﺒﺘﻨـﯽ ﺑـﺮ ﭘﻴﻤـﺎﻳﺶ
ﻋﻤﻘﯽ ﻳﺎ ﺭﺩﻳﻔﯽ ﺭﺳﻴﺪ.
۲
ﺎ ﻬ ﻤ ﺘ ﻳ ﺭ ﻮ ﮕ ﻟ ﺍ ﻞ ﻴ ﻠ ﺤ ﺗ -
ﺩﺭ ﺍﻳﻦ ﺑﺨﺶ ﺑﻪ ﺗﻌﺮﻳﻒ ﻧﻤﺎﺩﻫﺎﯼ ﻣﺠﺎﻧﺒﯽ ﻣﻮﺭﺩ ﻧﻴﺎﺯ ﺩﺭ ﺗﺤﻠﻴـﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬـﺎ ﻭ ﺑﻴـﺎﻥ ﭼﻨـﺪ ﻗﻀـﻴﻪ ﻗﻀـﻴﻪ ﺩﺭ ﻣـﻮﺭﺩ ﺁﻥ
ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
۱ ۲
ﻧ ﺎ ﺠ ﻣ ﯼ ﺎ ﻫ ﺩ ﺎ ﻧ
- -
ﻤ
ﯽ ﺒ
ﺗﻌﺮﻳﻒ f(n)∈O(g(n)) :ﺍﮔﺮ ﻭ ﻓﻘﻂ ﺍﮔﺮ ﺛﺎﺑﺖ cﻭ ﺛﺎﺑﺖ noﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﮐﻪ ﺑﺮﺍﻱ ﻫﻤﻪ ﻣﻘﺎﺩﻳﺮ ، n ≥ noﺩﺍﺷﺘﻪ
ﺑﺎﺷﻴﻢ.
)∀ n ≥ n0 : f (n) ≤ c g (n
f ( n ) ∈ Ω g ( n )
ﺍﮔﺮ ﻭ ﻓﻘﻂ ﺍﮔﺮ ﺛﺎﺑﺖ cﻭ ﺛﺎﺑﺖ ﺻﺤﻴﺢ noﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ﮐﻪ: ﺗﻌﺮﻳﻒ:
f ( n ) ∈ θ g ( n )
ﺍﮔﺮ ﻭ ﻓﻘﻂ ﺍﮔﺮ ﺛﺎﺑﺘﻬﺎﻱ c1ﻭ c 2ﻭ ﺛﺎﺑﺖ ﺻﺤﻴﺢ noﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ﺑﻪ ﮔﻮﻧﻪ ﺍﻱ ﮐﻪ ﺑـﺮﺍﻱ ﺗﻌﺮﻳﻒ:
) Ο ( n m
) if f (n) = am n m + L + a1n + a0 then f (n) = Ω(n m
) Θ(n m
ﻗﻀﻴﻪ ):(٢
ﻗﻀﻴﻪ ):(٣
)) f (n) = O( g (n
f (n) = Θ( g (n)) ⇔
)) f (n) = Ω( g (n
ﺗﻌﺮﻳﻒ f(n)∈o(g(n)) :ﺍﮔﺮ ﻭ ﻓﻘﻂ ﺍﮔﺮ ﺛﺎﺑﺖ cﻭ ﺛﺎﺑﺖ noﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﮐﻪ ﺑﺮﺍﻱ ﻫﻤﻪ ﻣﻘﺎﺩﻳﺮ ، n ≥ noﺩﺍﺷـﺘﻪ
ﺑﺎﺷﻴﻢ:
| )∀n ≥ n0 :| f (n) | < c. | g (n
ﻧﻤﺎﺩ oﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﮔﻮﻧﻪ ﺩﻳﮕﺮﯼ ﻧﻴﺰ ﺗﻌﺮﻳﻒ ﮐﺮﺩ:
)f ( n
∞→f (n) = ο ( g (n)) ⇔ lim n =0
)g ( n
ﻣﺜﺎﻝ:
n
)= ο ( n
log n
ﺗﻌﺮﻳﻒ f(n)∈ω(g(n)) :ﺍﮔﺮ ﻭ ﻓﻘﻂ ﺍﮔﺮ ﺛﺎﺑﺖ cﻭ ﺛﺎﺑﺖ noﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﮐﻪ ﺑﺮﺍﻱ ﻫﻤﻪ ﻣﻘﺎﺩﻳﺮ ، n ≥ noﺩﺍﺷـﺘﻪ
ﺑﺎﺷﻴﻢ:
| )∀n ≥ n0 :| f (n) | > c. | g (n
ﻧﻤﺎﺩ ωﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﮔﻮﻧﻪ ﺩﻳﮕﺮﯼ ﻧﻴﺰ ﺗﻌﺮﻳﻒ ﮐﺮﺩ:
)f ( n
∞→f (n) = ω ( g (n)) ⇔ lim n ∞=
)g ( n
ﻧﮑﺘﻪ :ﻣﻘﺎﻳﺴﻪ ﻧﻤﺎﺩﻫﺎﯼ ﻣﺠﺎﻧﺒﯽ ﺩﻭ ﺗﺎﺑﻊ fﻭ gﺭﺍ ﺑﺎ ﺩﻭ ﻋﺪﺩ ﺣﻘﻴﻘﯽ aﻭ bﻣﻴﺘﻮﺍﻥ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﺑﻴﺎﻥ ﮐﺮﺩ:
f (n) = Ο( g (n)) ≈ a ≤ b
f (n) = ο ( g (n)) ≈ a < b
f (n) = Ω( g (n)) ≈ a ≥ b
))f (n) = ω ( g (n ≈ a>b
f (n) = Θ( g (n)) ≈ a = b
ﻧﮑﺘﻪ:
) 2 n ≠ Ο( 2 n
١١ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
ﺍ ﻂ
۲ ۲
ﺘ ﻳ ﺭ ﻮ ﮕ ﻟ ﺳ ﻮ ﺘ ﻣ ﻟ ﺎ ﺣ ﻞ ﺗ
- -
ﻢ
ﺗﺤﻠﻴﻞ ﺣﺎﻟﺖ ﻣﺘﻮﺳﻂ ﻳﮏ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺍﺭﺍﯼ ﺍﻫﻤﻴﺖ ﺑﻴﺸﺘﺮﯼ ﻧﺴﺒﺖ ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ ﻭ ﺑﻬﺘـﺮﻳﻦ ﺣﺎﻟـﺖ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﻣﻴﺒﺎﺷـﺪ.
ﺍﮔﺮ ﺗﻌﺪﺍﺩ ﺗﮑﺮﺍﺭ ﻳﮏ ﺩﺳﺘﻮﺭﺍﻟﻌﻤﻞ ﺩﺭ ﻳﮏ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎ nﻭﺭﻭﺩﯼ ﺭﺍ ﺩﺭ ﺣﺎﻟﺖ ﻣﺘﻮﺳﻂ ﺑﺎ ) A(nﻧﺸﺎﻥ ﺩﻫﻴﻢ ﺁﻧﮕﺎﻩ ﻳـﮏ
ﺭﺍﺑﻄﻪ ﺳﺎﺩﻩ ﺟﻬﺖ ﺑﺪﺳﺖ ﺁﻭﺭﺩﻥ ﺣﺎﻟﺖ ﻣﺘﻮﺳﻂ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﻣﻴﺒﺎﺷﺪ:
) A(n) = ∑ P(i ).F (i
i∈S
ﮐﻪ ﺩﺭ ﺁﻥ Sﻣﺠﻤﻮﻋﻪ ﺣﺎﻻﺕ ﻣﻤﮑﻨﻪ P(i) ،ﺍﺣﺘﻤﺎﻝ ﺭﺥ ﺩﺍﺩﻥ ﺣﺎﻟﺖ iﺍﻡ ﻭ ) F(iﺗﻌﺪﺍﺩ ﺗﮑـﺮﺍﺭ ﺩﺳـﺘﻮﺭ ﻣـﻮﺭﺩ ﻧﻈـﺮ ﺩﺭ
ﺣﺎﻟﺖ iﺍﻡ ﻣﻴﺒﺎﺷﺪ.
ﻣﺜﺎﻝ :ﻣﺘﻮﺳﻂ ﺗﻌﺪﺍﺩ ﺗﻜﺮﺍﺭ ﺩﺳﺘﻮﺭﺍﻟﻌﻤﻞ )*( ﺭﺍ ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﺑﺪﺳﺖ ﺁﻭﺭﻳﺪ:
)Procedure max (A,n,j
j 1
for i2 to n do
if A(i) > A(j) then
ji )*(
endif
repeat
end.
ﺗﻌﺪﺍﺩ ﺗﻜﺮﺍﺭ ﺩﺳﺘﻮﺭ* ﺩﺭ ﻳﻚ ﺁﺭﺍﻳﻪ nﺗﺎﻳﻲ ﺭﺍ ﺑﻄﻮﺭ ﻣﺘﻮﺳﻂ ﺑﺮﺍﺑﺮ ﺑﺎ Anﺩﺭ ﻧﻈﺮ ﻣﻴﮕﻴﺮﻳﻢ ﻭ ﻟﺬﺍ:
0 ≤ An < n − 1
ﺗﻌﺪﺍﺩ ﺗﻜﺮﺍﺭ ﺩﺳﺘﻮﺭ )*( ﺩﺭ ﺍﻳﻦ ﺯﻳﺮﺑﺮﻧﺎﻣﻪ ﺩﺭ ﺻﻮﺭﺗﻲ ﺻﻔﺮ ﺍﺳﺖ ﻛﻪ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻋﻨﺼﺮ ﺩﺭ ﺍﺑﺘﺪﺍﯼ ﺁﺭﺍﻳﻪ ﺑﺎﺷﺪ.
A1 = 0
n −1 1
) An = n An + n (1 + An−1
1 1 1 1 1 1 1 1
⇒ An = + An−1 = + + L + + A1 = + )+ L + + − 1 = Θ(log n
n n n −1 2 −4
n 4n4
1 1 2442431
= Hn
1
) ( = ln n +γ + Θ
n
γ =0 5772
) A (i ) > A ( j
ﺗﻌﺪﺍﺩ ﺗﮑﺮﺍﺭ ﺩﺳﺘﻮﺭ
( n − 1) + n ( n − 1) + n ( n − 1) + L + n ( n − 1) = n − 1
1 1 1 1
n
ﭘﺲ ﻫﻤﻴﺸﻪ n-1ﺑﺎﺭ ﺗﮑﺮﺍﺭ ﻣﻲ ﺷﻮﺩ.
١٢ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
1 ( n + 1) n n + 1
⇒ =
n 2 2
ﺍﺟﺮﺍ ﻣﻲ ﺷﺪ ﻭﻟﻲ ﺩﺭ ﺍﻳﻦ ﻣﺜﺎﻝ ﻫﺮﮔﺎﻩ ﮐﻪ ﺷﺮﻁ ﺑﺮﻗﺮﺍﺭ ﺑﺎﺷﺪ ﺍﺯ ﺣﻠﻘﻪn ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻗﺒﻠﻲ ﺩﺭ ﻫﺮ ﺻﻮﺭﺕ ﺣﻠﻘﻪ ﺗﺎ:ﻧﮑﺘﻪ
.ﺧﺎﺭﺝ ﻣﻲ ﺷﻮﻳﻢ
: ﺭﺍ ﺑﺪﺳﺖ ﺁﻭﺭﻳﺪQuickSort ﻣﻴﺎﻧﮕﻴﻦ ﺯﻣﺎﻥ ﺍﺟﺮﺍﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﻣﺜﺎﻝ
0 ;n =1
T ( n) = 2 n−1
(n − 1) + ∑ T (i ) ; n > 1
n i =1
2 n
⇒ T (n + 1) = n + ∑ T (i)
n + 1 i =1
n −1
nT ( n ) = n ( n − 1) + 2 ∑ T (i )
⇒ i =1
n * (−1) +
(n + 1)T (n + 1) = n(n + 1) + 2∑ T (i )
i =1
ﻧﺘﻴﺠﻪ :ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ ﻣﻴﺎﻧﮕﻴﻦ ﺯﻣﺎﻥ ﺍﺟﺮﺍﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ QuickSortﺑﺮﺍﺑﺮ ) O(n. log nﻣﻴﺒﺎﺷﺪ.
ﻣﺜـﺎﻝ :ﻓــﺮﺽ ﮐﻨﻴـﺪ ﻳـﮏ ﺁﺭﺍﻳـﻪ ﻣﺮﺗـﺐ )ﺻـﻌﻮﺩﯼ( ﻭ ﮐﻠﻴــﺪ xﺩﺍﺩﻩ ﺷـﺪﻩ ﺑﺎﺷـﻨﺪ .ﻣﺘﻮﺳـﻂ ﺯﻣـﺎﻥ ﺍﺟـﺮﺍﯼ ﺍﻟﮕـﻮﺭﻳﺘﻢ
BinarySearchﺭﺍ ﻣﺤﺎﺳﺒﻪ ﮐﻨﻴﺪ.
)Function BinarySearch( A, n, x
low ← 1
high←n
while low≤high do
mid←(low+high)/2
if x=A(mid) then
return mid
elsif x>A(mid) then
low←mid+1
else
high←mid-1
endif
repeat
return 0
end.
ﺩﺭ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺍﮔﺮ xﺩﺍﺧﻞ ﺁﺭﺍﻳﻪ ﻣﻮﺟﻮﺩ ﺑﺎﺷﺪ ﺗﻌﺪﺍﺩﯼ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳـﻪ ﺻـﻮﺭﺕ ﻣﻴﮕﻴـﺮﺩ ﻭ ﻧﻬﺎﻳﺘـﺎﹰ ﺟﺴـﺘﺠﻮ
ﻣﻮﻓﻖ ﺧﻮﺍﻫﺪ ﺑﻮﺩ ﻭ ﺍﮔﺮ xﺩﺍﺧﻞ ﺁﺭﺍﻳﻪ ﻣﻮﺟﻮﺩ ﻧﺒﺎﺷﺪ ،ﺗﻌﺪﺍﺩﯼ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳﻪ ﺻﻮﺭﺕ ﻣﻴﮕﻴﺮﺩ ﻭ ﻧﻬﺎﻳﺘﺎﹰ ﺟﺴـﺘﺠﻮ
ﻧﺎﻣﻮﻓﻖ ﺧﻮﺍﻫﺪ ﺑﻮﺩ .ﻣﻘﺎﻳﺴﻪ ﻫﺎ ﺑﺼﻮﺭﺕ ﺟﺴﺘﺠﻮ ﺩﺭ ﻳﮏ ﺩﺭﺧﺖ ﺟﺴﺘﺠﻮﯼ ﺩﻭﺩﻭﻳﻲ ﺍﻧﺠﺎﻡ ﻣﻴﺸﻮﻧﺪ ﺑﺮﺍﯼ ﻧﻤﻮﻧﻪ ﺑﻪ ﺁﺭﺍﻳﻪ
ﺯﻳﺮ ﻭ ﺩﺭﺧﺖ ﺣﺎﺻﻞ ﺍﺯ ﺟﺴﺘﺠﻮﯼ ﺁﻥ ﺩﻗﺖ ﮐﻨﻴﺪ:
A 1 2 3 4 5 6 7 8 9
ﻣﻘﺎﺩﻳﺮ 6 10 16 19 21 42 66 81 93
3 2ﺗﻌﺪﺍﺩ ﻣﻘﺎﻳﺴﺎﺕ ﺩﺭ ﺣﺎﻟﺖ ﻣﻮﻓﻖ 3 4 1 3 2 3 4
5
2 7
9
4
١٤ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
ﺩﺭ ﺩﺭﺧﺖ ﺑﺎﻻ ﮔﺮﻩ ﻫﺎﯼ ﺧﺎﺭﺟﯽ ﺑﺎ ﻣﺴﺘﻄﻴﻞ ﻭ ﮔﺮﻩ ﻫﺎﯼ ﺩﺍﺧﻠﯽ ﺑﺎ ﺩﺍﻳﺮﻩ ﻧﺸﺎﻥ ﺩﺍﺩﻩ ﺷـﺪﻩ ﺍﻧـﺪ.ﺩﺭﺧـﺖ ﺑـﺎﻻ ﺭﺍ ﺩﺭﺧـﺖ
ﺗﺼﻤﻴﻢ ﺩﻭﺩﻭﻳﻲ ﻣﻴﻨﺎﻣﻨﺪ .ﺟﺴﺘﺠﻮﻫﺎﯼ ﻣﻮﻓﻖ ﺑﻪ ﮔﺮﻩ ﻫﺎﯼ ﺩﺍﺧﻠﯽ ﻭ ﺟﺴﺘﺠﻮﻫﺎﯼ ﻧﺎﻣﻮﻓﻖ ﺑـﻪ ﮔـﺮﻩ ﻫـﺎﯼ ﺧـﺎﺭﺟﯽ ﺧـﺘﻢ
ﻣﻴﺸﻮﻧﺪ.
ﻧﮑﺘﻪ :ﺍﮔﺮ ﺗﻌﺪﺍﺩ ﮔﺮﻩ ﻫﺎﯼ ﺧﺎﺭﺟﯽ ﺭﺍ ﺑﺎ n0ﻧﺸﺎﻥ ﺩﺍﺩﻩ ﻭ ﺗﻌﺪﺍﺩ ﮔﺮﻩ ﻫﺎﯼ ﺩﺍﺧﻠﯽ ﺭﺍ ﺑﺎ nﻧﺸﺎﻥ ﺩﻫﻴﻢ ﺁﻧﮕﺎﻩ n0=n+1
=(3+2+3+4+1+3+2+3+4)/9=25/9=2.77ﻣﻴﺎﻧﮕﻴﻦ ﺟﺴﺘﺠﻮﻫﺎﯼ ﻣﻮﻓﻖ
ﻧﮑﺘﻪ :ﻓﺮﺽ ﮐﻨﻴﺪ ﺍﺣﺘﻤﺎﻝ ﻣﻮﺟﻮﺩ ﺑﻮﺩﻥ xﺩﺍﺧﻞ ﻋﻨﺎﺻﺮ ﻣﺨﺘﻠﻒ ﺁﺭﺍﻳﻪ ﻭ ﻫﻤﭽﻨﻴﻦ ﺩﺭ ﺻﻮﺭﺕ ﻣﻮﺟﻮﺩ ﻧﺒﻮﺩﻥ xﺩﺭ ﺁﺭﺍﻳﻪ
ﺍﺣﺘﻤﺎﻝ ﻗﺮﺍﺭ ﺩﺍﺷﺘﻦ xﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺁﺭﺍﻳﻪ ﻣﺴﺎﻭﯼ ﺍﺳﺖ)ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺍﺣﺘﻤﺎﻝ ﻗـﺮﺍﺭ ﺩﺍﺷـﺘﻦ xﺩﺭ ﻣﺠﻤﻮﻋـﻪ ] [5,9ﻭ
] [11,15ﻭ ...ﻣﺴﺎﻭﯼ ﺍﺳﺖ)ﮐﻼﺳﻬﺎ ﻣﺘﺴﺎﻭﯼ ﺍﻻﺣﺘﻤﺎﻟﻨﺪ(.
A 1 2 3 4 5 6 7 8 9
3 3 3 4 4 3 3 3 4 4ﺗﻌﺪﺍﺩ ﻣﻘﺎﻳﺴﺎﺕ ﺩﺭ ﺣﺎﻟﺖ ﻧﺎﻣﻮﻓﻖ
=(3+3+3+4+4+3+3+3+4+4)/10=37/10=3.7ﻣﻴﺎﻧﮕﻴﻦ ﺟﺴﺘﺠﻮﻫﺎﯼ ﻧﺎﻣﻮﻓﻖ
ﻗﻀﻴﻪ :ﺍﮔﺮ ) n∈[2k-1,2kﺑﺎﺷﺪ ،ﺁﻧﮕﺎﻩ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺟﺴﺘﺠﻮﯼ ﺩﻭﺩﻭﻳﻲ ﻣﺴﺘﻠﺰﻡ ﺣﺪﺍﮐﺜﺮ kﻣﻘﺎﻳﺴﻪ ﺑﺮﺍﯼ ﺟﺴﺘﺠﻮﯼ ﻣﻮﻓـﻖ
ﻭ k-1ﻳﺎ kﻣﻘﺎﻳﺴﻪ ﺑﺮﺍﯼ ﺟﺴﺘﺠﻮﯼ ﻧﺎﻣﻮﻓﻖ ﺍﺳﺖ.
ﻧﺘﻴﺠﻪ :ﺟﺴﺘﺠﻮﯼ ﻧﺎﻣﻮﻓﻖ ﺩﺍﺭﺍﯼ ﻫﻤﻴﺸﻪ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) Θ(log nﺍﺳﺖ .ﺟﺴﺘﺠﻮﯼ ﻣﻮﻓـﻖ ﺩﺭ ﺑﻬﺘـﺮﻳﻦ ﻭﺿـﻌﻴﺖ
) Ω(1ﻭ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﻭﺿﻌﻴﺖ ) O(log nﻣﻴﺒﺎﺷﺪ.
ﺣﺎﻝ ﻣﺘﻮﺳﻂ ﺗﻌﺪﺍﺩ ﻣﻘﺎﻳﺴﺎﺕ ﺩﺭ ﺟﺴﺘﺠﻮﯼ ﻣﻮﻓﻖ ﺭﺍ ﻣﺤﺎﺳﺒﻪ ﻣﻴﮑﻨﻴﻢ:
ﺍﮔﺮ vﻳﮏ ﮔﺮﻩ ﺩﺍﺧﻠﯽ ﺩﺭ ﺩﺭﺧﺖ ﺗﺼﻤﻴﻢ ﺑﺎﺷﺪ ﻭ ﺳﻄﺢ ﺁﻥ ﺭﺍ ﺑﺎ ) Level(vﻧﺸﺎﻥ ﺩﻫﻴﻢ ،ﺁﻧﮕﺎﻩ ﺗﻌﺮﻳﻒ ﻣﻴﮑﻨﻴﻢ:
d (v) = level (v) − 1
=E ) ∑ d (v
v∈External Nodes
=I ) ∑ d (v
v∈Internal Nodes
ﻗﻀﻴﻪE=I+2n :
ﺭﺍﻫﻨﻤﺎﻳﻲ ﺍﺛﺒﺎﺕ :ﺑﺎ ﺍﺳﺘﻘﺮﺍ ﺍﺛﺒﺎﺕ ﮐﻨﻴﺪ.
ﺣﺎﻝ ﺍﮔﺮ ﻣﻴﺎﻧﮕﻴﻦ ﺗﻌﺪﺍﺩ ﻣﻘﺎﻳﺴﺎﺕ ﺩﺭ ﺟﺴﺘﺠﻮﯼ ﻣﻮﻓﻖ ﺩﺭ ﻳﮏ ﺩﺭﺧﺖ ﺗﺼﻤﻴﻢ ﺑﺎ nﮔﺮﻩ ﺩﺍﺧﻠﯽ ﺭﺍ ﺑﺎ ) S(nﻭ ﻣﻴـﺎﻧﮕﻴﻦ
ﻣﻘﺎﻳﺴﺎﺕ ﺩﺭ ﺟﺴﺘﺠﻮﯼ ﻧﺎﻣﻮﻓﻖ ﺭﺍ ﺑﺎ ) U(nﻧﺸﺎﻥ ﺩﻫﻴﻢ ،ﺁﻧﮕﺎﻩ:
]∑[d (v) + 1
v∈Internal Nodes I +n
= )S ( n =
n n
) ∑ d (v
v∈External Nodes E
= )U ( n =
n +1 n +1
ﺣﺎﻝ ﺑﺎ ﺍﺳﺘﻨﺎﺩ ﺑﻪ ﻗﻀﻴﻪ ﺑﺎﻻ ﻭ ﺩﻭ ﺭﺍﺑﻄﻪ ﺑﻪ ﺩﺳﺖ ﺁﻣﺪﻩ ﻣﻴﺘﻮﺍﻥ ﻧﺘﻴﺠﻪ ﮔﺮﻓﺖ ﮐﻪ:
E − 2n + n (n + 1)U (n) − n 1
= )⇒ S ( n = = (1 + )U (n) − 1
n n n
ﻼ ﺩﻳﺪﻳﻢ ﮐﻪ ) U(n)=Θ(log nﺩﺭ ﻧﺘﻴﺠﻪ:
ﻭ ﭼﻮﻥ ﻗﺒ ﹰ
)S (n) = Θ(log n
١٥ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
ﻂ ﺍ
۳ ۲
- -
ﯽ ﮔ
ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻃﻮﺭ ﻣﺨﺘﺼﺮ ﺍﺯ ﺣﻞ ﺭﻭﺍﺑﻂ ﺑﺎﺯﮔﺸﺘﯽ ﺳﺨﻦ ﺧﻮﺍﻫﻴﻢ ﮔﻔﺖ .ﺭﻭﺍﺑﻂ ﺑﺎﺯﮔﺸﺘﯽ ﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺍﺯ ﺭﻭﯼ ﺩﺭﺟـﻪ
ﺁﻥ ﺩﺳﺘﻪ ﺑﻨﺪﯼ ﮐﺮﺩ:
ﻪ
ﺍﻳﻦ ﺭﻭﺍﺑﻂ ﺑﻪ ﺳﺎﺩﮔﯽ ﺍﺯ ﻃﺮﻳﻖ ﺭﻭﺵ ﺟﺎﻳﮕﺬﺍﺭﯼ ﻗﺎﺑﻞ ﺣﻞ ﻣﻴﺒﺎﺷﻨﺪ .ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺑﺎ ﺑﺎﺯ ﮐﺮﺩﻥ ﺭﺍﺑﻄﻪ ﺑﺼﻮﺭﺕ ﺗـﻮ ﺩﺭ
ﺗﻮ ﻣﻴﺘﻮﺍﻥ ﺭﺍﺑﻄﻪ ﺭﺍ ﺣﻞ ﻧﻤﻮﺩ.
ﻣﺜﺎﻝ:
2T (n − 1) + 1 ; n > 0
T ( n) =
1 ;n = 0
⇒ T (n) = 2T (n − 1) + 1
= 2[2T (n − 2) + 1] + 1 = 4T (n − 2) + 2 + 1 = 2 2 T (n − 2) + 21 + 2 0
= 2 i T (n − i ) + 2 i −1 + L + 21 + 2 0
n
) = 2 n T (0) + 2 n−1 + L + 2 0 = ∑ 2i = 2 n+1 − 1 = Ο(2 n
i =0
( )
ﻪ
A n = A n −1 + A n − 2 + 1
A n + 1 = A n −1 + A n − 2 + 1 + 1
*B n = A n + 1
* ⇒ B n = B n −1 + B n − 2
B0 = 2 B1 = 2
n n n −1 n −2
Bn = r ⇒ r =r +r
r 2 − r −1 = 0
1+ 5 1− 5
= r1 = r2
2 2
B n = C1r1n + C 2r2n
⇒ B 0 = C1r10 + C 2r20 = C1 + C 2 = 2
if n=0 1
1+ 5 1− 5
⇒ B1 = C1r11 + C 2 r21 = C1 +C2 =2
2 2
if n=1 2
1+ 5 1− 5
⇒ = C1 = C2
2و1 5 5
ﺭﻭﺵ ﺣﻞ ﭘﺮﻭﺳﻴﺠﺮ ﻗﺒﻠﻲ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﻣﻴﺒﺎﺷﺪ ﻭ ﻳﮏ ﺩﺭﺧﺖ ﺭﺍ ﺑﻪ ﺷﮑﻞ ﺯﻳﺮ ﭘﻮﻳﺶ ﻣﻲ ﮐﻨﺪ ﺍﻳﻦ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﻣﻘـﺎﺩﻳﺮﻱ
ﺭﺍ ﭼﻨﺪﻳﻦ ﺑﺎﺭ ﺑﺼﻮﺭﺕ ﺗﮑﺮﺍﺭﯼ ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﮐﻨﺪ ﻭ ﺑﻪ ﻫﻤﻴﻦ ﻋﻠﺖ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﻤﺎﺋﻲ ﻣﻲ ﺑﺎﺷﺪ.
ﻣﺜﺎﻝ ﺩﺭﺧﺖ ﻓﺮﺍﺧﻮﺍﻧﯽ ): f(5
)f(5
)f(3
)f(4
)f(1 )f(0
ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺭﺍ ﺑﻪ ﻭﺳﻴﻠﻪ ﻳﻚ ﺣﻠﻘﻪ ﺑﺮﮒﻫﺎ ﺑﻪ ﺳﻤﺖ ﺭﻳﺸﻪ ﺑﺎ ﺣﻔﻆ ﻣﻘﺎﺩﻳﺮ ﻫﻢ ﻣﻲﺗﻮﺍﻥ ﺣﻞ ﻛﺮﺩ ﻛﻪ ﺍﻳﻦ ﺭﻭﺵ ﭘـﺎﻳﻴﻦ ﺑـﻪ
ﺑﺎﻻ ) (bottom-upﺍﺳﺖ ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺣﺎﻟﺖﻫﺎﻱ ﺗﻜﺮﺍﺭﻱ ﺣﺬﻑ ﻣﻲﺷﻮﺩ) .ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ(
)(Master Theorem
ﺍ ﻪ
٤ ٢
- -
ﺩﺭ ﻓﺼﻞ ﺑﻌﺪﯼ ﺑﺎ ﻳﮑﯽ ﺍﺯ ﺭﻭﺷﻬﺎﯼ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﻪ ﻧﺎﻡ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﺁﺷﻨﺎ ﺧﻮﺍﻫﻴﻢ ﺷﺪ ﮐﻪ ﺩﺭ ﺗﺤﻠﻴﻞ ﻣﺮﺗﺒﻪ ﺯﻣـﺎﻧﯽ
ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﻃﺮﺍﺣﯽ ﺷﺪﻩ ﺑﻪ ﺁﻥ ﺭﻭﺵ ﺑﻪ ﻗﻀﻴﻪﺍﯼ ﺑﻪ ﻧﺎﻡ ﻗﻀﻴﻪ ﺍﺻﻠﯽ ﻧﻴﺎﺯ ﺧﻮﺍﻫﻴﻢ ﺩﺍﺷﺖ ﻭ ﻟﺬﺍ ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺑﻴﺎﻥ
ﺁﻥ ﺧﻮﺍﻫﻴﻢ ﭘﺮﺩﺍﺧﺖ.
١٧ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
:ﻗﻀﻴﻪ ﺍﺻﻠﯽ
T ( n ) = aT ( ) + Cn k
n
b if
: ﺍﺳﺖ ﺁﻧﮕﺎﻩb>1 ﺍﻋﺪﺍﺩ ﺛﺎﺑﺖ ﻭk ﻭc,a,b ﻛﻪ ﺩﺭ ﺁﻥ
logba
θ n a >bk
( )
T ( n ) = θ n k log n
a =bk
( )
θ n k a <bk
:ﻣﺜﺎﻝ
. ﺭﺍ ﺑﻪ ﻛﻤﻚ ﻗﻀﻴﻪ ﺍﺻﻠﻲ ﺑﻪ ﺩﺳﺖ ﺁﻭﺭﻳﺪBinary search ﺯﻣﺎﻥ ﺍﺟﺮﺍﻱ
n
T ( n ) = 1 +T
2
a = 1
b = 2 a = b k ⇒ 1 = 20
( )
k = 0 θ n k log n = θ ( log n )
. ﺩﺭ ﺯﻣﺎﻥ ﻧﻬﺎﻳﻲ ﺗﺄﺛﻴﺮﻱ ﻧﺪﺍﺭﺩc ﺩﺭ ﻗﻀﻴﻪ ﺍﺻﻠﻲ ﻣﻘﺪﺍﺭ:ﻧﻜﺘﻪ
ﺯﻣﺎﻥ ﺍﺟﺮﺍﻱ ﻣﺜﺎﻝﻫﺎﻱ ﺯﻳﺮ ﺭﺍ ﺑﻪ ﻛﻤﻚ ﻗﻀﻴﻪ ﺍﺻﻠﻲ ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ؟:ﻣﺜﺎﻝ
3n
T (n) = T ( ) + n2 ⇒
2
a = 1
2
b = a <bk
3
k = 2
( ) ( )
θ nk =θ n2
:ﻣﺜﺎﻝ
T ( n ) = 2T ( n ) + log n
n = 2m ⇒ m = log n2
m
( )
T 2m = T 2 2
+m
( )
T 2m = s ( m )
m
s ( m ) = 2s +m
2
θ ( m log m ) , ⇒ θ ( log n .log log n )
:ﻣﺜﺎﻝ
١٨ ﺗﺤﻠﻴﻞ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎ
n
T ( n ) = 3T + n log n
4
a = 3 n log n = n 1/ x n < n log n < n 2
b = 4
( )
θ n1/ x = θ ( n log n )
k = 1/ x
۳
ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ،ﺭﻭﺵ ﺁﺯﻣﻨﺪ ﻭ ﻳﺎ ﺭﻭﺵ ﺩﺳﺘﺎﻭﺭﺩﻫﺎﻱ ﻗﺪﻡ ﺑﻪ ﻗﺪﻡ ﻧﻴﺰ ﻧﺎﻣﻴﺪﻩ ﻣﻲﺷﻮﺩ .ﺍﻳﻦ ﺭﻭﺵ ﺟﺰﻭ ﺭﺩﻩ ﺑﺰﺭﮔﺘﺮﻱ ﺑﻪ
ﻧﺎﻡ ﺭﻭﺷﻬﺎﻱ ﺑﻬﻴﻨﻪﺳﺎﺯﻱ ﺍﺳﺖ ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ:
-۱ﺩﻧﺒﺎﻟﻪﺍﯼ ﺍﺯ ﺍﻧﺘﺨﺎﺑﻬﺎ ﺭﺍ ﺩﺭ ﭘﻴﺶ ﺭﻭ ﺩﺍﺭﻳﻢ ﮐﻪ ﺑﺎﻳﺪ ﺍﺯ ﺑﻴﻦ ﺍﻳﻦ ﺩﻧﺒﺎﻟﻪ ﺍﻧﺘﺨﺎﺑﻬﺎﻳﻲ ﺭﺍ ﮐـﻪ ﻣﻨﺠـﺮ ﺑـﻪ ﺑﻬﻴﻨـﻪ ﺷـﺪﻥ
ﺟﻮﺍﺏ ﻧﻬﺎﻳﻲ ﮔﺮﺩﺩ ﺍﻧﺘﺨﺎﺏ ﮐﻨﻴﻢ.
-۲ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﺍﺯ ﻣﺮﺍﺣﻞ ﺍﺟﺮﺍﻳﻲ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﺑﺎﻳـﺪ ﺑﺨﺸـﻲ ﺍﺯ ﺟـﻮﺍﺏ ﻳـﺎ ﺑـﻪ ﻋﺒـﺎﺭﺕ ﺩﺭﺳـﺖﺗـﺮ ﻣﺆﻟﻔـﻪﺍﻱ ﺍﺯ
ﻣﺆﻟﻔﻪﻫﺎﻱ ﺟﻮﺍﺏ ﺭﺍ ﺑﻪ ﺩﺳﺖ ﺁﻭﺭﻳﻢ.
-۳ﻧﺘﻴﺠﻪ ﻧﻬﺎﻳﻲ ﻳﻚ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺁﺯﻣﻨﺪ ﻣﺠﻤﻮﻋﻪﺍﻱ ﺍﺯ ﺩﺍﺩﻩﻫﺎﺳﺖ ﻛﻪ ﻣﻤﻜﻦ ﺍﺳﺖ ﺗﺮﺗﻴﺐ ﺁﻧﻬﺎ ﻧﻴـﺰ ﺍﻫﻤﻴـﺖ ﺩﺍﺷـﺘﻪ
ﺑﺎﺷﺪ .ﺍﻳﻦ ﻣﺠﻤﻮﻋﻪ ﺩﺍﺩﻩﻫﺎ ﺑﻴﺸﺘﺮ ﻣﻮﺍﻗﻊ ﺯﻳﺮﻣﺠﻤﻮﻋﻪ ﺩﺍﺩﻩﻫﺎﻱ ﻭﺭﻭﺩﻱ ﺍﺳﺖ.
-۴ﺟﻮﺍﺏ ﻧﻬﺎﻳﻲ ﺑﺎﻳﺪ ﺗﺎﺑﻊ ﻫﺪﻑ ﻳﻚ ﻋﺒﺎﺭﺕ ﺭﺍ ﺑﻬﻴﻨﻪ )ﻣﺎﻛﺰﻳﻤﻢ ﻭ ﻳﺎ ﻣﻴﻨﻴﻤﻢ( ﻧﻤﺎﻳﺪ .ﺍﻟﺒﺘـﻪ ﺑﺎﺗﻮﺟـﻪ ﺑـﻪ ﺍﻳﻨﻜـﻪ ﺩﺭ
ﺭﻭﺵﻫﺎﻱ ﺁﺯﻣﻨﺪ ﺁﻳﻨﺪﻩﻧﮕﺮﻱ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ ﻭ ﺑﻪ ﻭﺿﻌﻴﺖ ﺟﺎﺭﻱ ﺑﻴﺸﺘﺮ ﺗﻮﺟﻪ ﻣﻲﺷﻮﺩ ﻭﺍﺿـﺢ ﺍﺳـﺖ ﻛـﻪ ﺍﻳـﻦ
ﺑﻬﻴﻨﮕﻲ ﻣﻤﮑﻦ ﺍﺳﺖ ﻛﻠﻲ ﻧﺒﺎﺷﺪ ﻭ ﻣﺤﻠﻲ ﺑﺎﺷﺪ ﻭ ﺑﻪ ﻋﺒﺎﺭﺗﻲ maxﻭ minﻓﻌﻠﻲ ﺣﺎﺻﻞ ﻣﻲﺷﻮﺩ ﻧﻪ ﻣﺎﻛﺰﻳﻤﻢ
ﻭ ﻣﻴﻨﻴﻤﻢ ﺳﺮﺍﺳﺮﯼ.
-۵ﺗﺼﻤﻴﻢ ﺍﺗﺨﺎﺫ ﺷﺪﻩ ﺩﺭ ﻣﻮﺭﺩ ﺍﻧﺘﺨﺎﺏ ﻳﺎ ﻋﺪﻡ ﺍﻧﺘﺨﺎﺏ ﻳﻜﻲ ﺍﺯ ﺩﺍﺩﻩﻫﺎﻱ ﻭﺭﻭﺩﻱ ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺆﻟﻔـﻪﺍﻱ ﺍﺯ ﺟـﻮﺍﺏ،
ﻗﻄﻌﻲ ﻭ ﻏﻴﺮﻗﺎﺑﻞ ﺑﺮﮔﺸﺖ ﺍﺳﺖ.
-۶ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﺎﻳﺪ ﺑﺼﻮﺭﺕ ﻣﺤﻠﯽ ﺑﻬﺘﺮﻳﻦ ﺍﻧﺘﺨﺎﺏ ﺭﺍ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ﻭ ﺍﻣﻴﺪﻭﺍﺭ ﺑـﻮﺩ ﮐـﻪ ﺑﻬﺘـﺮﻳﻦ ﺍﻧﺘﺨـﺎﺏ ﻣﺤﻠـﯽ
ﻣﻨﺠﺮ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﺍﻧﺘﺨﺎﺏ ﺳﺮﺍﺳﺮﯼ ﻧﻴﺮ ﺧﻮﺍﻫﺪ ﺷﺪ ) ﺍﮔﺮ ﺑﺘﻮﺍﻥ ﺍﻳﻦ ﻣﻮﺿﻮﻉ ﺭﺍ ﺍﺛﺒﺎﺕ ﮐﺮﺩ ﻣﻴﺘﻮﺍﻥ ﻣﺴﺌﻠﻪ ﺭﺍ ﺑـﻪ
ﺍﻳﻦ ﺭﻭﺵ ﺣﻞ ﮐﺮﺩ(.
ﻧﮑﺘﻪ :ﻣﺴﺌﻠﻪ ﻣﻬﻢ ﺩﺭ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ﺍﺛﺒﺎﺕ ﻣﻮﺭﺩ ﭘﻨﺠﻢ ﺍﺯ ﻣﻮﺍﺭﺩ ﺑﺎﻻ ﻣﻴﺒﺎﺷﺪ.
-٥ﺗﺎﺑﻊ ﻫﺪﻑ ﺑﺮﺍﻱ ﺍﺭﺯﺵ ﺩﻫﻲ ﺑﻪ ﺟﻮﺍﺏ ﻣﺴﺄﻟﻪ ﻛﻪ ﻫﺪﻑ ﻧﻬﺎﻳﻲ ﺑﻬﻴﻨﻪ ﻛﺮﺩﻥ ﺍﻳﻦ ﺗﺎﺑﻊ ﺍﺳﺖ.
-٦ﻳﻚ ﺗﺎﺑﻊ ﺑﺮﺍﻱ ﺑﺮﺭﺳﻲ ﺍﻳﻨﻜﻪ ﻣﺸﺨﺺ ﻛﻨﺪ ﺩﺭ ﻧﻬﺎﻳﺖ ﺟﻮﺍﺏ ﺣﺎﺻﻞ ﺷﺪﻩ ﻳﺎ ﺧﻴﺮ.
ﻣﺴﺎﺋﻠﯽ ﻧﻈﻴﺮ ﺯﻣﺎﻧﺒﻨﺪﯼ ﺑﺮﻧﺎﻣﻪﻫﺎ ،ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﻣﻴﻨﻴﻤﻢ ،ﺍﺩﻏﺎﻡ ﺩﻭﺩﻭﻳﻲ ﻭ ﺑﻬﻴﻨﻪ ﻓﺎﻳﻠﻬﺎ ،ﺍﻧﺘﺨﺎﺏ ﻓﻌﺎﻟﻴﺘﻬﺎ ﻭ ...ﺭﺍ ﻣﻴﺘـﻮﺍﻥ
ﺗﻮﺳﻂ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ﺣﻞ ﻧﻤﻮﺩ .ﻣﺪﻝ ﮐﻠﯽ ﺭﻭﺵ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺎ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﻣﻴﺒﺎﺷﺪ.
function )Greedy(A,n
∅ solution
for i1 to n do
)x select (A
if feasible(x,solution) then
)solution union (solution,x
endif
repeat
return solution
end .
Knapsack
( )
ﻪ ﻪ
١ ٣
ﯼ ﺮ ﺴ ﮐ ﺎ ﻳ ﻩ ﺩ ﺎ ﺳ ﺘ ﺸ ﻟ ﻮ ﻛ ﻟ ﺄ ﺴ ﻣ
- -
ﻲ ﭘ
ﺩﺭ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺗﻌﺪﺍﺩ nﮐﻴﺴﻪ ﺍﺯ ﺍﺟﻨﺎﺱ ﻣﺨﺘﻠﻒ ﺑﻪ ﻋﻨﻮﺍﻥ ﻭﺭﻭﺩﯼ ﺩﺍﺩﻩ ﺷـﺪﻩ ﺍﺳـﺖ .ﻫـﺮ ﮐﻴﺴـﻪ
ﺩﺍﺭﺍﯼ ﻭﺯﻥ ﻭ ﺳﻮﺩ ﻣﺸﺨﺼﯽ ﺍﺳﺖ .ﺷﺨﺼﯽ ﺑﺎ ﻳﮏ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﻗﺼﺪ ﺍﻧﺘﺨـﺎﺏ ﺍﻳـﻦ ﺍﺟﻨـﺎﺱ ﺭﺍ ﺩﺍﺭﺩ .ﻫـﺪﻑ ،ﺍﻧﺘﺨـﺎﺏ
ﺍﺟﻨﺎﺱ ﻭ ﻗﺮﺍﺭ ﺩﺍﺩﻥ ﺁﻧﻬﺎ ﺩﺭ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﺑﻪ ﮔﻮﻧﻪﺍﯼ ﺍﺳﺖ ﮐﻪ ﺳﻮﺩ ﺣﺎﺻﻠﻪ ﺑﻴﺸﻴﻨﻪ ﮔﺮﺩﺩ.
ﻭﺭﻭﺩﻱ:
:nﺗﻌﺪﺍﺩ ﮐﻴﺴﻪ ﻫﺎ
:Piﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺍﻧﺘﺨﺎﺏ ﻛﻞ ﮐﻴﺴﻪ iﺍﹸﻡ
:Wiﻭﺯﻥ ﻛﻞ ﮐﻴﺴﻪ iﺍﹸﻡ
:Mﮔﻨﺠﺎﻳﺶ ﻛﻮﻟﻪ ﭘﺸﺘﯽ
n
ﻫﺪﻑ :ﺑﻴﺸﻴﻨﻪ ﮐﺮﺩﻥ ﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺍﻧﺘﺨﺎﺏ ﺍﺟﻨﺎﺱ ﻳﻌﻨﯽ Max ∑ xi . pi
i =1
ﺷﺮﺍﻳﻂ ﻣﺴﺌﻠﻪ:
ﻭﺯﻥ ﻫﻤﻪ ﮐﻴﺴﻪﻫﺎ ﺭﻭﻱ ﻫﻢ ﺍﺯ ﻭﺯﻥ ﻛﻮﻟﻪﭘﺸﺘﻲ ﺑﻴﺸﺘﺮ ﺍﺳﺖ ﺯﻳﺮﺍ ﺍﮔﺮ ﻛﻤﺘﺮ ﺑﺎﺷـﺪ ﻳﻌﻨـﻲ ﻣـﻲﺗـﻮﺍﻧﻴﻢ ﻫﻤـﻪ ﺭﺍ ﺑـﺮﺩﺍﺭﻳﻢ ﻭ
ﺍﻧﺘﺨﺎﺑﻲ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ ﻫﻤﭽﻨﻴﻦ ﻣﺠﻤﻮﻉ ﻭﺯﻥ ﺍﺟﺴﺎﻣﻲ ﻛﻪ ﺍﻧﺘﺨﺎﺏ ﻛﺮﺩﻳﻢ ﺍﺯ ﻭﺯﻥ ﻛﻞ ﻛﻮﻟﻪﭘﺸﺘﻲ ﻧﺒﺎﻳﺪ ﺑﻴﺸﺘﺮ ﺷﻮﺩ.
n
ﺧﺮﻭﺟﻲ :ﻛﺴﺮﻱ ﺍﺯ ﮐﻴﺴﻪ iﺍﹸﻡ ﻛﻪ ﺍﻧﺘﺨﺎﺏ ﻣﻲﺷﻮﺩ ﺩﺍﺧﻞ ﻋﻨﺼﺮ iﺍﻡ ﺁﺭﺍﻳﻪ ﻗﺮﺍﺭ ﻣﻲﮔﻴﺮﺩ.
٢١ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
xi ) . 0 ≤ x iﺩﺭﺍﻳﻪ iﺍﻡ ﺁﺭﺍﻳﻪ Xﻣﻴﺒﺎﺷﺪ( .ﺍﻟﮕﻮﺭﻳﺘﻢ ﻣﻮﺭﺩ ﻧﻈﺮ ﺩﺭ ﺯﻳﺮ ﺑﻴﺎﻥ ﺷﺪﻩ ﺍﺳﺖ. ≤1
ﺩﺭ ﻛﻮﻟﻪﭘﺸﺘﻲ ﺳﺎﺩﻩ
ﺍﮔﺮ ﺷﺮﻁ ﺑﺮﻗﺮﺍﺭ ﺷﻮﺩ ،ﻛﺴﺮﻱ ﺍﺯ ﺟﺴﻢ iﺍﹸﻡ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻲﻛﻨﻴﻢ ﺗﺎ ﺑﻴﺸﺘﺮﻳﻦ ﺳﻮﺩ ﺭﺍ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﻭ ﻧﻴﺰ ﮐﻮﻟـﻪ ﮐـﺎﻣﻼﹰ ﭘـﺮ
ﺷﻮﺩ.
٢٢ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
( )
ﺐ ﺗ ﺮ ﻣ ﯼ ﺎ ﻫ ﻳ ﺭ ﺁ ﺎ ﻳ ﺎ ﻬ ﻳ ﺎ ﻓ ﻬ ﺑ ﻭ ﻳ ﻭ ﺩ ﻭ ﺩ ﻡ ﺎ ﺩ ﺴ ﻣ
- -
ﻳﺎﺩﺁﻭﺭﯼ :ﻣﻴﺪﺍﻧﻴﻢ ﮐﻪ ﺑﺮﺍﯼ ﺍﺩﻏﺎﻡ ﺩﻭ ﺁﺭﺍﻳﻪ ﻳﺎ ﻓﺎﻳﻞ ﻣﺮﺗﺐ ﮐﻪ ﻫﺮ ﮐﺪﺍﻡ ﺑﻪ ﺗﺮﺗﻴﺐ ﺩﺍﺭﺍﯼ m1ﻭ m2ﺭﮐﻮﺭﺩﻳﺎ ﻋﻨﺼﺮ ﺑﺎﺷﻨﺪ
ﻧﻴﺎﺯ ﺑﻪ ﺯﻣﺎﻥ ) O(m1+m2ﻣﻴﺒﺎﺷﺪ .ﺣﺎﻝ ﺍﮔﺮ ﻫﺰﻳﻨﻪ ﺍﺩﻏﺎﻡ ﺍﻳﻦ ﺩﻭ ﺁﺭﺍﻳﻪ ﺭﺍ ﺑﺮﺍﺑﺮ ﺑﺎ m1+m2ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﻢ .ﺑﺎ ﻓـﺮﺽ
ﺩﺍﺷﺘﻦ nﻓﺂﻳﻞ ﻣﺮﺗﺐ ،ﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺭﻭﺷﯽ ﺟﻬﺖ ﺍﺩﻏﺎﻡ ﺩﻭﺩﻭﻳﻲ ﻭ ﺑﻬﻴﻨﻪ )ﮐﻤﺘـﺮﻳﻦ ﻫﺰﻳﻨـﻪ( ﺍﻳـﻦ nﻓﺎﻳـﻞ ﻣﻴﺒﺎﺷـﺪ.
ﻣﻴﺪﺍﻧﻴﻢ ﮐﻪ nﻓﺎﻳﻞ ﺭﺍ ﺑﻪ ﻃﺮﻕ ﻣﺨﺘﻠﻔﯽ ﻣﻴﺘﻮﺍﻥ ﺍﺩﻏﺎﻡ ﮐﺮﺩ ﮐﻪ ﻫﺮ ﻃﺮﻳﻖ ﺍﺩﻏﺎﻡ ﺩﺍﺭﺍﯼ ﺩﺭﺧﺖ ﺍﺩﻏﺎﻡ ﻣﺨﺼـﻮﺹ ﺑـﻪ ﺧـﻮﺩ
ﺍﺳﺖ .ﺍﻟﮕﻮﺭﻳﺘﻤﻲ ﺑﺮﺍﻱ ﺳﺎﺧﺖ ﺑﻬﺘﺮﻳﻦ ﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﺍﺩﻏﺎﻡ ﻛﻪ ﺩﺍﺭﺍﻱ ﻛﻤﺘـﺮﻳﻦ ﻣﻘﺎﻳﺴـﻪ ﺟﻬـﺖ ﺭﺳـﻴﺪﻥ ﺍﺯ ﺑﺮﮔﻬـﺎﻱ
ﺩﺭﺧﺖ ﺑﻪ ﺭﻳﺸﻪ ﺁﻥ ﻣﻲﺑﺎﺷﺪ ﻣﻮﺭﺩ ﻧﻈﺮ ﺍﺳﺖ.
ﻣﺜﺎﻝ :ﺍﮔﺮ ﺳﻪ ﻓﺎﻳﻞ ﺑﻪ ﺍﻧﺪﺍﺯﻩ ﻫﺎﯼ ۲۰ ،۱۰ﻭ ۳۰ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﺑﻪ ۳ﻃﺮﻳﻖ ﻣﻴﺘﻮﺍﻥ ﺁﻧﻬﺎ ﺭﺍ ﺍﺩﻏﺎﻡ ﮐـﺮﺩ ﮐـﻪ ﮐﻤﺘـﺮﻳﻦ ﻫﺰﻳﻨـﻪ
ﺍﺩﻏﺎﻡ ﺑﺮﺍﺑﺮ ﺑﺎ ۹۰ﻣﻴﺒﺎﺷﺪ .ﺩﺭ ﺯﻳﺮ ﻫﺮ ﺳﻪ ﺩﺭﺧﺖ ﺍﺩﻏﺎﻡ ﺭﺍ ﻣﻴﺒﻴﻨﻴﻢ:
٢
+
+
+
+ +
+ +
+ +
+ +
× ×
=
+ +
× ×
=
+ +
× ×
=
ﻟﺬﺍ ﺍﮔﺮ ﺑﺨﻮﺍﻫﻴﻢ ﻫﻤﻪ ﺩﺭﺧﺘﻬﺎﯼ ﺍﺩﻏﺎﻡ ﺭﺍ ﺗﻮﻟﻴﺪ ﮐﺮﺩﻩ ﻭ ﮐﻢ ﻫﺰﻳﻨﻪ ﺗﺮﻳﻦ ﺁﻧﻬﺎ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﮐﻨﻴﻢ ﻫﺰﻳﻨﻪ ﺑﺴﻴﺎﺭ ﺯﻳﺎﺩﯼ ﺭﺍ ﺑﺎﻳـﺪ
ﭘﺮﺩﺍﺧﺖ ﮐﺮﺩ! .ﻟﺬﺍ ﻧﻴﺎﺯ ﺑﻪ ﺍﻟﮕﻮﺭﻳﺘﻤﯽ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﺯﻣﺎﻥ ﭼﻨﺪ ﺟﻤﻠﻪﺍﯼ ﺑﻬﺘﺮﻳﻦ ﺩﺭﺧﺖ ﺍﺩﻏﺎﻡ ﺭﺍ ﺗﻮﻟﻴﺪ ﮐﻨﺪ.
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺳﺎﺧﺖ ﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﺑﺎ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ:
dist (v i ) = level (v i ) − 1
ﺗﻌﺮﻳﻒ :ﻓﺎﺻﻠﻪ ﺍﺯ ﺭﻳﺸﻪ
ﺗﻌﺮﻳﻒ :ﻣﻘﺪﺍﺭ ﻫﺰﻳﻨﻪﺍﻱ ﻛﻪ ﺑﺎﻳﺪ ﺻـﺮﻑ ﮐـﺮﺩ ﺗـﺎ nﻓﺎﻳـﻞ ﺑﺼـﻮﺭﺕ ﺩﻭﺩﻭﻳـﻲ ﺍﺩﻏـﺎﻡ ﺷـﻮﻧﺪ (WEPL=Weighted
).External Path Length
n
= W ep1 ∑dist (v
i =1
)
i ∗ cos t v i ) (
٢٣ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﺗﻮﺿﻴﺢ ﺍﻟﮕﻮﺭﻳﺘﻢ :ﺑﺮﺍﻱ ﺑﺪﺳﺖ ﺁﻭﺭﺩﻥ ﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﺑـﺎ ﻛﻤﺘـﺮﻳﻦ ﻫﺰﻳﻨـﻪ ﻳـﻚ ﻧـﻮﺩ ﺟﺪﻳـﺪ ﻣﻴﺴـﺎﺯﻳﻢ ﻭ ﺳـﭙﺲ ﻛـﻢ
ﺍﺭﺯﺵﺗﺮﻳﻦ ﻧﻮﺩ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﮐﺮﺩﻩ ﻭ ﺑﻪ ﻋﻨﻮﺍﻥ ﻓﺮﺯﻧﺪ ﭼـﭗ ) (left childﮔـﺮﻩ ﺟﺪﻳـﺪ ﺩﺭﺝ ﻣﻴﮑﻨـﻴﻢ ﻭ ﺁﻥ ﺭﺍ ﺍﺯ ﻟﻴﺴـﺖ
ﺣﺬﻑ ﻣﻲﻛﻨﻴﻢ ﺳﭙﺲ ﺩﻭﺑﺎﺭﻩ ﻫﻤﻴﻦ ﻛﺎﺭ ﺭﺍ ﺑﺮﺍﻱ ﻓﺮﺯﻧﺪ ﺳﻤﺖ ﺭﺍﺳﺖ) (rightchildﺍﻧﺠﺎﻡ ﻣﻲﺩﻫﻴﻢ .ﺳﭙﺲ ﮔـﺮﻩ ﺟﺪﻳـﺪ
ﺭﺍ ﺑﻪ ﻟﻴﺴﺖ ﺍﺿﺎﻓﻪ ﻣﻴﮑﻨﻴﻢ .ﺗﺎ ﻣﺎﺩﺍﻣﻲ ﺍﻳﻦ ﻛﺎﺭ ﺭﺍ ﺍﻧﺠﺎﻡ ﻣﻲﺩﻫﻴﻢ ﻛﻪ ﻫﻤﺔ ﻧﻮﺩﻫﺎﻱ ﻟﻴﺴﺖ )ﺑﻪ ﺟﺰ ﺁﺧﺮﯼ( ﺍﺯ ﻟﻴﺴﺖ ﺣﺬﻑ
ﺷﻮﻧﺪ .ﮐﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻣﻮﺭﺩ ﻧﻈﺮ ﺭﺍ ﺩﺭ ﺯﻳﺮ ﻣﯽﺑﻴﻨﻴﻢ:
)Function construct_tree(L,n
For i1 to n-1 do
ﺭﻭﻳﻪ) :least(Lﺩﺭ ﻟﻴﺴﺖ ﮐﻤﺘـﺮﻳﻦ ﻣﻘـﺪﺍﺭ ﺭﺍ ﭘﻴـﺪﺍ ﻛـﺮﺩﻩ ﺁﻥ ﺭﺍ ﺣـﺬﻑ ﻛـﺮﺩﻩ ﻭ
)Get node(T
)Lchild(T) least(L ﺁﺩﺭﺳﺶ ﺭﺍ ﺑﺮﻣﻲﮔﺮﺩﺍﻧﺪ.
)Rchild(T) least(L
))Cost(T) cost(Lchild(T))+cost(Rchild(T
)Insert(L,T
Repeat
)Return least(L
end .
:Selectﻫﺮ ﺑﺎﺭ ﺩﻭ minﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻴﮑﻨﺪ.
:Feasibilityﻧﺪﺍﺭﺩ
:Unionﺑﻌﺪ ﺍﺯ ﭘﻴﻮﻧﺪ ﺑﻪ ﮔﺮﻩ ﺟﺪﻳﺪ ﺑﻪ ﻟﻴﺴﺖ ﺍﻭﻟﻴﻪ ﺍﺿﺎﻓﻪ ﻣﻲﻛﻨﺪ.
ﺷﮑﻞ ﺯﻳﺮ ﺭﻭﻧﺪ ﺳﺎﺧﺘﻪ ﺷﺪﻥ ﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﺍﺩﻏﺎﻡ ﺑﻬﻴﻨﻪ ﺭﺍ ﺑﺮ ﺭﻭﯼ ﺩﺍﺩﻩ ﻫﺎﯼ ﻭﺭﻭﺩﯼ ۷ ،۵ ،۳ ،۲ﻭ ۱۰ﻧﺸﺎﻥ ﻣﻴﺪﻫﺪ.
١
١ ٠
٧
١
٢
٧
٧
١ ٠
٣
٧
٧
١ ٧
١ ٠
١ ٠
٢
٢
٣
٣
٢
٧ ٣
٢٤ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﮓ
Huffman
٣ ٣
ﻳ ﻛ
- -
ﻨ ﺪ
ﻳﮑﯽ ﺍﺯ ﮐﺎﺭﺑﺮﺩﻫﺎﯼ ﻣﺴﺌﻠﻪ ﺍﺩﻏﺎﻡ ﺩﻭﺩﻭﻳﻲ ﻓﺎﻳﻠﻬﺎ ﺩﺭ ﮐﺪﻳﻨﮓ ﻫﺎﻓﻤﻦ ﺍﺳﺖ ﮐﻪ ﺟﻬﺖ ﻓﺸﺮﺩﻩ ﺳﺎﺯﯼ ﻓﺎﻳﻠﻬﺎ ﻳـﺎ ﺍﺭﺳـﺎﻝ ﮐـﻢ
ﺣﺠﻤﺘﺮ ﺍﻃﻼﻋﺎﺕ ﺑﺮ ﺭﻭﯼ ﺧﻄﻮﻁ ﺷﺒﮑﻪ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻴﮕﻴﺮﺩ .ﺩﺭ ﺍﺑﺘﺪﺍ ﻳﻚ ﺟﺪﻭﻝ ﺩﺭﻧﻈـﺮ ﻣـﻲﮔﻴـﺮﻳﻢ ﺩﺭ ﺳـﺘﻮﻥ
ﺍﺑﺘﺪﺍﻳﻲ ﻣﻘﺎﺩﻳﺮ )ﺩﺍﺩﻩﻫﺎ( ﺭﺍ ﻭﺍﺭﺩ ﻣﻲﻛﻨﻴﻢ ﺩﺭ ﺳﺘﻮﻥ ﺩﻭﻡ ﺗﻌﺪﺍﺩ ﺗﻜﺮﺍﺭ ﺩﺍﺩﻩﻫـﺎ ﺭﺍ ﻣﺤﺎﺳـﺒﻪ ﻛـﺮﺩﻩ ﻭ ﺑﺮﺍﺳـﺎﺱ ﺁﻥ ﺩﺭﺧـﺖ
ﺩﻭﺩﻭﻳﻲ ﺭﺍ ﻃﺒﻖ ﺍﻟﮕﻮﺭﻳﺘﻢ Constract-treeﻣﻲﺳﺎﺯﻳﻢ ﺳﭙﺲ ﻳﺎﻝﻫﺎﻱ ﭼﭗ ﺭﺍ ﺻﻔﺮ ﻭ ﻳﺎﻝﻫﺎﻱ ﺭﺍﺳﺖ ﺭﺍ ﻳﻚ ﺩﺭ ﻧﻈـﺮ
ﻣﻲﮔﻴﺮﻳﻢ ﺩﺭ ﺳﺘﻮﻥ ﺁﺧﺮ ﺟﺪﻭﻝ ﻛﺪﻫﺎﻱ ﺟﺪﻳﺪ ﺭﺍ ﮐﻪ ﺑﺮﭼﺴﺐ ﻳﺎﻟﻬﺎﯼ ﺩﺭﺧﺖ ﺣﺎﺻﻠﻪ ﺍﺯ ﺭﻳﺸـﻪ ﺗـﺎ ﻫـﺮ ﺑـﺮﮒ ﺍﺳـﺖ ﺭﺍ
ﺩﺭﺝ ﻣﻲﻛﻨﻴﻢ .ﺍﻳﻦ ﺑﺮﭼﺴﺒﻬﺎ ﺭﺍ ﻛﺪﻳﻨﮓ ﻫﺎﻓﻤﻦ ﻣﻴﻨﺎﻣﻴﻢ .ﺑﺮﭼﺴﺒﻬﺎﯼ ﺟﺪﻳﺪ ﮐﺪﻫﺎﯼ ﺟﺎﻳﮕﺰﻳﻦ ﮐﺪﻫﺎﯼ ﻗﺒﻠﯽ ﺧﻮﺍﻫﻨـﺪ ﺷـﺪ
ﮐﻪ ﺩﺭ ﻓﺸﺮﺩﻩ ﺳﺎﺯﯼ ﻓﺎﻳﻠﻬﺎ ﺣﺠﻢ ﮐﻤﺘﺮﯼ ﺭﺍ ﺑﻪ ﺧﻮﺩ ﺍﺧﺘﺼﺎﺹ ﻣﻴﺪﻫﺪ .ﺟﻬﺖ ﺑﺎﺯﮔﺮﺩﺍﻧﺪﻥ ﻓﺎﻳﻞ ﺑﻪ ﺣﺎﻟـﺖ ﺍﻭﻟﻴـﻪ ﻧﻴـﺰ ﺍﺯ
ﺑﺮﻋﮑﺲ ﻫﻤﻴﻦ ﺭﻭﺵ ﻣﻴﺘﻮﺍﻥ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ)ﺑﺪﻳﻬﯽ ﺍﺳﺖ ﮐﻪ ﺑﺎﻳﺪ ﺍﻃﻼﻋﺎﺗﯽ ﺩﺭ ﻓﺎﻳﻞ ﻓﺸﺮﺩﻩ ﺷﺪﻩ ﻗﺮﺍﺭ ﺩﺍﺩ ﮐﻪ ﺍﺯ ﺭﻭﯼ ﺁﻧﻬﺎ
ﺑﺘﻮﺍﻥ ﻣﺠﺪﺩﺍﹰ ﺩﺭﺧﺖ ﮐﺪﻳﻨﮓ ﺭﺍ ﺳﺎﺧﺖ(!.
ﻓﺎﻳﻞ ﺍﻭﻟﻴﻪ
١٠٠ ١١٠ ٠١١ ٠١١ ١٠٠ ٠١٠ ١٠٠
ﻓﺎﻳﻞ ﻧﻬﺎﻳﻲ
۰ ۱۰۱ ۱۱ ۱۱ ۰ ۱۰۰ ۰
٢٥ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
7
1
0
0 4
2 1
0 1
۴
۳
- -
ﻢ ﻤ
ﻣﺴﺌﻠﻪ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺑﺮ ﺭﻭﯼ ﻳﮏ ﮔﺮﺍﻑ ﻫﻤﺒﻨﺪ ﻭﺯﻧﺪﺍﺭ ﺍﺯ ﺟﻤﻠﻪ ﻣﺴﺎﺋﻞ ﭘـﺮ ﮐـﺎﺭﺑﺮﺩﯼ ﺩﺭ
ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﮔﺮﺍﻑ ﻣﺤﺴﻮﺏ ﻣﻴﺸﻮﺩ .ﮔﺮﺍﻑ ﻫﻤﺒﻨﺪ ﻭﺯﻧﺪﺍﺭ ) G(V,Eﻣﻔﺮﻭﺽ ﺍﺳﺖ ،ﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺯﻳﺮﮔﺮﺍﻓـﻲ ﺍﺯ
Gﺍﺳﺖ ﮐﻪ ﺩﺍﺭﺍﯼ ﺧﻮﺍﺹ ﺯﻳﺮ ﺑﺎﺷﺪ:
-۷ﺷﺎﻣﻞ ﻫﻤﻪ ﮔﺮﻩ ﻫﺎﯼ Vﺑﺎﺷﺪ
-۸ﻫﻤﺒﻨﺪ ﻭ ﺑﺪﻭﻥ ﺣﻠﻘﻪ ﺑﺎﺷﺪ
-۹ﺩﺭ ﺑﻴﻦ ﮐﻠﻴﻪ ﺯﻳﺮﮔﺮﺍﻓﻬﺎﻳﻲ ﮐﻪ ﺷﺮﻁ ۱ﻭ ۲ﺭﺍ ﺩﺍﺭﻧﺪ ﺩﺍﺭﺍﯼ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺑﺎﺷﺪ
ﺑﺮﺍﯼ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﻣﺘﻌﺪﺩﯼ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺍﺯ ﺑﻴﻦ ﺁﻧﻬﺎ ﺑﻪ ﺑﻴﺎﻥ ﺩﻭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﮐﻪ ﺭﻭﺵ ﻃﺮﺍﺣﯽ ﺁﻧﻬﺎ ﺣﺮﻳﺼـﺎﻧﻪ
ﺍﺳﺖ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
ﻧﮑﺘﻪ :ﺍﮔﺮ ﮔﺮﺍﻑ ﻭﺭﻭﺩﯼ ﻫﻤﺒﻨﺪ ﻧﺒﺎﺷﺪ ،ﺩﺍﺭﺍﯼ ﺩﺭﺧﺖ ﭘﻮﺷﺎ ﻧﻴﺴﺖ.
ﻧﮑﺘﻪ :ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﻳﮏ ﮔﺮﺍﻑ ﺑﺎ nﺭﺍﺱ ﺩﻗﻴﻘﺎﹰ ﺩﺍﺭﺍﯼ n-1ﻳﺎﻝ ﻣﻴﺒﺎﺷﺪ .ﺍﮔﺮ ﻳﮏ ﻳﺎﻝ ﺑﻪ ﺁﻥ ﺍﺿﺎﻓﻪ ﮐﻨﻴﻢ ﺷـﺮﻁ ﺑـﺪﻭﻥ
ﺣﻠﻘﻪ ﺑﻮﺩﻥ ﺁﻥ ﻧﻘﺾ ﻣﻴﺸﻮﺩ ﻭ ﺍﮔﺮ ﻳﮏ ﻳﺎﻝ ﺍﺯ ﺁﻥ ﺣﺬﻑ ﮐﻨﻴﻢ ﺷﺮﻁ ﻫﻤﺒﻨـﺪ ﺑـﻮﺩﻥ ﺁﻥ ﻧﻘـﺾ ﺧﻮﺍﻫـﺪ ﺷـﺪ .ﺩﺭ ﻧﺘﻴﺠـﻪ
ﻣﻴﺘﻮﺍﻥ ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﻳﮏ ﮔﺮﺍﻑ ﺑﺎ nﺭﺍﺱ ﺭﺍ ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﺗﻌﺮﻳﻒ ﮐﺮﺩ :ﺯﻳﺮ ﺩﺭﺧﺘﯽ ﺍﺯ ﮔﺮﺍﻑ ﮐـﻪ ﺩﺍﺭﺍﯼ n-1ﻳـﺎﻝ
ﻣﻴﺒﺎﺷﺪ.
kruskal
( ) ﻝ
ﺎ ﺷ
ﺩﺭ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻳﮏ ﻳﺎﻝ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺍﺯ ﮔﺮﺍﻑ ﻭﺭﻭﺩﯼ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩ ﻭ ﺍﺯ ﮔﺮﺍﻑ ﺣﺬﻑ ﺷـﺪﻩ ﻭ ﺩﺭ
ﺻﻮﺭﺗﻴﮑﻪ ﺍﺿﺎﻓﻪ ﮐﺮﺩﻥ ﺁﻥ ﺑﻪ ﺩﺭﺧﺖ ﻣﻮﺟﺐ ﺍﻳﺠﺎﺩ ﺣﻠﻘﻪ ﻧﺸﻮﺩ ﺁﻥ ﺭﺍ ﺑﻪ ﺩﺭﺧﺖ ﻣﻮﺭﺩ ﻧﻈـﺮ )ﮐـﻪ ﺩﺭ ﺍﺑﺘـﺪﺍﯼ ﺍﻟﮕـﻮﺭﻳﺘﻢ
٢٦ (Greedy) ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ
ﺷـﺒﻪ ﮐـﺪ. ﻳﺎﻝ ﺑﻪ ﺩﺭﺧﺖ ﺍﺿﺎﻓﻪ ﻧﺸﺪﻩ ﺍﺳـﺖ ﺍﺩﺍﻣـﻪ ﻣﻴﺎﺑـﺪn-1 ﺍﻳﻦ ﻋﻤﻞ ﺗﺎ ﺯﻣﺎﻧﻴﮑﻪ ﺗﻌﺪﺍﺩ.ﺧﺎﻟﯽ ﺍﺳﺖ( ﺍﺿﺎﻓﻪ ﻣﻴﮑﻨﻴﻢ
.ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍ ﺩﺭ ﺷﮑﻞ ﺯﻳﺮ ﻣﻴﺒﻴﻨﻴﻢ
Procedure kruskal
T ∅ 11
While ( |T| < n-1 ) and ( |E| ≠ 0 ) do
Select edge e from E with minimum cost a d 3
7
Delete e from E 10
If e does not create a cycle in T then 2 9 f
c
add e to T 5 4
endif b 8
repeat e
if |T| < n-1 then write ('no spanning Tree ') endif 6
end.
:ﻣﺮﺍﺣﻞ ﺳﺎﺧﺖ ﺩﺭﺧﺖ
a d 3
a
2 f
2
b b
a d 3 a d 3
2 f f
c 2 c
4 5 4
b b
e e
a d 3
2 f
c
5 4
8
b
e
٢٧ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﻲ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﺑﻬﺘﺮﻳﻦ ﭘﻴﺎﺩﻩ ﺳﺎﺯﯼ ﺑﺮﺍﺑﺮ ﺑﺎ ) O(e. log nﻣﻴﺒﺎﺷﺪ!.
Prim
٢ ٤ ٣
ﺍﻟﮕﻮﺭﻳﺘﻢ ﭘﺮﻳﻢ ،ﻣﺎﻧﻨﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍﺷﺎﻝ ﺩﺭ ﻫﺮ ﺯﻣﺎﻥ ﻳﮏ ﻟﺒﻪ ﺍﺯ ﺩﺭﺧﺖ ﭘﻮﺷﺎﻱ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺭﺍ ﻣﻲﺳﺎﺯﺩ .ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ
ﭘﺮﻳﻢ ﺍﺯ ﻳﮏ ﺭﺍﺱ ﺩﻟﺨﻮﺍﻩ ﺷﺮﻭﻉ ﮐﺮﺩﻩ ﻭ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﻳﺎﻝ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﮐﻪ ﻳﮏ ﺭﺍﺱ ﻣﺠﺎﻭﺭ ﺁﻥ ﺩﺭ ﺩﺭﺧﺖ ﺑﻮﺩﻩ ﻭ
ﺭﺍﺱ ﺩﻳﮕﺮﺵ ﺩﺭ ﺩﺭﺧﺖ ﻧﺒﺎﺷﺪ ﺭﺍ ﺑﻪ ﺁﻥ ﺍﺿﺎﻓﻪ ﻣﻴﮑﻨﻴﻢ .ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ،ﻣﺠﻤﻮﻋﻪ ﻟﺒﻪﻫﺎﻱ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩ ﻳـﮏ ﺩﺭﺧـﺖ ﺭﺍ
ﺗﺸﮑﻴﻞ ﻣﻲﺩﻫﻨﺪ ﻭ ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﺩﺭﺧﺖ ﮔﺴﺘﺮﺵ ﻣﻴﺎﺑﺪ .ﺩﺭﻣﻘﺎﺑﻞ ،ﻣﺠﻤﻮﻋﻪ ﻟﺒﻪﻫﺎﻱ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩ ﺩﺭ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﺭﺍﺷـﺎﻝ
ﺩﺭ ﻫﺮﻣﺮﺣﻠﻪ ﻳﮏ ﺟﻨﮕﻞ ﺭﺍ ﺗﺸﮑﻴﻞ ﻣﻲﺩﻫﻨﺪ .ﺷﺒﻪ ﮐﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍ ﺩﺭ ﺷﮑﻞ ﺯﻳﺮ ﻣﻴﺒﻴﻨﻴﻢ.
)Procdure prim(v,E,T
∅T
}Tv{1
While |T| < n-1 do
Select e= (u,v) with minimum cost from E such that u∈Tv and v∉Tv
if there is no any such edge then ! رأس ل
رد در دا "#& Tvو رأس د."#$ %
exit ا# +ط در )
ر( &,ار (
#د آ1 2اف ا) (/ه."#$ "4$-
endif
add e to T
add v to Tv
repeat
if |T|<n-1 then write ('no spanning tree') endif
end.
ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﻲ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﺑﻬﺘﺮﻳﻦ ﭘﻴﺎﺩﻩ ﺳﺎﺯﯼ ﺑﺮﺍﺑﺮ ﺑﺎ ) O(e. log nﻣﻴﺒﺎﺷﺪ!.
ﺩﺭﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ:
Select : ﻫﺰﻳﻨﻪ ﻛﻤﺘﺮ ﺑﺎ ﺷﺮﺍﻳﻂ ﺧﺎﺹ
ﺑﻪ ﻋﻠﺖ ﻧﺤﻮﻩ ﺍﻧﺘﺨﺎﺏ ﻳﺎﻝﻫﺎ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ feasibility :
Prim Kruskal
ﻘ
ﻪ
ﺎ
ﺩﻭ ﺍﻟﮕﻮﺭﻳﺘﻢ primﻭ kruskalﺩﺭﺻﻮﺭﺗﻲ ﺩﻭ ﺩﺭﺧﺖ ﻣﺘﻔﺎﻭﺕ ﺗﻮﻟﻴﺪ ﻣﻴﮑﻨﻨﺪ ﻛﻪ ﭼﻨﺪﻳﻦ ﻳﺎﻝ ﺑﺎ ﻫﺰﻳﻨـﻪﻫـﺎﻱ ﻣﺴـﺎﻭﻱ
ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﻭﻟﯽ ﻫﻤﻴﺸﻪ ﻫﺰﻳﻨﻪ ﺩﺭﺧﺘﻬﺎﯼ ﺗﻮﻟﻴﺪ ﺷﺪﻩ ﺑﺮﺍﺑﺮ ﻭ ﮐﻤﻴﻨﻪ ﺍﺳﺖ .ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ Primﺩﺭ ﺍﺑﺘﺪﺍ ﻳﻚ ﮔﺮﻩ ﺑﻮﺩﻩ ﻭ
ﮐﻢ ﮐﻢ ﺩﺭ ﺣﻴﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﮔﺴﺘﺮﺵ ﻣﻴﺎﺑﺪ ﺗﺎ ﺑﻪ ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﮐﻤﻴﻨﻪ ﺗﺒﺪﻳﻞ ﺷﻮﺩ ﺩﺭﺣﺎﻟﻴﻜﻪ ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ kruskalﭼﻨﺪ
ﺩﺭﺧﺖ )ﺟﻨﮕﻞ( ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﻛﻪ ﺩﺭ ﺍﻧﺘﻬﺎﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭﺧﺘﻬﺎﯼ ﺟﻨﮕﻞ ﺑﻪ ﻫﻢ ﭘﻴﻮﻧﺪ ﺧﻮﺭﺩﻩ ﺗﺎ ﺗﺒﺪﻳﻞ ﺑﻪ ﺩﺭﺧـﺖ ﭘﻮﺷـﺎﯼ
ﮐﻤﻴﻨﻪ ﺷﻮﻧﺪ.
Kn
٤ ٤ ٣
ﺩﺭ ﺍﻳﻦ ﺑﺨﺶ ﺑﻪ ﺑﻴﺎﻥ ﻗﻀﻴﻪ ﻣﻬﻤﯽ ﺩﺭ ﻣﻮﺭﺩ ﺗﻌﺪﺍﺩ ﺩﺭﺧﺘﻬﺎﯼ ﭘﻮﺷﺎ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
ﻣﺜﺎﻝ :ﺩﺭﺧﺘﻬﺎﯼ ﭘﻮﺷﺎﯼ K4ﺭﺍ ﺑﺪﺳﺖ ﺁﻭﺭﻳﺪ:
٢٨ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﻗﻀﻴﻪ :ﺛﺎﺑﺖ ﻛﻨﻴﺪ ﺗﻌﺪﺍﺩ ﺩﺭﺧﺘﻬﺎﻱ ﭘﻮﺷﺎﻱ ) knﮔﺮﺍﻑ ﮐﺎﻣﻞ ﺑﺎ nﺭﺍﺱ( ﺑﺮﺍﺑﺮ nn-2ﺍﺳﺖ.
ﺍﺛﺒﺎﺕ :ﺍﺯ ﺭﻭﺵ ﺯﻳﺮ ﺑﺮﺍﻱ ﺍﺛﺒﺎﺕ ﻗﻀﻴﻪ ﺑﺎﻻ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲﻛﻨﻴﻢ:
ﺍﺑﺘﺪﺍ ﻧﺸﺎﻥ ﻣﻴﺪﻫﻴﻢ ﮐﻪ ﻫﺮ ﺩﺭﺧﺖ ﭘﻮﺷﺎ ﺑﺎ nﺭﺃﺱ ﺩﺭ ﺗﻨﺎﻇﺮ ﻳﻚ ﺑﻪ ﻳﻚ ﻳﺎ ﻳﻚ ﺭﺷﺘﻪ n-2ﺣﺮﻓﻲ ﺭﻭﻱ nﺣﺮﻑ ﺍﺳﺖ ﻭ
ﺳﭙﺲ ﭼﻮﻥ ﺗﻌﺪﺍﺩ ﺭﺷﺘﻪ ﻫﺎﯼ n-2ﺣﺮﻓﯽ ﺭﻭﯼ nﺣﺮﻑ ﺑﺮﺍﺑﺮ ﺑﺎ nn-2ﺍﺳﺖ ﻗﻀﻴﻪ ﺛﺎﺑﺖ ﻣﻴﺸﻮﺩ.
ﺑﺎﻳﺪ ﺍﺯ ﻫﺮﺩﺭﺧﺖ ﭘﻮﺷﺎ ﺑﻪ ﻳﻚ ﺭﺷﺘﻪ ﺑﺮﺳﻴﻢ ﻭ ﺑﺮﻋﻜﺲ .ﺑﺎ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺯﻳﺮ ﻣﻴﺘﻮﺍﻥ ﺑﺮﺍﯼ ﻫﺮ ﺩﺭﺧﺖ ﭘﻮﺷﺎ ﻳـﮏ ﺭﺷـﺘﻪ n-2
ﺣﺮﻓﯽ ﻳﮑﺘﺎ ﺗﻮﻟﻴﺪ ﮐﺮﺩ.
-۱ﺑﻪ ﺍﺯﺍﯼ iﺍﺯ ۱ﺗﺎ n-2ﻣﺮﺣﻠﻪ ۲ﺭﺍ ﺗﮑﺮﺍﺭ ﮐﻨﻴﺪ:
-۲ﮐﻮﭼﮑﺘﺮﻳﻦ )ﺍﺯ ﻟﺤﺎﻅ ﺗﺮﺗﻴﺐ ﺍﻟﻔﺒﺎﻳﻲ ﻳﺎ ﻋﺪﺩﻱ( ﺑﺮﮒ )ﺭﺍﺱ ﺑﺎ ﺩﺭﺟﻪ (۱ﺭﺍ ﺍﺯ ﺩﺭﺧـﺖ ﺣـﺬﻑ ﮐـﺮﺩﻩ ﻭ ﺭﺍﺱ
ﻣﺠﺎﻭﺭ ﻳﺎﻝ ﻣﺮﺑﻮﻁ ﺑﻪ ﺁﻥ ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ iﺍﻣﻴﻦ ﻋﻨﺼﺮ ﺭﺷﺘﻪ ﻣﺤﺴﻮﺏ ﻣﻴﮑﻨﻴﻢ.
١ ٢ ٣ ٤
c c d d
a
b
c
d
f e
٢٩ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﻣﺮﺣﻠﻪ ﺍﻭﻝ:
c
b
c
d
f e
ﻣﺮﺣﻠﻪ ﺩﻭﻡ:
c c c
d
f e
ﻣﺮﺣﻠﻪ ﺳﻮﻡ:
c c d
d
f e
ﻣﺮﺣﻠﻪ ﭼﻬﺎﺭﻡ:
c c d d
d
f
ﻋﻜﺲ ﺭﻭﺵ ﺑﺎﻻ )ﺭﺳﻴﺪﻥ ﺍﺯ ﺭﺷﺘﻪ ﺑﻪ ﺩﺭﺧﺖ(:
ﺑﺎﺗﻮﺟﻪ ﺑﻪ ﻣﺜﺎﻝ ﺑﺎﻻ ﻃﻮﻝ ﺭﺷﺘﻪ ﻣﻮﺭﺩﻧﻈﺮ ﺭﺍ ﺑﺎ ﺩﻭ ﺟﻤﻊ ﻛﺮﺩﻩ ﺗﻌﺪﺍﺩ ﺭﺋﻮﺱ ﺑﺪﺳﺖ ﻣﻲﺁﻳﺪ ﺳﭙﺲ ﺩﺭ ﻣﺮﺣﻠﻪ ﺑﻌﺪ ﺟـﺪﻭﻟﻲ
ﺍﺯ ﻛﻠﻴﻪ ﺣﺮﻭﻑ ﺗﻬﻴﻪ ﻣﻲﻛﻨﻴﻢ ﺣﺎﻝ ﺗﻌﺪﺍﺩ ﺗﻜﺮﺍﺭ ﻫﺮ ﺣـﺮﻑ ﺩﺭ ﺭﺷـﺘﻪ ﺭﺍ ﺑـﻪ ﺍﺿـﺎﻓﻪ ﻳـﻚ ﻣـﻲﻛﻨـﻴﻢ ﻭ ﺩﺭ ﺟـﺪﻭﻝ ﻗـﺮﺍﺭ
٣٠ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﻣﻲﺩﻫﻴﻢ)ﻗﺎﺑﻞ ﺫﮐﺮ ﺍﺳﺖ ﮐﻪ ﺩﺭﺟﻪ ﻫﺮ ﮔﺮﻩ ﺩﺭ ﺩﺭﺧﺖ ﭘﻮﺷﺎ ﺑﺮﺍﺑﺮ ﺑﺎ ﻳﮑﯽ ﺑﻴﺸﺘﺮ ﺍﺯ ﺗﻌﺪﺍﺩ ﺩﻓﻌﺎﺕ ﻇﻬـﻮﺭ ﮔـﺮﻩ ﺩﺭ ﺭﺷـﺘﻪ
ﺍﺳﺖ(.
-۱ﺑﻪ ﺍﺯﺍﯼ iﺍﺯ ۱ﺗﺎ n-2ﻣﺮﺣﻠﻪ ۲ﻭ ۳ﺭﺍ ﺗﮑﺮﺍﺭ ﮐﻨﻴﺪ:
-۲ﮐﻮﭼﮑﺘﺮﻳﻦ ﺭﺍﺱ ﺑﺎ ﺩﺭﺟﻪ ۱ﺩﺭ ﺟﺪﻭﻝ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﮐﺮﺩﻩ ﻭ ﻳﺎﻟﯽ ﺑﻴﻦ ﺁﻥ ﺭﺍﺱ ﻭ ﺣﺮﻑ iﺍﻡ ﺭﺷﺘﻪ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻴﺪ.
-۳ﺍﺯ ﺩﺭﺟﻪ ﺩﻭ ﺭﺍﺳﯽ ﮐﻪ ﺩﺭ ﻣﺮﺣﻠﻪ ۲ﺑﻴﻦ ﺁﻧﻬﺎ ﻳﺎﻟﯽ ﺑﺮﻗﺮﺍﺭ ﺷﺪ ﻳﮏ ﻭﺍﺣﺪ ﮐﻢ ﮐﻨﻴﺪ
-۴ﻳﺎﻟﯽ ﺑﻴﻦ ﺩﻭ ﺭﺍﺱ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻴﺪ.
ﻣﺜﺎﻝ:
a b c d e f
1 1 3 3 1 1
ﺷﺮﻭﻉ ﮐﺎﺭ:
a b
c
d
f e
ﻣﺮﺣﻠﻪ ﺍﻭﻝ:
ﺑﺎ ﺣﺮﻛﺖ ﺍﺯ ﺳﺮﺭﺷﺘﻪ )ﻛﻪ cﻣﻲﺑﺎﺷﺪ( ﻭ ﺑﺎﺗﻮﺟﻪ ﺑﻪ ﺟﺪﻭﻝ ﻛﻮﭼﻜﺘﺮﻳﻦ ﺑﺮﮒ ﺭﺍ ) (aﺍﻧﺘﺨﺎﺏ ﻣﻲﻛﻨـﻴﻢ ﺣـﺎﻝ ﺍﺯ ﺩﺭﺟـﻪ c
ﻳﻜﻲ ﻛﻢ ﻛﺮﺩﻩ ﻭ ﻫﻤﻴﻨﻄﻮﺭ ﺍﺯ ﺩﺭﺟﻪ ﺑﺮﮒ ﻛﻪ) (aﻣﻲﺑﺎﺷﺪ ﻭ ﺍﻳﻦ ﻛﺎﺭ ﺭﺍ ﺑﺮﺍﻱ ﻣﺮﺍﺣﻞ ﺑﻌﺪ ﻧﻴﺰ ﺍﻧﺠﺎﻡ ﻣﻲﺩﻫﻴﻢ.
a b c d e f
1 1 3 3 1 1
0 2
a b
f e
:ﻣﺮﺣﻠﻪ ﺩﻭﻡ
a b c d e f
1 1 3 3 1 1
0 0 2
1
c c d d
a b
f e
:ﻣﺮﺣﻠﻪ ﺳﻮﻡ
a b c d e f
1 1 3 3 1 1
0 0 2 2
1
0
٣٢ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
a b
c
d
f e
ﻣﺮﺣﻠﻪ ﭼﻬﺎﺭﻡ:
ﺩﺭ ﺍﻳﻦ ﻣﺮﺣﻠﻪ ﺩﻭ ﻧﻮﺩ ﺍﻧﺘﻬﺎﻳﻲ ﺭﺍ ﺑﻪ ﻳﻜﺪﻳﮕﺮ ﻭﺻﻞ ﻣﻲﻛﻨﻴﻢ.
c
d
f e
ﻣﺮﺣﻠﻪ ﺁﺧﺮ:
a b
c
d
f e
٣٣ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﺍ
٣
٥
ﻣ ﻫ ﻱ ﺎ ﻫ ﺮ ﺴ ﻣ ﻦ ﻳ ﺮ ﺘ ﻫ ﺎ ﺗ ﻮ ﻛ
- -
ﻢ
ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺑﺮﺭﺳﯽ ﻣﺴﺌﻠﻪ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎﯼ ﻫﻢ ﻣﺒـﺪﺍ ) (Single Source Shortest Pathsﻳـﺎ SSSP
ﻣﻴﭙﺮﺩﺍﺯﻳﻢ .ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﻣﺘﻌﺪﺩﯼ ﺑﺮﺍﯼ ﻣﺤﺎﺳﺒﻪ ﻃﻮﻝ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺑﻴﻦ ﺩﻭ ﮔﺮﻩ ﺩﺭ ﮔﺮﺍﻑ ﻭﺯﻧﺪﺍﺭ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺩﺭ
ﺍﻳﻦ ﻣﻴﺎﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ Dijkstraﺑﻪ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ﻃﺮﺍﺣﯽ ﺷﺪﻩ ﺍﺳﺖ ﻟﺬﺍ ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺑﻴﺎﻥ ﺁﻥ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ .ﺩﺭ ﺍﻳـﻦ
ﺍﻟﮕﻮﺭﻳﺘﻢ ﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﻃﻮﻝ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺍﺯ ﻳﻚ ﮔﺮﻩ ﻣﺒﺪﺍ ﻧﻈﻴـﺮ vﺑـﻪ ﮔـﺮﻩﻫـﺎﻱ ﺩﻳﮕـﺮ ﻣـﻲﺑﺎﺷـﺪ .ﺍﻟﮕـﻮﺭﻳﺘﻢ
ﺩﺍﻳﮑﺴﺘﺮﺍ ﺑﺮ ﺭﻭﯼ ﮔﺮﺍﻓﻬﺎﯼ ﻭﺯﻧﺪﺍﺭﯼ ﻗﺎﺑﻞ ﺍﺟﺮﺍﺳﺖ ﮐﻪ ﻫﺰﻳﻨﻪ ﻳﺎﻟﻬﺎ ﻧﺎﻣﻨﻔﯽ ﺑﺎﺷﺪ.
ﻓﺮﺿﻴﺎﺕ:
Dist[i]: ﻃﻮﻝ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺍﺯ ﺭﺍﺱ vﺑﻪ ﺭﺍﺱ i
n: ﺗﻌﺪﺍﺩ ﺭﺋﻮﺱ
V: ﻣﺒﺪﺃ:
cost: ﻣﺎﺗﺮﻳﺲ ﻫﺰﻳﻨﻪﻫﺎ:
p[i]: ﺭﺍﺳﯽ ﻗﺒﻞ ﺍﺯ ﺭﺍﺱ iﺑﺮ ﺭﻭﺱ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ
ﺩﺭ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﻣﺒﺪﺍ ﺑﻪ ﻫﺮ ﺭﺍﺱ ﮐﻢ ﮐﻢ ﻣﺤﺎﺳـﺒﻪ ﺷـﺪﻩ ﻭ ﺩﺭ ﻫـﺮ ﻣﺮﺣﻠـﻪ ﮐﻤﺘـﺮ ﻣﻴﺸـﻮﺩ ﺗـﺎ ﺩﺭ ﭘﺎﻳـﺎﻥ
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻪ ﮐﻤﺘﺮﻳﻦ ﺣﺪ ﺧﻮﺩ ﺑﺮﺳﺪ .ﺩﺭ ﺣﻴﻦ ﺍﺟﺮﺍﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻫﺮ ﺭﺍﺳﯽ ﮐﻪ ﻓﺎﺻﻠﻪ ﻣﺒﺪﺍ ﺑـﻪ ﺁﻥ ﺑﻄـﻮﺭ ﮐﺎﻣـﻞ ﻣﺤﺎﺳـﺒﻪ
ﺷﺪﻩ ﺑﻮﺩ ﻭ ﻣﻘﺪﺍﺭ ﺁﻥ ﺑﻪ ﮐﻤﺘﺮﻳﻦ ﺣﺪ ﺧﻮﺩ ﺭﺳﻴﺪﻩ ﺑﺎﺷﺪ ﺑﺮﭼﺴﺐ ﺩﺍﺋﻤﯽ ﺷﺪﻥ ) (s[w]=1ﺧﻮﺍﻫـﺪ ﺧـﻮﺭﺩ .ﺩﺭ ﺍﺑﺘـﺪﺍﯼ
ﮐﺎﺭ ﻫﻤﻪ ﺭﺋﻮﺱ ﺑﻪ ﻏﻴﺮ ﺍﺯ ﻣﺒﺪﺍ ﺩﺍﺭﺍﯼ ﺑﺮﭼﺴﺐ ﻣﻮﻗﺘﯽ ﻫﺴﺘﻨﺪ).(s[w]=0
:ﻣﺜﺎﻝ
ﺑـﺎP ﻭDist ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺒﺪﺍ ﺍﻧﺘﺨﺎﺏ ﮐﻨﻴﻢ ﺁﻧﮕﺎﻩ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﺗﻐﻴﻴﺮﺍﺗـﯽ ﺭﺍ ﺩﺭ ﺁﺭﺍﻳـﻪ۱ ﺍﮔﺮ ﺩﺭ ﮔﺮﺍﻑ ﺯﻳﺮﺍ ﺭﺍﺱ ﺷﻤﺎﺭﻩ
. ﻣﻴﺘﻮﺍﻥ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺭﺍ ﺭﺳﻢ ﮐﺮﺩp ﻭdist ﺑﺎﺗﻮﺟﻪ ﺑﻪ ﺳﺘﻮﻥ.ﺗﻮﺟﻪ ﺑﻪ ﺟﺪﺍﻭﻝ ﺯﻳﺮﺍ ﺑﻮﺟﻮﺩ ﺧﻮﺍﻫﺪ ﺁﻭﺭﺩ
12 2 6
9 5
2 12
3
1 3 5 6
2
7 1
4 15
٣٥ (Greedy) ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ
:ﻣﺮﺣﻠﻪ ﺷﺮﻭﻉ
Vertex S Dist P
1 1 0 1
2 0 12 1
3 0 2 1
4 0 7 1
5 0 ∞ 1
6 0 ∞ 1
Vertex S Dist P
1 1 0 1
2 0 11 3
3 1 2 1
4 0 4 3
5 0 5 3
6 0 ∞ 1
Vertex S Dist P
1 1 0 1
2 0 11 3
3 1 2 1
4 1 4 3
5 0 5 3
6 0 21 4
٣٦ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﺩﺭ ﺳﻄﺮ ٢ﺁﺭﺍﻳﻪ pﺭﺃﺱ ۵ﻗﺮﺍﺭ ﺩﺍﺭﺩ ،ﻭ ﺍﻳﻦ ﺑﺪﺍﻥ ﻣﻌﻨﻲ ﺍﺳﺖ ﻛﻪ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺑﺮﺍﻱ ﺭﻓﺘﻦ ﺑﻪ ﺭﺃﺱ ٢ﺍﺯ ﻃﺮﻳﻖ ﺭﺃﺱ ،٥
ﻣﻲﺑﺎﺷﺪ ﺩﺭ ﻧﺘﻴﺠﻪ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺍﺯ ﺭﺍﺱ ۱ﺑﻪ ﺭﺍﺱ ۲ﺑﺼﻮﺭﺕ ) (1352ﻣﻴﺒﺎﺷﺪ .ﺍﺯ ﺭﻭﯼ ﺁﺭﺍﻳـﻪ pﻣﻴﺘـﻮﺍﻥ
ﺩﺭﺧﺘﯽ ﺗﻮﻟﻴﺪ ﮐﺮﺩ ﮐﻪ ﺑﻪ ﻧﺎﻡ ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺑﻪ ﻣﺒﺪﺍ )ﺭﻳﺸﻪ( vﻣﻌﺮﻭﻑ ﺍﺳﺖ ))(SPSTﺍﮔﺮ ﮔـﺮﺍﻑ
ﺍﻭﻟﻴﻪ ﻫﻤﺒﻨﺪ ﺑﺎﺷﺪ ﺩﺭﺧﺖ ﺣﺎﺻﻞ ﺍﺯ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺑﻪ ﺭﻳﺸـﻪ vﻧﻴـﺰ ﭘﻮﺷـﺎ ﺍﺳـﺖ( .ﺷـﮑﻞ ﺯﻳـﺮ ﺩﺭﺧـﺖ ﭘﻮﺷـﺎﯼ
ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺑﻪ ﻣﺒﺪﺍ ﺭﺍﺱ ۱ﺭﺍ ﻧﺸﺎﻥ ﻣﻴﺪﻫﺪ.
2 1
5 6
2
1 3 5
3
2
4
ﺗﻄﺎﺑﻖ ﺑﺎ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ:
Select: ﺍﻧﺘﺨﺎﺏ ﺭﺍﺱ ﻣﻮﻗﺘﯽ ﺑﺎ ﮐﻤﺘﺮﻳﻦ Dist
Feasibility: -------------
Union: ﺩﺭ ﺑﺮﻧﺎﻣﻪ ) *(
٣٧ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
ﻧﮑﺘﻪ :ﺑﺎ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻫﺮ ﻳﮏ ﺍﺯ ﺭﺋﻮﺱ ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺒﺪﺍ ﻭ ﺍﺟﺮﺍﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻴـﺎﻥ ﺷـﺪﻩ ﻣﻴﺘـﻮﺍﻥ ﺑـﻪ nﺩﺭﺧـﺖ ﭘﻮﺷـﺎﯼ
ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺭﺳﻴﺪ ﮐﻪ ﻣﻤﮑﻦ ﺍﺳﺖ ﻫﻴﭻ ﮐﺪﺍﻡ ﺍﺯ ﺁﻧﻬﺎ ﺩﺭﺧﺖ ﭘﻮﺷﺎﯼ ﮐﻤﻴﻨﻪ ﻧﺒﺎﺷﺪ .ﮔﺮﺍﻑ ﺯﻳﺮ ﻧﺸﺎﻥ ﺩﻫﻨـﺪﻩ ﺍﻳـﻦ
ﻣﻮﺿﻮﻉ ﻣﻴﺒﺎﺷﺪ.
3
1 5
7
7 3
ﺗﺤﻠﻴﻞ ﺯﻣﺎﻧﯽ :ﺑﺮﺍﺣﺘﯽ ﻣﻼﺣﻈﻪ ﻣﻴﺸﻮﺩ ﮐﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﺼﻮﺭﺗﯽ ﭘﻴﺎﺩﻩ ﺳﺎﺯﯼ ﮐﺮﺩ ﮐﻪ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺁﻥ )O(n2
ﮔﺮﺩﺩ!.
)(Activity Selection
ﻪ ﺍ
۶ ۳
ﺎ ﻬ ﺘ ﻟ ﺎ ﻌ ﻓ ﻬ ﺑ ﺏ ﺎ ﺨ ﺘ ﻧ
- -
ﻣﺴﺌﻠﻪ ﺩﻳﮕﺮﯼ ﮐﻪ ﺑﺮﺍﯼ ﺁﻥ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺭﺍﺣﺘﯽ ﺍﻟﮕﻮﺭﻳﺘﻤﯽ ﺑﻪ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ ﺗﻮﻟﻴﺪ ﮐﺮﺩ ،ﻣﺴﺌﻠﻪ ﺍﻧﺘﺨﺎﺏ ﻓﻌﺎﻟﻴﺘﻬﺎ ﻧـﺎﻡ ﺩﺍﺭﺩ.
ﻓﺮﺽ ﮐﻨﻴﺪ nﺳﺨﻨﺮﺍﻥ ﻭﺟﻮﺩ ﺩﺍﺭﻧﺪ ﮐﻪ ﻫﺮ ﮐﺪﺍﻡ ﺯﻣﺎﻥ ﺷﺮﻭﻉ ﻭ ﭘﺎﻳﺎﻥ ﺳﺨﻨﺮﺍﻧﯽ ﺧﻮﺩ ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ ﻭﺭﻭﺩﯼ ﻣﺴـﺌﻠﻪ ﺍﻋـﻼﻡ
ﮐﺮﺩﻩﺍﻧﺪ .ﻫﺪﻑ ﺍﻧﺘﺨﺎﺏ ﺑﻴﺸﺘﺮﻳﻦ ﺗﻌﺪﺍﺩ ﺳﺨﻨﺮﺍﻥ ﺑﻪ ﮔﻮﻧﻪﺍﯼ ﺍﺳﺖ ﮐﻪ ﻫﻴﭻ ﺩﻭ ﺳـﺨﻨﺮﺍﻧﯽ ﺑـﺎ ﻫـﻢ ﺍﺷـﺘﺮﺍﮎ ﺑـﺎﺯﻩ ﺯﻣـﺎﻧﯽ
ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ.
ﻧﮑﺘﻪ :ﺟﻬﺖ ﻋﺪﻡ ﺗﺪﺍﺧﻞ ﺩﺭ ﺯﻣﺎﻥ ﺷﺮﻭﻉ ﻳﺎ ﭘﺎﻳﺎﻥ ﻣﻴﺘﻮﺍﻥ ﺑﺪﻭﻥ ﮐﻢ ﺷﺪﻥ ﺍﺯ ﮐﻠﻴﺖ ﻣﺴـﺌﻠﻪ ﻓـﺮﺽ ﮐـﺮﺩ ﮐـﻪ ﭘﺎﻳـﺎﻥ ﺑـﺎﺯﻩ
ﺳﺨﻨﺮﺍﻧﻴﻬﺎ ﺑﺎﺯ ﻣﻴﺒﺎﺷﻨﺪ ﻳﻌﻨﯽ ﺑﺼﻮﺭﺕ )…[ ﻣﻴﺒﺎﺷﻨﺪ.
ﻭﺭﻭﺩﻱ:
:Siﺷﺮﻭﻉ ﻓﻌﺎﻟﻴﺖ iﺍﹸﻡ
:Fiﭘﺎﻳﺎﻥ ﻓﻌﺎﻟﻴﺖ iﺍﹸﻡ
:nﺗﻌﺪﺍﺩ ﻓﻌﺎﻟﻴﺘﻬﺎ
ﻫﺪﻑ :ﺍﻧﺘﺨﺎﺏ ﺑﻴﺸﺘﺮﻳﻦ ﺗﻌﺪﺍﺩ ﻓﻌﺎﻟﻴﺖ ﺑﻪ ﻗﺴﻤﻲ ﻛﻪ ﺍﺷﺘﺮﺍﻙ ﺑﺎﺯﻩ ﺯﻣﺎﻧﻲ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ.
ﺗﻮﺿﻴﺢ ﺍﻟﮕﻮﺭﻳﺘﻢ:
-۱ﺩﺭﺍﺑﺘﺪﺍ ﻓﻌﺎﻟﻴﺘﻬﺎ ﺭﺍ ﺑﺮﺍﺳﺎﺱ ﺯﻣﺎﻥ ﭘﺎﻳﺎﻥ ﺁﻧﻬﺎ ﻣﺮﺗﺐ ﮐﺮﺩﻫﻮ ﺳـﭙﺲ ﺍﻭﻟـﻴﻦ ﻓﻌﺎﻟﻴـﺖ )ﺯﻭﺩﺗـﺮﻳﻦ ﺯﻣـﺎﻥ ﭘﺎﻳـﺎﻥ( ﺭﺍ
ﺍﻧﺘﺨﺎﺏ ﻣﻴﮑﻨﻴﻢ.
-۲ﺑﻪ ﺍﺯﺍﯼ iﺍﺯ ۲ﺗﺎ nﻣﺮﺣﻠﻪ ۳ﺭﺍ ﺗﮑﺮﺍﺭ ﻣﻴﮑﻨﻴﻢ:
-۳ﺍﮔﺮ ﻓﻌﺎﻟﻴﺖ iﺍﻡ ﺑﺎ ﺁﺧﺮﻳﻦ ﻓﻌﺎﻟﻴﺖ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩ ﺗﺪﺍﺧﻞ ﺑﺎﺯﻩ ﺯﻣﺎﻧﯽ ﻧﺪﺍﺷﺖ ﺁﻥ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻴﮑﻨﻴﻢ.
ﺷﺒﻪ ﮐﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍ ﺩﺭ ﺯﻳﺮ ﻣﻴﺒﻴﻨﻴﻢ)ﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﻓﻌﺎﻟﻴﺘﻬﺎ ﺑﺮ ﺣﺴﺐ ﺻﻌﻮﺩﯼ ﺯﻣﺎﻥ ﭘﺎﻳﺎﻧﺸﺎﻥ ﻣﺮﺗﺐ ﺷﺪﻩﺍﻧﺪ(:
٣٨ ﺭﻭﺵ ﺣﺮﻳﺼﺎﻧﻪ )(Greedy
√
√ √ √
۴
Divide & Conquer ﻞ ﺣ ﻭ ﻢ ﻴ ﺴ ﻘ ﺗ ﺵ ﻭ ﺭ -
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺍﺑﺘﺪﺍ ﺍﺯ ﻣﺴﺄﻟﻪ ﺍﺻﻠﻲ ﺷﺮﻭﻉ ﮐﺮﺩﻩ ﻭ ﺁﻥ ﺭﺍ ﺑﻪ ﻣﺴﺎﺋﻞ ﮐﻮﭼﮑﺘﺮ ﺗﻘﺴﻴﻢ ﻣـﻲﮐﻨـﻴﻢ .ﺳـﭙﺲ ﻫـﺮ ﻳـﮏ ﺍﺯ ﺯﻳـﺮ
ﻣﺴﺎﺋﻞ ﺭﺍ ﺑﺼﻮﺭﺕ ﺑﺎﺯﮔﺸﺘﯽ ﺣﻞ ﮐﺮﺩﻩ ﻭ ﺟﻮﺍﺏ ﺣﻞ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺭﺍ ﺑﺎ ﻫﻢ ﺗﺮﮐﻴﺐ ﻣﻴﮑﻨﻴﻢ .ﺍﻳﻦ ﺭﻭﺵ ﻣﻨﻄﺒﻖ ﺑـﺮ ﺍﻟﮕـﻮﻱ
ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ﻣﻲﺑﺎﺷﺪ) ،(Top Downﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﻓﻀﺎﯼ ﺣﻞ ﻣﺴﺌﻠﻪ ﺍﺯ ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ﺳﺎﺧﺘﻪ ﺷﺪﻩ ﺗﺎ ﺑﻪ ﮐـﻮﭼﮑﺘﺮﻳﻦ
ﺯﻳﺮ ﻣﺴﺌﻠﻪ ﺑﺮﺳﻴﻢ ﻭ ﺳﭙﺲ ﺍﺯ ﮐﻮﭼﮑﺘﺮﻳﻦ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺣﻞ ﺷﺪﻩ ﻭ ﺑﺎ ﻫﻢ ﺗﺮﮐﻴﺐ ﻣﻴﺸﻮﻧﺪ .ﻣﺸﮑﻞ ﺍﻳﻦ ﺭﻭﺵ ﺩﺭ ﺍﻳﻦ ﺍﺳﺖ
ﮐﻪ ﻣﻤﮑﻦ ﺍﺳﺖ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺗﮑﺮﺍﺭﯼ ﻣﺤﺎﺳﺒﻪ ﺷﻮﻧﺪ ﻭ ﻟﺬﺍ ﻣﻨﺠﺮ ﺑﻪ ﺑﺎﻻ ﺭﻓﺘﻦ ﺯﻣﺎﻥ ﺣﻞ ﻣﺴﺌﻠﻪ ﮔﺮﺩﺩ .ﺩﺭ ﻫﻨﮕـﺎﻡ ﺗﻘﺴـﻴﻢ،
ﻣﺴﺄﻟﻪ ﺑﺰﺭﮔﺘﺮ ﺑﻪ ﻣﺴﺎﺋﻞ ﮐﻮﭼﮑﺘﺮ ﺷﮑﺴﺘﻪ ﻣﻲ ﺷﻮﺩ ﺍﻣﺎ ﻫﻤﻴﺸﻪ ﺍﻳﻨﻄﻮﺭ ﻧﻴﺴـﺖ ،ﺑﺎﻳـﺪ ﺗﻌـﺪﺍﺩ ﺗﻘﺴـﻴﻤﺎﺕ ﺭﺍ ﺑـﻪ ﮔﻮﻧـﻪ ﺍﻱ
ﮔﺮﻓﺖ ﮐﻪ ﮐﺎﺭﺍﻳﻲ ﺑﻴﺸﺘﺮﻳﻦ ﻣﻘﺪﺍﺭ ﺑﺎﺷﺪ ،ﻫﺮﭼﻪ ﺍﻧﺪﺍﺯﻩ ﻣﺴﺎﺋﻞ ﮐﻮﭼﮏ ﺑﻪ ﻫﻢ ﻧﺰﺩﻳﮑﺘﺮ ﺑﺎﺷﺪ ﻣﻌﻤﻮﻻﹰ ﮐﺎﺭﺁﻳﻲ ﺣﺎﺻﻞ ﺑﻴﺸﺘﺮ
ﺍﺳﺖ .ﺑﻨﺎﺑﺮﺍﻳﻦ ﺳﻌﻲ ﻣﻲﺷﻮﺩ ﺍﻧﺪﺍﺯﻩ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺗﻘﺮﻳﺒﺎﹰ ﺑﺎ ﻫﻢ ﻣﺴﺎﻭﻱ ﺑﺎﺷﻨﺪ .ﺷﺒﻪ ﮐﺪ ﮐﻠﯽ ﺭﻭﻧـﺪ ﺣـﻞ ﻣﺴـﺎﺋﻞ ﺩﺭ ﺭﻭﺵ
ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﻣﻴﺒﺎﺷﺪ:
)Procdure D&C (p,q
if small (p,q) then
)return G(p,q
else
)m divide (p,q
))return combine (D&C(p,m) , D&C(m+1,q
endif
end.
ﺑﺮﺍﯼ ﺍﺭﺍﺋﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑﺎﻳﺪ ﺟﺰﺋﻴﺎﺕ ﺗﻮﺍﺑﻊ divide ، G ، smallﻭ combineﺭﺍ ﻣﺸﺨﺺ ﮐﺮﺩSmall .
ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ ﺩﺭ ﻣﻮﺭﺩ ﮐﻮﭼﮏ ﺑﻮﺩﻥ ﺍﻧﺪﺍﺯﻩ ﻣﺴﺌﻠﻪ ﺭﺍ ﺍﻧﺠﺎﻡ ﻣﻴﺪﻫﺪ ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺩﺭ ﺍﻳﻦ ﺗﺎﺑﻊ ﻣﺸﺨﺺ ﻣﻴﺸﻮﺩ ﮐﻪ ﺍﮔﺮ
ﺍﻧﺪﺍﺯﻩ ﻣﺴﺌﻠﻪ ﺑﻪ ﺣﺪ ﮐﺎﻓﯽ ﮐﻮﭼﮏ ﺍﺳﺖ ﮐﻪ ﺩﻳﮕﺮ ﻧﻴﺎﺯﯼ ﺑﻪ ﻓﺮﺍﺧﻮﺍﻧﯽ ﺑﺎﺯﮔﺸﺘﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﺒﺎﺷﺪ ﻋﻤﻞ ﺗﻘﺴﻴﻢ ﻣﺴـﺌﻠﻪ ﺑـﻪ
ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﭘﺎﻳﺎﻥ ﻣﻴﺎﺑﺪ .ﺗﺎﺑﻊ Gﻣﺴﺌﻠﻪ ﺑﺎ ﺍﻧﺪﺍﺯﻩ ﮐﻮﭼﮏ ﺭﺍ ﺣﻞ ﻣﻴﮑﻨﺪ .ﺗﺎﺑﻊ divideﻭﻇﻴﻔﻪ ﺗﻘﺴﻴﻢ ﻣﺴﺌﻠﻪ ﺑﻪ ﺯﻳﺮ ﻣﺴﺎﺋﻞ
ﮐﻮﭼﮑﺘﺮ ﺭﺍ ﺑﻪ ﻋﻬﺪﻩ ﺩﺍﺭﺩ ﻭ ﺗﺎﺑﻊ combineﻫﻢ ﺗﺮﮐﻴﺐ ﺟﻮﺍﺏ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺭﺍ ﺍﻧﺠﺎﻡ ﻣﻴﺪﻫﺪ.
ﻳ ﺭ ﺁ ﮏ ﻳ ﺸ ﺑ ﻭ ﮐ ﺮ ﺼ ﺳ ﺎ ﻣ
- -
ﻤ
ﺗﻮﺳﻂ ﻳﮏ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﻣﻴﺘﻮﺍﻥ ﻋﻨﺼﺮ ﮐﻤﻴﻨﻪ ﻭ ﺑﻴﺸﻴﻨﻪ ﻳﮏ ﺁﺭﺍﻳﻪ ﺭﺍ ﻣﺤﺴﺒﻪ ﮐﺮﺩ .ﮐﺪ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺭ ﺯﻳﺮ ﺁﻭﺭﺩﻩ
ﺷﺪﻩ ﺍﺳﺖ:
٤٠ (Divide & Conquer)
و ش و ر
0 ;n =1
1 ;n = 2
T ( n) =
n
2T ( ) + 2 ; n > 2
2
n n n
⇒ T (n) = 2[2T ( ) + 2] + 2 = 4T ( ) + 4 + 2 = 2 2 T ( 2 ) + 2 2 + 21
4 4 2
n
= 2 i T ( i ) + 2 i + 2 i −1 + L + 2 2 + 21
2
n =}2 k
= 2 k −1T (2) + 2 k −1 + L + 21
k −1 n 3n
= 2{ + 21k −42
1
+ L43 + 21 = + n − 2 = −2
n 2k −2
2 2
2
٤١ )(Divide & Conquer
و ش و ر
)(Strassen
ﺍ ﺍ ﺵ ﻪ
٢ ٤
ﻦ ﺳ ﺮ ﺘ ﺳ ﻭ ﺭ ﺑ ﺲ ﻳ ﺮ ﺗ ﺎ ﻣ ﻭ ﺩ ﺏ ﺮ ﺿ
- -
ﺩﺭ ﺿﺮﺏ ﺩﻭ ﻣﺎﺗﺮﻳﺲ ،n×nﺧﺮﻭﺟﻲ ﺣﺎﺻﻞ ﻳﮏ ﻣﺎﺗﺮﻳﺲ n×nﻣﻲﺑﺎﺷﺪ ،ﻛﻪ ﺍﻳﻦ ﻣﺎﺗﺮﻳﺲ ﺩﺍﺭﺍﻱ n2ﻋﻀﻮ ﺍﺳـﺖ ﮐـﻪ
ﺑﺮﺍﻱ ﻫﺮ ﻋﻀﻮ ﺑﻪ nﺿﺮﺏ ﻧﻴﺎﺯ ﺩﺍﺭﻳﻢ ﭘﺲ ﺗﻌﺪﺍﺩ ﺿﺮﺑﻬﺎﯼ ﻣﻮﺭﺩ ﻧﻴﺎﺯ ﺑﺮﺍﯼ ﺿﺮﺏ ﺩﻭ ﻣﺎﺗﺮﻳﺲ O(n3) ،n×nﻣﻲ ﺑﺎﺷﺪ.
ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺿﺮﺏ ﺩﻭ ﻣﺎﺗﺮﻳﺲ n×nﺭﺍ ﺑﻪ ﻭﺳﻴﻠﻪ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﺍﻧﺠﺎﻡ ﻣﻲﺩﻫﻴﻢ ،ﮐﻪ ﻣﺮﺗﺒـﻪ ﺯﻣـﺎﻧﻲ ﺍﻳـﻦ ﺭﻭﺵ
ﻫﻢ ) O(n3ﺧﻮﺍﻫﺪ ﺑﻮﺩ.
ﺍﺑﺘﺪﺍ ﻫﺮ ﻣﺎﺗﺮﻳﺲ ﻭﺭﻭﺩﯼ ﺭﺍ ﺍﺯ ﺳﻄﺮ ﻭ ﺳﺘﻮﻥ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺗﺠﺰﻳﻪ ﻣﻴﮑﻨﻴﻢ ﺗﺎ ﻫﺮ ﻣـﺎﺗﺮﻳﺲ ﻭﺭﻭﺩﯼ ﺑـﻪ ۴ﺯﻳـﺮ ﻣـﺎﺗﺮﻳﺲ
ﺗﺠﺰﻳﻪ ﺷﻮﺩ.
ﺭﻭﺵ ﺍﺳﺘﺮﺍﺳﻦ :ﻧﻮﺳﻂ ﻳﮏ ﺍﻳﺪﻩ ﺟﺎﻟﺐ ﻣﻴﺘﻮﺍﻥ ﻣﻌﺎﺩﻻﺕ ﺑﺎﻻ ﺭﺍ )ﮐﻪ ﻧﻴﺎﺯ ﺑـﻪ ۸ﺿـﺮﺏ ﻣﺎﺗﺮﻳﺴـﯽ ﻭ ۴ﺟﻤـﻊ ﻣﺎﺗﺮﻳﺴـﯽ
ﺩﺍﺷﺖ(ﺑﻪ ﮔﻮﻧﻪ ﺩﻳﮕﺮﯼ ﺑﺎﺯﻧﻮﻳﺴﯽ ﮐﺮﺩ ﮐﻪ ﻧﻴﺎﺯ ﺑﻪ ۷ﺿﺮﺏ ﻣﺎﺗﺮﻳﺴﯽ ﻭ ۱۸ﺟﻤﻊ ﻣﺎﺗﺮﻳﺴﯽ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ.
٨ﺿﺮﺏ ﺭﺍ ﺑﻪ ٧ﺿﺮﺏ ﻭ ١٨ﺟﻤﻊ ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ.
) P1 = A11 ( B12 − B22
P2 = ( A11 + A12 ) B22
P3 = ( A21 + A22 ) B11
) P4 = A22 ( B21 − B11
) P5 = ( A11 + A22 )( B11 + B22
) P6 = ( A12 − A22 )( B21 + B22
) P7 = ( A11 − A21 )( B11 + B12
C11 = P5 + P4 − P2 + P6
C12 = P1 + P2
C 21 = P3 + P4
C 22 = P5 + P1 − P3 − P7
ﺑﻨﺎﺑﺮﺍﻳﻦ:
٤٢ )(Divide & Conquer
و ش و ر
n
T ( n ) = 7 T + 18
n2
( )
7
= O n log 2 = O n 2 81
2 4
ﻁ
٣ ٤
ﺎ ﻘ ﻧ ﺝ ﻭ ﺯ ﻦ ﻳ ﺮ ﺘ ﻜ ﻳ ﺩ ﺰ ﻧ ﻦ ﻌ ﺗ
- -
ﻴ ﻴ
ﻱ ﺑ ﻚ ﻱ ﺎ ﻀ ﻓ ﺎ ﺯ ﻴ ﻴ
ﻦ ﻦ
ﺩﺭﻓﻀﺎﻱ ﻳﻚ ﺑﻌﺪﻱ ﻓﻘﻂ ﻣﺤﻮﺭ xﺭﺍ ﺩﺍﺭﻳﻢ ﻛﻪ ﺑﺮ ﺭﻭﯼ ﺍﻳﻦ ﻣﺤﻮﺭ ﺗﻌﺪﺍﺩ nﻧﻘﻄﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﻭﺭﻭﺩﯼ ﺩﺍﺩﻩ ﺷـﺪﻩ ﺍﺳـﺖ .ﻭ
ﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﻣﺎﺑﻴﻦ ﻧﻘﺎﻁ ﺍﺳﺖ.
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺍﻭﻝ:
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺗﮏ ﺗﮏ ﻧﻘﺎﻁ ﺭﺍ ﺑﺎ ﺑﻘﻴﻪ ﻧﻘﺎﻁ ﺑﺮﺭﺳﯽ ﮐﺮﺩﻩ ﻭ ﻓﺎﺻﻠﻪ ﺁﻧﻬـﺎ ﺭﺍ ﻣﺤﺎﺳـﺒﻪ ﮐـﺮﺩﻩ ﻭ ﺑـﻴﻦ ﻓﻮﺍﺻـﻞ ﮐﻤﺘـﺮﻳﻦ ﺭﺍ
ﻣﺤﺎﺳﺒﻪ ﻣﻴﮑﻨﻴﻢ ﮐﻪ ﺩﺭ ﻧﺘﻴﺠﻪ ﻧﻴﺎﺯ ﺑﻪ ) O(n2ﻣﺤﺎﺳﺒﻪ ﺩﺍﺭﺩ.
) (
o n 2 ← ( n − 1) + ( n − 2 ) + ....... + 1
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﻭﻡ:
ﻣﻴﺘﻮﺍﻥ ﺍﺑﺘﺪﺍ ﻧﻘﺎﻁ ﺭﺍ ﺑﺮ ﺣﺴﺐ ﻣﺨﺘﺼﻪ xﺷﺎﻥ ﻣﺮﺗﺐ ﮐﺮﺩﻩ ﻭ ﺳﭙﺲ ﺑﻴﻦ ﻓﻮﺍﺻﻞ ﻧﻘﺎﻁ ﻣﺘﻮﺍﻟﯽ ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﺭﺍ ﻣﺤﺎﺳﺒﻪ
ﮐﺮﺩ ﮐﻪ ﺩﺭ ﻧﺘﻴﺠﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ )) O(n. log nﺑﻪ ﺧﺎﻃﺮ ﻣﺮﺗﺐ ﺳﺎﺯﯼ( ﻣﻴﺒﺎﺷﺪ.
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺳﻮﻡ)ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ(:
-۱ﻧﻘﺎﻁ ﺭﺍ ﻣﺮﺗﺐ ﮐﻨﻴﺪ
n/2 -۲ﻧﻘﺎﻁ ﺳﻤﺖ ﭼﭗ) (pi; i=1,…,n/2ﺭﺍ ﺑﺼﻮﺭﺕ ﺑﺎﺯﮔﺸﺘﯽ ﺣﻞ ﮐﻨﻴﺪ)ﮐﻤﺘـﺮﻳﻦ ﻓﺎﺻـﻠﻪ ﺑـﻴﻦ ﺁﻧﻬـﺎ ﺭﺍ s1
ﻣﻴﻨﺎﻣﻴﻢ(
n/2 -۳ﻧﻘﺎﻁ ﺳﻤﺖ ﺭﺍﺳﺖ) (qi; i=1,…,n/2ﺭﺍ ﺑﺼﻮﺭﺕ ﺑﺎﺯﮔﺸﺘﯽ ﺣﻞ ﮐﻨﻴﺪ)ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﺑـﻴﻦ ﺁﻧﻬـﺎ ﺭﺍ s2
ﻣﻴﻨﺎﻣﻴﻢ(
-۴ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﻧﻬﺎﻳﻲ ﺍﺯ ﺭﺍﺑﻄﻪ ﺯﻳﺮ ﻗﺎﺑﻞ ﺗﻮﻟﻴﺪ ﺍﺳﺖ:
{ }
} min = s1, s 2 , min {q i } − max { pi
n
) T ( n ) = 2T + 1 = o (n
2
× × × × × × × ×
S1
S2
درآ )
#( o(n log nد )&در (sort +91
٤٣ )(Divide & Conquer
و ش و ر
ﻱ ﺑ ﻱ ﺎ ﻀ ﻓ ﺎ ﺯ ﻴ ﻴ
ﻦ ﻦ
ﺍﻟﮕﻮﺭﻳﺘﻢ:
-۱ﺩﺭﺍﺑﺘﺪﺍ ﻧﻮﺩﻫﺎ ﺭﺍ ﺩﺭ ﺍﻳﻦ ﻓﻀﺎ ﺑﺮﺍﺳﺎﺱ ﻣﺨﺘﺼﻪ xﺷﺎﻥ ﻣﺮﺗﺐ ﻣﻲﻛﻨﻴﻢ.
-۲ﺳﭙﺲ ﺑﺎ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻳﮏ ﺧﻂ ﻓﺮﺿﯽ ﻣﺠﻤﻮﻋﻪ ﻧﻘﺎﻁ ﺭﺍ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﭼﭗ ﻭ ﺭﺍﺳﺖ ﮐﻪ ﻫـﺮ ﮐـﺪﺍﻡ ﺩﺍﺭﺍﯼ
n/2ﻋﻨﺼﺮ ﻫﺴﺘﻨﺪ ﺗﻘﺴﻴﻢ ﻣﻴﮑﻨﻴﻢ.
-۳ﺩﻭ ﺯﻳﺮ ﻣﺴﺌﻠﻪ ﭼﭗ ﻭ ﺭﺍﺳﺖ ﺭﺍ ﺣﻞ ﮐﺮﺩﻩ ﺗﺎ ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﺩﺭ ﻫﺮ ﺩﻭ ﺯﻳﺮ ﻣﺴﺌﻠﻪ ﺗﻮﻟﻴﺪ ﺷﻮﺩ ﻭ ﺳﭙﺲ ﺟﻮﺍﺏ
ﺣﻞ ﺩﻭ ﺯﻳﺮ ﻣﺴﺌﻠﻪ ﺭﺍ S1ﻭ S2ﻣﻴﻨﺎﻣﻴﻢ.
S=min(S1,S2) -۴
-۵ﺣﺎﻝ ﺍﮔﺮ ﺷﺒﻴﻪ ﺭﻭﺵ ﻳﮏ ﺑﻌﺪﯼ ﻓﺎﺻﻠﻪ ﻧﺰﺩﻳﮑﺘﺮﻳﻦ ﻧﻘﻄﻪ ﺍﺯ ﻧﻘﺎﻁ ﭼﭗ ﻭ ﺭﺍﺳـﺖ ﺧـﻂ ﺭﺍ ﻧﻴـﺰ ﺩﺭ ﻣﺤﺎﺳـﺒﺎﺕ
ﺩﺧﻴﻞ ﮐﻨﻴﻢ ﻣﻤﮑﻦ ﺍﺳﺖ ﺑﻪ ﺟﻮﺍﺏ ﺻﺤﻴﺢ ﻧﺮﺳﻴﻢ .ﻟﺬﺍ ﺩﺭ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎ ﺍﺿﺎﻓﻪ ﮐﺮﺩﻥ ﻳﮑﺴـﺮﻱ ﺷـﺮﺍﻳﻂ ﺳـﻌﻲ
ﻣﻲﮐﻨﻴﻢ ﺗﻌﺪﺍﺩ ﻣﻘﺎﻳﺴﻪ ﻫﺎ ﺭﺍ ﮐﻢ ﮐﻨﻴﻢ .ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺍﻧﺪﺍﺯﻩ Sﺍﺯ ﺧﻂ ﻭﺳﻂ ﺍﺯ ﻫﺮ ﺩﻭ ﻃﺮﻑ ﻳﮏ ﻣﺤﺪﻭﺩﻩ ﺩﺭ ﻧﻈـﺮ
ﮔﺮﻓﺖ ﻭ ﻧﻘﺎﻁ ﺩﺍﺧﻞ ﺍﻳﻦ ﺑﺎﺭﻳﮑﻪ ﺭﺍ ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﮐﺮﺩ ﮐﻪ ﺩﺭ ﻧﺘﻴﺠﻪ ﺑﺎﺯ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﺷـﺮﺍﻳﻂ ﺗﻤـﺎﻡ n/2ﻧﻘﻄـﻪ
ﺳﻤﺖ ﭼﭗ ﻭ n/2ﻧﻘﻄﻪ ﺳﻤﺖ ﺭﺍﺳﺖ ﺧﻂ ﻭﺳﻂ ﺩﺭ ﺍﻳﻦ ﺑﺎﺭﻳﮑﻪ ﻫﺎ ﻗﺮﺍﺭ ﺩﺍﺭﻧﺪ ﻭ ﻟﺬﺍ ﻣﺮﺗﺒـﻪ ﺯﻣـﺎﻧﯽ )O(n2
ﺧﻮﺍﻫﺪ ﺷﺪ ﻭﻟﯽ ﻣﻴﺘﻮﺍﻥ ﺑﺮﺍﯼ ﻫﺮ ﻧﻘﻄﻪ ﻭﺍﻗﻊ ﺩﺭ ﺑﺎﺭﻳﮑﻪ ﺳﻤﺖ ﭼﭗ ﻣﺎﻧﻨـﺪ pﻓﻘـﻂ ﻧﻘـﺎﻁ ﻭﺍﻗـﻊ ﺩﺭ ﻣﺴـﺘﻄﻴﻞ
ﺧﺎﺻﯽ ﺭﺍ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺖ .ﺍﻳﻦ ﻣﺴﺘﻄﻴﻞ ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﺳﺎﺧﺘﻪ ﻣﻴﺸﻮﺩ ﮐﻪ ﺑﺎﻳﺪ ﭘﺎﻱ ﻋﻤﻮﺩ ﺍﺯ ﻧﻘﻄـﻪ ﻧﺴـﺒﺖ ﺑـﻪ
ﺧﻂ ﻭﺳﻂ ﺭﺍ ﭘﻴﺪﺍ ﮐﺮﺩﻩ ﺍﺯ ﺁﻥ ﺑﻪ ﺍﻧﺪﺍﺯﻩ Sﺑﻪ ﺑﺎﻻ ،ﭘﺎﻳﻴﻦ ﻭ ﺭﺍﺳﺖ ﺣﺮﮐﺖ ﮐﺮﺩ ﺗﺎ ﻳﮏ ﻧﺎﺣﻴﻪ ﻣﺴـﺘﻄﻴﻠﯽ ﺷـﮑﻞ
ﺑﻪ ﻃﻮﻝ 2Sﻭ ﻋﺮﺽ Sﺣﺎﺻﻞ ﺷﻮﺩ .ﺑﺪﻳﻬﯽ ﺍﺳﺖ ﮐﻪ ﺣﺪﺍﮐﺜﺮ ﺗﻌﺪﺍﺩ ﻧﻘـﺎﻁ ﻭﺍﻗـﻊ ﺩﺭ ﺍﻳـﻦ ﻧﺎﺣﻴـﻪ ﻣﺴـﺘﻄﻴﻠﯽ
ﺷﮑﻞ ﺑﺮﺍﺑﺮ ﺑﺎ ۶ﻧﻘﻄﻪ ﺍﺳﺖ! ﻭ ﻟﺬﺍ ﺑﺮﺍﯼ ﻫﺮ ﻧﻘﻄﻪ ﺩﺭ ﺑﺎﺭﻳﮑﻪ ﺳﻤﺖ ﭼﭗ ﻓﻘﻂ ﺑﺎﻳﺪ ﻓﺎﺻﻠﻪ ﺁﻥ ﺭﺍ ﺑﺎ ۶ﻧﻘﻄـﻪ ﺩﺭ
ﺑﺎﺭﻳﮑﻪ ﺳﻤﺖ ﺭﺍﺳﺖ ﻣﺤﺎﺳﺒﻪ ﮐﺮﺩ ﻭﺍﻳﻦ ﻓﻮﺍﺻﻞ ﺭﺍ ﻧﻴﺰ ﺩﺭ ﻣﺤﺎﺳﺒﻪ ﮐﻤﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﺩﺧﻴﻞ ﮐﺮﺩ.
ﻧﮑﺘﻪ :ﺑﺪﻟﻴﻞ ﺍﻳﻨﮑﻪ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺩﺍﻳﺮﻩ ﺍﻱ ﺑﺎ ﺷﻌﺎﻉ Sﻣﺸﮑﻞ ﺍﺳﺖ ﺍﺯ ﻳﮏ ﻣﺴﺘﻄﻴﻞ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﻴﻢ.
ﻣﺤﺎﺳـﺒﻪ ﻧﮑﺘﻪ :ﻓﺎﺻﻠﻪ ﺩﻭ ﻧﻘﻄﻪ ) (x1,y1ﻭ ) (x2,y2ﺩﺭ ﻓﻀﺎﯼ ﺩﻭ ﺑﻌـﺪﯼ ﺍﺯ ﺭﺍﺑﻄـﻪ ( x1 − x2 ) 2 + ( y1 − y 2 ) 2
ﻣﻴﺸﻮﺩ.
S S
S
S
p
S
S
S1 S2
٤٤ )(Divide & Conquer
و ش و ر
ﺗ ﺎ ﺳ ﺎ ﻣ ﺳ ﻫ ﺭ ﺩ ﻳ ﺎ ﯼ ﺎ ﻬ ﺘ ﻳ ﺭ ﻮ ﮕ ﻟ ﻭ ﻳ ﺭ ﺎ ﻌ ﺗ
- -
ﻤ
ﭼﻨﺪﺿﻠﻌﻲ ﺑﺴﺘﻪ :ﺩﻧﺒﺎﻟﻪﺍﻱ ﺍﺯ ﭘﺎﺭﻩﺧﻄﻬﺎ ﻛﻪ ﺍﻧﺘﻬﺎﻱ ﻫﺮﻛﺪﺍﻡ ﺑﻪ ﺍﺑﺘﺪﺍﻱ ﺩﻳﮕﺮﻱ ﻭﺻـﻞ ﺑﺎﺷـﺪ ﻭ ﺿـﻤﻨﺎﹰ ﺑﺴـﺘﻪ ﺷـﻮﺩ ﻳﻌﻨـﻲ
ﺍﻧﺘﻬﺎﻱ ﺁﺧﺮﻱ ﺑﻪ ﺍﺑﺘﺪﺍﻱ ﺍﻭﻟﻲ ﻣﺘﺼﻞ ﺑﺎﺷﺪ.
ﭼﻨﺪ ﺿﻠﻌﯽ ﺳﺎﺩﻩ :ﭼﻨﺪ ﺿﻠﻌﯽ ﺑﺴﺘﻪﺍﯼ ﮐﻪ ﺩﺭ ﺁﻥ ﻫﻴﭻ ﻳﺎﻟﻲ ،ﻳﺎﻝ ﺩﻳﮕﺮﻱ ﺭﺍ ﻗﻄﻊ ﻧﻜﻨﺪ.
ﭼﻨﺪ ﺿﻠﻌﻲ ﻣﺤﺪﺏ :ﭼﻨﺪﺿﻠﻌﻲ ﺳﺎﺩﻩﺍﯼ ﻛﻪ ﺯﺍﻭﻳﻪﺍﻱ ﺑﻴﺸﺘﺮ ﺍﺯ ١٨٠ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ )ﻫﺮﺩﻭ ﻧﻘﻄﻪ ﺩﺍﺧﻞ ﭼﻨﺪﺿﻠﻌﻲ ﺭﺍ ﺑﻪ ﻫﻢ
ﻭﺻﻞ ﻛﻨﻴﻢ ﭘﺎﺭﻩﺧﻂ ﺣﺎﺻﻞ ﺩﺍﺧﻞ ﭼﻨﺪﺿﻠﻌﻲ ﺑﺎﺷﺪ(.
ﺟﻬﺖ ﭼﺮﺧﺶ ﺑﻴﻦ ﺳﻪ ﻧﻘﻄﻪ ﺩﺭ ﻓﻀﺎﯼ ۲ﺑﻌﺪﯼ:
)P1(x1,y1 p1 , p 2 , p3
ﺭﺍﺳﺖ ﮔﺮﺩ
)P2(x2,y2
p 3 , p1 , p 2ﺭﺍﺳﺖ ﮔﺮﺩ
B D
A
C
٤٥ )(Divide & Conquer
و ش و ر
*p
) :Convex hullﭘﻮﺳﺘﻪ ﻳﺎ ﭘﻮﺵ ﻣﺤﺪﺏ( .ﻛﻮﭼﻜﺘﺮﻳﻦ ﭼﻨﺪ ﺿﻠﻌﻲ ﻣﺤﺪﺏ ﻛﻪ ﺷﺎﻣﻞ ﻫﻤﻪ ﻧﻘﺎﻁ ﻭﺭﻭﺩﯼ ﺑﺎﺷﺪ.
ﻧﮑﺘﻪ:ﺑﺮﺍﯼ ﺗﺼﻮﺭ ﺷﮑﻞ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﻣﻴﺘﻮﺍﻥ ﻓﺮﺽ ﮐﺮﺩ ﮐﻪ ﺗﻌﺪﺍﺩﻱ ﻧﻘﻄﻪ ﺩﺍﺭﻳﻢ ﻭ ﻳﻚ ﻛـﺶ ﺣﻠﻘـﻮﯼ ﺭﺍ ﺑـﺎﺯﻛﺮﺩﻩ ﺩﻭﺭ
ﻧﻘﺎﻁ ﻗﺮﺍﺭ ﻣﻴﺪﻫﻴﻢ .ﺷﮑﻞ ﺳﺎﺧﺘﻪ ﺷﺪﻩ ﺗﻮﺳﻂ ﮐﺶ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﺭﺍ ﻧﺸﺎﻥ ﻣﻴﺪﻫﺪ.
٤٦ )(Divide & Conquer
و ش و ر
ﻣﺴﺌﻠﻪ ﻣﻮﺯﻩ ﻫﻨﺮﻱ :ﻧﺤﻮﻩ ﻃﺮﺍﺣﻲ ﻳﻚ ﻣﻮﺯﻩ ﺑﻪ ﻗﺴﻤﻲ ﻛﻪ ﺑﻪ ﻛﻤﺘﺮﻳﻦ ﺗﻌﺪﺍﺩ ﻧﮕﻬﺒﺎﻥ ﺟﻬﺖ ﺭﻭﻳﺖ ﺍﺣﺘﻴﺎﺝ ﺑﺎﺷﺪ.
ﻣﺴﺌﻠﻪ ﺭﻭﺷﻨﺎﻳﻲ :ﺩﺭ convex hullﻳﻚ ﻻﻣﭗ ﺑﺮﺍﻱ ﺭﻭﺷﻨﺎﻳﻲ ﻛﺎﻓﻲ ﺍﺳﺖ ﻭ ﻣﻮﻗﻌﻴﺖ ﻻﻣﭗ ﺍﻫﻤﻴـﺖ ﻧـﺪﺍﺭﺩ ﺩﺭ Star
shapedﻳﻚ ﻻﻣﭗ ﺑﺮﺍﻱ ﺭﻭﺷﻨﺎﻳﻲ ﻛﺎﻓﻲ ﺍﺳﺖ ﺩﺭ ﺻﻮﺭﺗﻲ ﻛﻪ ﺩﺭ ﺩﺍﺧﻞ kernelﻗﺮﺍﺭ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ.
)(Convex Hull
ﺵ
٤
٥
- -
Graham
١ ٤
٥
Procedure Graham
p1 find the point with minimum y
Sort the other points around p1 (CCW –Polar angle) and call them p2 ,…, pn
)Push (p1
)Push (p2
For i3 to n do
While Right (stack [top-1] , stack[top], Pi) do
Pop
Repeat
)Push (pi
repeat
End.
Shamos
٢ ٤
٥
ﺍﺷﮑﺎﻝ ﺯﻳﺮ ﺩﻭ ﺣﺎﻟﺖ ﻣﺨﺘﻠﻒ ﮐﻪ ﺑﺮﺍﯼ ﻧﻘﻄﻪ pﻗﺎﺑﻞ ﺗﺼﻮﺭ ﺍﺳﺖ ﺭﺍ ﻧﺸﺎﻥ ﻣﻴﺪﻫﺪ.
C2
C1
p
=<; - 2
C2
C1
p
٤٩ )(Divide & Conquer
و ش و ر
)(Dynamic Programming ﺎ ﻳ ﻮ ﭘ ﯼ ﺯ ﺎ ﺳ
ﻪ ﻣ
ﺎ
ﻧ
ﺩﺭ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﺩﻳﺪﻳﻢ ﻛﻪ ﺍﺑﺘﺪﺍ ﺍﺯ ﻣﺴﺌﻠﻪ ﺍﺻﻠﻲ ﺷﺮﻭﻉ ﮐﺮﺩﻩ ﻭ ﺁﻥ ﺭﺍ ﺑﻪ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻣـﻲﻛﻨـﻴﻢ ﻭ
ﻛﺎﺭ ﺭﺍ ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ ﭘﻴﺶ ﻣﻲﺑﺮﻳﻢ ﻭ ﺳﭙﺲ ﺍﺯ ﺍﻧﺘﻬﺎ ﺑﻪ ﺍﺑﺘﺪﺍ ﻣﺴﺎﺋﻞ ﺭﺍ ﺣﻞ ﻣـﻲﻛﻨـﻴﻢ .ﺩﺭ ﻭﺍﻗـﻊ ﺑـﺮﺍﻱ ﺷﻜﺴـﺘﻦ ﻣﺴـﺎﺋﻞ
ﺍﻟﮕﻮﻱ ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ) (top downﻭ ﺩﺭ ﺗﺮﻛﻴـﺐ ﺟﻮﺍﺑﻬـﺎ ﺍﻟﮕـﻮﻱ ﭘـﺎﻳﻴﻦ ﺑـﻪ ﺑـﺎﻻ ﺭﻋﺎﻳـﺖ ﻣـﻲﮔـﺮﺩﺩ ﻛـﻪ ﻣﻨﻄﺒـﻖ ﺑـﺮ
ﺍﻟﮕﻮﺭﻳﺘﻢﻫﺎﻱ ﺑﺎﺯﮔﺸﺘﻲ ﺍﺳﺖ .ﺍﻣﺎ ﺍﮔﺮ ﺩﺭ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ ﻻﺯﻡ ﺑﺎﺷﺪ ﺯﻳﺮ ﻣﺴﺄﻟﻪ ﺧﺎﺻﻲ ﺭﺍ ﭼﻨﺪﻳﻦ ﻣﺮﺗﺒﻪ ﺣـﻞ ﻛﻨـﻴﻢ
ﺍﻳﻦ ﺗﻜﺮﺍﺭ ﻛﺎﺭﺁﻳﻲ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍ ﭘﺎﻳﻴﻦ ﻣﻲﺁﻭﺭﺩ .ﺍﮔﺮ ﭼﻨﻴﻦ ﺯﻳﺮﻣﺴﺄﻟﻪﺍﻱ ﺭﺍ ﻳﻚ ﺑﺎﺭ ﺣﻞ ﻛﺮﺩﻩ ﻭ ﺟﻮﺍﺏ ﺁﻧﻬـﺎ ﺭﺍ ﻧﮕﻬـﺪﺍﺭﻱ
ﻛﻨﻴﻢ ،ﻣﻲﺗﻮﺍﻧﻴﻢ ﺩﺭ ﻣﺮﺍﺣﻞ ﺑﻌـﺪﻱ ﺍﺯ ﺁﻥ ﺍﺳـﺘﻔﺎﺩﻩ ﻛﻨـﻴﻢ ﻭ ﺍﻳـﻦ ﺍﺳـﺎﺱ ﻛـﺎﺭ ﺭﻭﺵ ﺣـﻞ ﻣﺴـﺎﺋﻠﻲ ﺍﺳـﺖ ﻛـﻪ ﺑـﻪ ﺭﻭﺵ
ﺑﺮﻧﺎﻣﻪﺳﺎﺯﻱ ﭘﻮﻳﺎ ﺣﻞ ﻣﻲﺷﻮﻧﺪ.
ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺍﺯ ﻛﻮﭼﻜﺘﺮﻳﻦ ﻣﺴﺎﺋﻞ ﺷﺮﻭﻉ ﻭ ﻫﻤﻪ ﺁﻧﻬﺎ ﺭﺍ ﺣﻞ ﻣﻲﻛﻨﻴﻢ ﻭ ﺟﻮﺍﺏ ﺁﻧﻬﺎ ﺭﺍ ﻧﮕﻬﺪﺍﺭﻱ ﻣـﻲﻛﻨـﻴﻢ .ﺳـﭙﺲ ﺑـﻪ
ﺳﻄﺢ ﺑﻌﺪﻱ ﻣﻲﺭﻭﻳﻢ ﻭ ﻛﻠﻴﻪ ﻣﺴﺎﺋﻞ ﺍﻧﺪﻛﻲ ﺑﺰﺭﮔﺘﺮ ﺭﺍ ﺣﻞ ﻣﻲﻛﻨﻴﻢ ﻭ ﺳﭙﺲ ﺑﻪ ﺣﻞ ﻣﺴﺎﺋﻞ ﺳﻄﺢ ﺑﻌـﺪﻱ ﻣـﻲﭘـﺮﺩﺍﺯﻳﻢ ﻭ
ﻛﺎﺭ ﺭﺍ ﺗﺎ ﺟﺎﻳﻲ ﺍﺩﺍﻣﻪ ﻣﻲﺩﻫﻴﻢ ﻛﻪ ﻣﺴﺄﻟﻪ ﺍﺻﻠﻲ ﺣﻞ ﺷﻮﺩ .ﺑﺮﺍﻱ ﺣﻞ ﻫﺮﻳﻚ ﺍﺯ ﻣﺴﺎﺋﻞ ﻫﺮ ﺳﻄﺢ ﻣﻲﺗـﻮﺍﻧﻴﻢ ﺍﺯ ﺣـﻞ ﻛﻠﻴـﻪ
ﺳﻄﻮﺡ ﭘﺎﻳﻴﻦﺗﺮ ﻛﻪ ﻻﺯﻡ ﺑﺎﺷﺪ ﺍﺳﺘﻔﺎﺩﻩ ﻛﻨﻴﻢ .ﺍﺯ ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﺯﻣﺎﻧﯽ ﻣﻴﺘﻮﺍﻥ ﺍﺳـﺘﻔﺎﺩﻩ ﮐـﺮﺩ ﮐـﻪ ﺍﺻـﻞ ﺑﻬﻴﻨﮕـﯽ
ﺑﺮﻗﺮﺍﺭ ﺑﺎﺷﺪ .ﺍﻳﻦ ﺍﺻﻞ ﺑﺮ ﺍﻳﻦ ﺍﺳﺎﺱ ﺍﺳﺖ ﮐﻪ ﺑﺮﺍﯼ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺼﻮﺭﺕ ﺑﻬﻴﻨـﻪ ﺍﺯ ﺣـﻞ ﺑﻬﻴﻨـﻪ ﺯﻳـﺮ ﻣﺴـﺎﺋﻞ ﺁﻥ ﻣﻴﺘـﻮﺍﻥ
ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ .ﺩﺭ ﺍﺩﺍﻣﻪ ﭼﻨﺪ ﻣﺴﺄﻟﻪ ﺭﺍ ﻛﻪ ﺑﺪﻳﻦ ﺭﻭﺵ ﺣﻞ ﻣﻲﺷﻮﻧﺪ ﺑﺮﺭﺳﻲ ﻣﻲﻛﻨﻴﻢ.
ﺑﺮﻧﺎﻣﻪﺳﺎﺯﻱ ﭘﻮﻳﺎ ﺩﺭ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﺭﻭﺵ ﺗﻘﺴﻴﻢ ﻭ ﺣﻞ :ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ ﺭﺍ ﺍﺯ ﭘﺎﻳﻴﻦ ﺑﻪ ﺑﺎﻻ ﻣﻲﺳﺎﺯﻳﻢ ﻭ ﻧﺘﺎﻳﺞ ﺭﺍ ﺩﺭ ﻳـﻚ
ﺟﺪﻭﻝ ﻧﮕﻬﺪﺍﺭﻱ ﻣﻲﻛﻨﻴﻢ ﺗﺎ ﺩﺭ ﻣﻮﻗﻊ ﻟﺰﻭﻡ ﺑﺘﻮﺍﻥ ﺍﺯ ﺁﻧﻬﺎ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ ﻭ ﺩﻭﺑﺎﺭﻩ ﺁﻧﻬﺎ ﺭﺍ ﺣﻞ ﻧﮑﺮﺩ.
ﻧﮑﺘﻪ :ﻧﻮﻋﯽ ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺩﺭ ﺁﻥ ﺯﻳﺮ ﻓﻀﺎﯼ ﺣﻞ ﻣﺴﺌﻠﻪ ﺍﺯ ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ﺍﺳﺖ ﻭﻟﯽ ﺯﻳﺮ ﻣﺴﺎﺋﻞ
ﺣﻞ ﺷﺪﻩ ﺩﺭ ﺟﺪﻭﻟﯽ ﻧﮕﻬﺪﺍﺭﯼ ﻣﻴﺸﻮﻧﺪ ﺗﺎ ﺍﺯ ﺣﻞ ﺯﻳﺮ ﻣﺴﺎﺋﻞ ﺗﮑﺮﺍﺭﯼ ﭘﺮﻫﻴـﺰ ﺷـﻮﺩ ﮐـﻪ ﺍﻳـﻦ ﺭﻭﺵ ﺑـﻪ ﻧـﺎﻡ ﺭﻭﺵ ﺑـﻪ
ﺧﺎﻃﺮﺳﭙﺎﺭﯼ ) (memoizedﺷﻨﺎﺧﺘﻪ ﻣﻴﺸﻮﺩ.
ﺍﺻﻞ ﺑﻬﻴﻨﮕﻲ :ﺍﻧﺘﺨﺎﺏ ﺑﻬﻴﻨﻪ ﻧﻬﺎﻳﻲ ﺑﻪ ﺍﻧﺘﺨﺎﺑﻬﺎﻱ ﺑﻬﻴﻨﻪ ﺍﻭﻟﻴﻪ ﺑﺴﺘﮕﻲ ﺩﺍﺭﺩ.
ﺑﺮﺍﯼ ﺍﺭﺍﺋﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﻪ ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ۴ﻣﺮﺣﻠﻪ ﺭﺍ ﺑﺎﻳﺪ ﻃﺮﺍﺣﯽ ﮐﺮﺩ:
-۱ﺗﻌﺮﻳﻒ ﺗﺎﺑﻌﯽ ﮐﻪ ﺣﻞ ﺗﺎﺑﻊ ﻣﻨﺠﺮ ﺑﻪ ﺣﻞ ﻣﺴﺌﻠﻪ ﺷﻮﺩ.
-۲ﺑﻴﺎﻥ ﺷﺮﺍﻳﻂ ﻣﺮﺯﯼ
-۳ﺑﻴﺎﻥ ﺟﻮﺍﺏ ﻣﺴﺌﻠﻪ ﺑﺮ ﺣﺴﺐ ﺗﺎﺑﻊ
-۴ﺗﻌﺮﻳﻒ ﺑﺎﺯﮔﺸﺘﯽ ﺗﺎﺑﻊ
٥١ )(Dynamic Programming
ز
ش و ر
0/1
ﻪ ﻪ
١
٥
- -
ﻣﺴﺌﻠﻪ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﺻﻔﺮ ﻳﺎ ﻳﮏ ﻣﺪﻟﯽ ﺍﺯ ﻣﺴﺌﻠﻪ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﺁﻥ ﺍﺷﻴﺎﺀ ﻳﺎ ﺑﻄﻮﺭ ﮐﺎﻣـﻞ ﺍﻧﺘﺨـﺎﺏ ﻣﻴﺸـﻮﻧﺪ ﻭ ﻳـﺎ
ﺍﻧﺘﺨﺎﺏ ﻧﻤﻴﺸﻮﻧﺪ ﻭ ﻧﻤﻴﺘﻮﺍﻥ ﻓﻘﻂ ﮐﺴﺮﯼ ﺍﺯ ﺍﺷﻴﺎﺀ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﮐﺮﺩ.
ﻭﺭﻭﺩﻱ:
:nﺗﻌﺪﺍﺩ ﮐﻴﺴﻪ ﻫﺎ
:Piﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺍﻧﺘﺨﺎﺏ ﻛﻞ ﺟﺴﻢ iﺍﹸﻡ
:Wiﻭﺯﻥ ﻛﻞ ﺟﺴﻢ iﺍﹸﻡ
:Mﮔﻨﺠﺎﻳﺶ ﻛﻮﻟﻪ ﭘﺸﺘﯽ
n
ﻫﺪﻑ :ﺑﻴﺸﻴﻨﻪ ﮐﺮﺩﻥ ﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺍﻧﺘﺨﺎﺏ ﺍﺟﻨﺎﺱ ﻳﻌﻨﯽ Max ∑ xi . pi
i =1
ﺷﺮﺍﻳﻂ ﻣﺴﺌﻠﻪ:
ﻭﺯﻥ ﻫﻤﻪ ﮐﻴﺴﻪﻫﺎ ﺭﻭﻱ ﻫﻢ ﺍﺯ ﻭﺯﻥ ﻛﻮﻟﻪﭘﺸﺘﻲ ﺑﻴﺸﺘﺮ ﺍﺳﺖ ﺯﻳﺮﺍ ﺍﮔﺮ ﻛﻤﺘﺮ ﺑﺎﺷـﺪ ﻳﻌﻨـﻲ ﻣـﻲﺗـﻮﺍﻧﻴﻢ ﻫﻤـﻪ ﺭﺍ ﺑـﺮﺩﺍﺭﻳﻢ ﻭ
ﺍﻧﺘﺨﺎﺑﻲ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ ﻫﻤﭽﻨﻴﻦ ﻣﺠﻤﻮﻉ ﻭﺯﻥ ﺍﺟﺴﺎﻣﻲ ﻛﻪ ﺍﻧﺘﺨﺎﺏ ﻛﺮﺩﻳﻢ ﺍﺯ ﻭﺯﻥ ﻛﻞ ﻛﻮﻟﻪﭘﺸﺘﻲ ﻧﺒﺎﻳﺪ ﺑﻴﺸﺘﺮ ﺷﻮﺩ.
n
ﺧﺮﻭﺟﻲ :ﻛﺴﺮﻱ ﺍﺯ ﮐﻴﺴﻪ iﺍﹸﻡ ﻛﻪ ﺍﻧﺘﺨﺎﺏ ﻣﻲﺷﻮﺩ ﺩﺍﺧﻞ ﻋﻨﺼﺮ iﺍﻡ ﺁﺭﺍﻳﻪ ﻗﺮﺍﺭ ﻣﻲﮔﻴﺮﺩ.
= Xiﮐﺴﺮﯼ ﺍﺯ ﮐﻴﺴﻪ iﺍﻡ ﮐﻪ ﺍﻧﺘﺨﺎﺏ ﻣﻴﺸﻮﺩ(i=1,…,n) ( Xi =0 or 1) .
ﺭﺍﻩ ﺣﻞ :ﺗﻮﺳﻂ ﻣﺜﺎﻟﻬﺎﯼ ﻧﻘﻀﯽ ﻣﻴﺘﻮﺍﻥ ﻧﺸﺎﻥ ﺩﺍﺩ ﮐﻪ ﺍﻧﺘﺨﺎﺏ ﮐﻴﺴﻪ ﻫﺎ ﺑﺮ ﺍﺳﺎﺱ ﻣﻌﻴﺎﺭ ﻣﻄﺮﺡ ﺷﺪﻩ ﺩﺭ ﻣﺴﺌﻠﻪ ﮐﻮﻟﻪ ﭘﺸـﺘﯽ
ﮐﺴﺮﯼ ﻣﻤﮑﻦ ﺍﺳﺖ ﺑﻪ ﺟﻮﺍﺏ ﺑﻬﻴﻨﻪ ﻣﻨﺠﺮ ﻧﺸﻮﺩ .ﺗﻮﺳﻂ ﻣﺜﺎﻝ ﻧﻘﻀﯽ ﻣﻴﺘﻮﺍﻥ ﺍﻳﻦ ﻣﻮﺿﻮﻉ ﺭﺍ ﻧﺸﺎﻥ ﺩﺍﺩ.
ﺍﻟﮕﻮﺭﻳﺘﻢ:
:gi(y) -۱ﺑﻴﺸﺘﺮﻳﻦ ﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺣﻞ ﻣﺴﺄﻟﻪ ﺑﺮﺍﻱ ﺟﺴﻢ i+1ﺍﹸﻡ ﺗﺎ nﺍﹸﻡ ﺑـﻪ ﺷـﺮﻃﻲ ﻛـﻪ ﮔﻨﺠـﺎﻳﺶ ﻛﻮﻟـﻪ y
ﺑﺎﺷﺪ.
g0(M) -۲ﺑﻴﺸﺘﺮﻳﻦ ﺳﻮﺩ ﺣﺎﺻﻞ ﺍﺯ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺮﺍﻱ ﻛﻞ ﺍﺟﺴﺎﻡ ﺑﻪ ﺷﺮﻃﻲ ﻛﻪ ﮔﻨﺠﺎﻳﺶ ﻛﻮﻟﻪ Mﺑﺎﺷﺪ.
-۳ﺷﺮﺍﻳﻂ ﻣﺮﺯﻱ:
) (
) ، g n y = 0ﺍﺯ ﺟﺴﻢ n+1ﺑﻪ ﺑﻌﺪ ﺟﺴﻤﻲ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ ﻛﻪ ﺳﻮﺩﻱ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ(
) gi ( y
ﺣﺎﻟـﺖ ﺿـﺮﺭ ﺍﺳـﺖ. ،y<0ﮔﻨﺠﺎﻳﺶ ﻛﻮﻟﻪ ﻣﻨﻔﻲ ﻣﻲﺑﺎﺷﺪ ﻳﻌﻨﻲ ﺑﻴﺸﺘﺮ ﺍﺯ ﺣﺪ ﻛﻮﻟﻪ ﺟﺴﻢ ﺩﺍﺭﻳﻢ ﺩﺭ ﺍﻳﻦ ﺣﺎﻟـﺖ
∞( g i ( y ) ) = −
g i ( y ) = Max{g i +1 ( y ), pi +1 + g i +1 ( y − wi +1 )} -۴
M=30 )g0(30
{ }
g 0 ( 30 ) = Max g1 ( 30 ) , 20 + g1 (18 ) = 50
)g1(30 )g1(18
g1 ( 30 ) = Max { g 2 ( 30 ) ,10 + g 2 ( 20 )} = 40
g1 (18 ) = Max { g 2 (18 ) ,10 + g 2 ( 8 )} = 30 )g2(30 )g2(20 )g2(18 )g2(5
g 2 ( 30 ) = Max { g 3 ( 30 ) ,30 + g 3 (17 )} = 30
ﻧﮑﺘﻪ ﺍﺳﺎﺳﯽ ﺩﺭ ﺭﻭﺵ ﻣﺤﺎﺳﺒﻪ ﻣﺎﺗﺮﻳﺲ ﺟﻮﺍﺏ ﺩﺭ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺑﻪ ﮐﺪﺍﻡ ﻳﮏ ﺍﺯ ﺭﻭﺷﻬﺎﯼ ﺯﻳـﺮ ﻣﻴﺘـﻮﺍﻥ ﻣـﺎﺗﺮﻳﺲ ﺭﺍ ﭘـﺮ
ﮐﺮﺩ .ﺑﺎ ﮐﻤﯽ ﺩﻗﺖ ﺩﺭ ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺟﻮﺍﺏ ﺭﺳﻴﺪ.
)function DP_knapsack(W,P,n,M
for i←0 to M do g[n,i] ←0 repeat
for i←0 to n do g[-,i] ←-∞ repeat
for i=n-1 to 0
for j=0 to m
} ]g[i,j] =max{g[i+1,y],pi+1+g[i+1,y-Wi+1
repeat
repeat
]return g[0,M
end.
ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﻲ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ) o(M.nﻣﻲﺑﺎﺷﺪ.
ﻧﮑﺘﻪ :ﺑﺎ ﺍﻳﻨﮑﻪ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺩﺭ ﻇﺎﻫﺮ ﭼﻨﺪﺟﻤﻠﻪﺍﯼ ﺍﺳﺖ ﻭﻟﯽ ﭼﻮﻥ ﻓﻘﻂ ﺑـﻪ ﺗﻌـﺪﺍﺩ ﺍﻗـﻼﻡ ﻭﺭﻭﺩﯼ ﻭﺍﺑﺴـﺘﻪ
ﻧﻴﺴﺖ ﺑﻠﮑﻪ ﺑﻪ ﺣﺠﻢ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﻫﻢ ﻭﺍﺑﺴﺘﻪ ﺍﺳﺖ ﻟﺬﺍ ﺑﻪ ﺁﻥ ﺷﺒﻪ ﭼﻨﺪ ﺟﻤﻠﻪﺍﯼ ) (pseudo polynomialﮔﻮﻳﻨﺪ.
( )
APSP
ﻪ ﻪ
٢
٥
ﺎ ﻫ ﺮ ﺴ ﻣ ﻦ ﻳ ﺮ ﺘ ﻫ ﺎ ﺗ ﻮ ﻛ ﻫ ﺴ ﻣ
- -
ﻤ
ﻣﺴﺌﻠﻪ ﺩﻳﮕﺮﯼ ﮐﻪ ﺍﺯ ﺩﺳﺘﻪ ﻣﺴﺎﺋﻞ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺑﺮ ﺭﻭﯼ ﮔﺮﺍﻑ ﺍﺳـﺖ ،ﻣﺴـﺌﻠﻪ ﻫﻤـﻪ ﮐﻮﺗـﺎﻫﺘﺮﻳﻦ ﻣﺴـﻴﺮﻫﺎ (All
) Pairs Shortest Pathsﻣﻴﺒﺎﺷﺪ ﮐﻪ ﻫﺪﻑ ﺁﻥ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﻃﻮﻝ ﮐﻮﺗـﺎﻫﺘﺮﻳﻦ ﻣﺴـﻴﺮ ﺑـﻴﻦ ﻫﻤـﻪ ﺯﻭﺝ ﺭﺋـﻮﺱ ﮔـﺮﺍﻑ
ﻣﻴﺒﺎﺷﺪ.
ﺩﺭﺍﻳﻦ ﺭﻭﺵ ﻣﺎ ﺗﻤﺎﻡ ﻣﺴﻴﺮﻫﺎﻱ ﻣﻤﻜﻦ ﺍﺯ ﻫﺮ ﺭﺃﺳﻲ ﺭﺍ ﺑﻪ ﻫﺮ ﺭﺃﺱ ﺩﻳﮕﺮ ﻛﻪ ﺍﺯ ﺭﺃﺱ kﺑﮕﺬﺭﺩ ﻳـﺎ ﻧﮕـﺬﺭﺩ ﺭﺍ ﻣﺤﺎﺳـﺒﻪ
ﻣﻲﻛﻨﻴﻢ ﺗﺎ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺑﺪﺳﺖ ﺁﻳﺪ ﻭ ﺧﻮﺩ kﺍﺯ ﻳﻚ ﺗﺎ nﺗﻐﻴﻴﺮ ﻣﻲﻛﻨﺪ .ﻭ ﻭﻗﺘﻲ k=nﺷﺪ ﻣﺎ ﺗﻤﺎﻡ ﺣـﺎﻻﺕ ﻣﻤﻜـﻦ
ﺑﺮﺍﻱ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮ ﺭﺍ ﻣﺤﺎﺳﺒﻪ ﻛﺮﺩﻳﻢ) .ﺟﻮﺍﺏ= ) ( A(i,jﻭ ﻭﻗﺘﻲ k=0ﺍﺳﺖ ﻳﻌﻨﻲ ﺍﺯ ﻫﻴﭻ ﺭﺃﺱ ﻋﺒـﻮﺭ ﻧﻤـﻲﻛﻨـﻴﻢ
ﻣﺴﺘﻘﻴﻤﺎﹰ ﺍﺯ ﺭﺃﺱ iﺑﻪ jﻣﻲﺭﻭﻳﻢ ﻛﻪ ﻫﻤﺎﻥ ) cost(i,jﻣﻲﺑﺎﺷﺪ.
ﻧﮑﺘﻪ :ﺩﺭ ﺻﻮﺭﺗﻲﻛﻪ ﻣﺴﻴﺮ ﺍﺯ iﺑﻪ jﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ .ﺍﺭﺯﺵ ﻳﺎﻟﻬﺎﻱ ﺁﻥ ﺑﺮﺍﻱ ∞ ﻣﻲﺷﻮﺩ.
ﺍﻟﮕﻮﺭﻳﺘﻢ :
=)Ak(i,j
Cل
Bه @A +از راس 2& iراس 2B ;-A, 2& jاز ر
Fس & -#رD& Eر 1از H1 IJ kر "اG@#& 2#
=)An(i,j
Lاب
)A0(i,j)=cost(i,j
٥٤ )(Dynamic Programming
ز
ش و ر
{ }
) A k (i, j ) = min A k −1 (i, j ), A k −1 (i, k ) + A k −1 (k , j
ﻧﮑﺘﻪ :ﺑﺮﺍﻱ ﻣﺤﺎﺳﺒﻪ ) A (i, jﺩﻭ ﺣﺎﻟﺖ ﭘﻴﺶ ﻣﻲﺁﻳﺪ .ﻳﺎ ﻣﺴﻴﺮ ﺑﻬﻴﻨﻪ ﺍﺯ ﺭﺍﺱ kﻣﻴﮕـﺬﺭﺩ ﮐـﻪ ﺩﺭ ﻧﺘﻴﺠـﻪ ﻣﺴـﻴﺮ ﺑـﻪ ﺩﻭ
k
ﻗﺴﻤﺖ i→kﻭ k→jﻗﺎﺑﻞ ﺗﻘﺴﻴﻢ ﺍﺳﺖ)ﮐﻪ ﻫﻴﭻ ﮐﺪﺍﻡ ﺍﺯ ﺍﻳﻦ ﺩﻭ ﻣﺴﻴﺮ ﺭﺍﺱ ﺑﺎ ﺷﻤﺎﺭﻩ ﺑﺰﺭﮔﺘﺮ ﺍﺯ k-1ﻧﺪﺍﺭﻧﺪ( ﻭﻳـﺎ ﺍﺯ
ﺭﺍﺱ kﻧﻤﻴﮕﺬﺭﻳﻢ ﮐﻪ ﺩﺭ ﻧﺘﻴﺠﻪ ﮐﻠﻴﻪ ﺭﺋﻮﺱ ﻧﻤﻴﺘﻮﺍﻧﻨﺪ ﺍﺯ k-1ﺑﺰﺭﮔﺘﺮ ﺑﺎﺷﻨﺪ.
)procedure APSP_Floyd(cost,n,A
for i←1 to n do
for j←1 to n do
]A[i,j] ←cost[i,j
p[i,j] ←0
repeat
repeat
for k←1 to n do
for i←1 to n do
for j←1 to n do
}]A[i,j] ←min{A[i,j],A[i,k]+A[k,j )*(
repeat
repeat
repeat
end.
ﺗﻮﻟﻴﺪ ﻣﺴﻴﺮ :ﺍﮔﺮ ﺩﺭ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺟﻤﻠﻪ )*( ﺭﺍ ﺑﺎ ﺟﻤﻠﻪ ﺯﻳﺮ ﺟﺎﻳﮕﺰﻳﻦ ﮐﻨﻴﻢ ﺁﻧﮕﺎﻩ ﻋﻨﺼﺮ ] P[i,jﻫﻤﻴﺸﻪ ﺭﺍﺱ ﻣﻴﺎﻧﯽ ﺑﻴﻦ
ﺩﻭ ﺭﺍﺱ iﻭ jﺭﺍ ﺩﺭﺑﺮﺩﺍﺭﺩ ﻭ ﻟﺬﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﮐﻤﮏ ﻣﺎﺗﺮﻳﺲ pﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﻫﺎ ﺭﺍ ﺗﻮﻟﻴﺪ ﮐﺮﺩ:
if A[i,k]+A[k,j]<A[i,j] then
]A[i,j] ←A[i,k]+A[k,j
p[i,j] ←k
endif
)(Catalan Number
ﻪ ﺍ
٣
ﻥ ﻼ
٥
ﺘ ﺴ ﺑ ﻭ ﻞ ﺋ ﺎ ﺴ ﻣ ﻭ ﺗ ﺎ ﮐ ﺩ
- -
ﺪ ﻋ
ﺣﺎﻝ ﺑﻪ ﺑﺮﺭﺳﻲ ﭼﻨﺪ ﻣﺴﺌﻠﻪ ﻛﻪ ﻫﻤﮕﯽ ﺁﻧﻬﺎ ﺩﺍﺭﺍﻱ ﭘﺎﺳﺦﻫﺎﻱ ﻳﻜﺴﺎﻥ ﻣﻲﺑﺎﺷﻨﺪ ،ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
-١ﺑﺎ nﮔﺮﻩ ﭼﻨﺪ ﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﻣﻲﺗﻮﺍﻥ ﺳﺎﺧﺖ؟
ﻣﺜﺎﻝ :ﺑﺎ ﺳﻪ ﮔﺮﻩ ﭼﻨﺪ ﺩﺭﺧﺖ ﺩﻭﺩﻭﺋﻲ ﻣﻲﺗﻮﺍﻥ ﺳﺎﺧﺖ؟
(
) 3 − ( m1 × m 2 ) × ( m 3 × m 4 )
) ) 4 − ( m1 × ( ( m 2 × m 3 ) × m 4
) ) ) 5 − ( m1 × ( m 2 × ( m 3 × m 4
-٣ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ nﻭﺭﻭﺩﻱ ﺭﺍ ﺑﻪ ﮐﻤﮏ ﻳﮏ ﭘﺸﺘﻪ ﺩﺭ ﺧﺮﻭﺟﯽ ﭼﺎﭖ ﮐﺮﺩ ﺑﻪ ﻗﺴﻤﯽ ﮐﻪ ﻓﻘﻂ ﻋﻤﻠﻴـﺎﺕ ،read
push،writeﻭ popﻗﺎﺑﻞ ﺍﻧﺠﺎﻡ ﺍﺳﺖ؟
ﻣﺜﺎﻝ ٣ :ﻭﺭﻭﺩﻱ a,b,cﺭﺍ ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ ﺩﺭ ﺧﺮﻭﺟﯽ ﭼﺎﭖ ﮐﺮﺩ؟
و;L ورودM
abc abc
acb
bac
bca
cba 2NO
-٥ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ ﺩﺭ ﻳﮏ ﮔﺮﻳﺪ ﮐﻪ ﺩﺍﺭﺍﯼ nﺳﻄﺮ ﻭ nﺳﺘﻮﻥ ﺍﺳﺖ ،ﺍﺯ ﭘﻮﺷﻪ ﭘﺎﻳﻴﻦ ﺳﻤﺖ ﭼﭗ ﺑﻪ ﮔﻮﺷﻪ ﺑـﺎﻻ
ﺳﻤﺖ ﺭﺍﺳﺖ ﺭﺳﻴﺪ .ﺑﻪ ﻗﺴﻤﺘﻲ ﻛﻪ ﻫﻴﭽﮕﺎﻩ ﺯﻳﺮ ﻗﻄﺮ ﻗﺮﺍﺭ ﻧﮕﻴﺮﻳﻢ ﻭ ﻓﻘﻂ +90ﺩﺭﺟﻪ ﻳﺎ 0ﺩﺭﺟﻪ ﺣﺮﮐـﺖ ﮐﻨـﻴﻢ)ﺷـﮑﻞ
ﺳﻤﺖ ﭼﭗ( ﻳﺎ ﻫﻴﭽﮕﺎﻩ ﺯﻳﺮ ﭘﺎﺭﻩ ﺧﻂ ﻭﺍﺻﻞ ﺑﻴﻦ Aﻭ Bﻗﺮﺍﺭ ﻧﮕﻴﺮﻳﻢ ﻭ ﻓﻘﻂ +45ﻳﺎ -45ﺩﺭﺟﻪ ﺣﺮﮐﺖ ﮐﻨﻴﻢ )ﺷﮑﻞ
ﺳﻤﺖ ﺭﺍﺳﺖ(؟
n
B
n
≡ A B
A
ﻣﺜﺎﻝ :ﺩﺭ ﺷﻜﻞ ﺯﻳﺮ ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ ﺍﺯ ﺭﺃﺱ Aﺑﻪ Bﺭﺳﻴﺪ؟
)ﺑﻪ ﻗﺴﻤﺘﻲ ﻛﻪ ﺣﺮﻛﺖ ﻓﻘﻂ +45ﻭ ﻳﺎ -45ﺩﺭﺟﻪ ﺑﺎﺷﺪ(.
A B
٥٧ )(Dynamic Programming
ز
ش و ر
-٦ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ nﺳﻜﻪ ﺭﺍ ﺩﺭ ﻗﺎﻋﺪﻩ ﻗﺮﺍﺭ ﺩﺍﺩ ﻭ ﺭﻭﻱ ﺁﻥ ﺗﻌﺪﺍﺩ ﺩﻟﺨﻮﺍﻩ ﺳﻜﻪ ﭼﻴﺪ؟
ﻣﺜﺎﻝ :ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ ٣ﺳﻜﻪ ﺭﺍ ﺩﺭ ﻗﺎﻋﺪﻩ ﻗﺮﺍﺭ ﺩﺍﺩ ﻭ ﺭﻭﻱ ﺁﻥ ﺳﻜﻪ ﭼﻴﺪ؟
-٧ﺍﮔﺮ ﭘﻴﻤﺎﻳﺶ preorderﺩﺭﺧﺖ ﺩﻭﺩﻭﻳﻲ ﺑﺮﺍﺑﺮ ﺑﺎ 1,2,3,...,nﺑﺎﺷﺪ ﭼﻨﺪ inorderﺑﺮﺍﯼ ﺁﻥ ﻣﺘﺼﻮﺭ ﺍﺳﺖ؟
ﻓﻘﻂ ﺩﺭﺧﺘﻬﺎﯼ ﺑﺎﻻ ﺍﺳﺖ ﮐﻪ ﭘﻴﻤﺎﻳﺶ preorderﺁﻧﻬﺎ 1,2,3ﺍﺳﺖ ﻭ ﻟﺬﺍ ۵ﻃﺮﻳﻖ inorderﺯﻳﺮ ﺍﻣﮑﺎﻥ ﭘﺬﻳﺮ ﺍﺳﺖ:
1,2,3
1,3,2
2,1,3
2,3,1
٥٨ )(Dynamic Programming
ز
ش و ر
3,2,1
ﻗﺎﺑﻞ ﺍﺛﺒﺎﺕ ﺍﺳﺖ ﮐﻪ ﺟﻮﺍﺏ ﻫﻤﮕﯽ ﺍﻳﻦ ﻣﺴﺎﺋﻞ ﻫﻤﮕﯽ ﺑﺮﺍﺑﺮ ﺑﺎ ﻋﺪﺩ ﻣﻌﺮﻭﻓﯽ ﺑﻪ ﻧﺎﻡ ﻋﺪﺩ ﮐﺎﺗﺎﻻﻥ ﻣﻴﺒﺎﺷﺪ ﮐﻪ ﺩﺍﺭﺍﯼ ﻣﻘﺪﺍﺭ
ﺯﻳﺮ ﺍﺳﺖ:
2n
Cn =
n
n +1
ﺣﺎﻝ ﻧﮑﺘﻪ ﺟﺎﻟﺐ ﺩﺭ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺑﺎﻳﺪ ﺑﺘﻮﺍﻥ ﺛﺎﺑﺖ ﮐﺮﺩ ﮐﻪ ﺍﻳﻦ ﻣﺴﺎﺋﻞ ﻫﻤﮕﯽ ﺫﺍﺗﺎﹰ ﻳﮏ ﻣﺴﺌﻠﻪ ﻫﺴـﺘﻨﺪ ﻭ ﺩﺭ ﻧﺘﻴﺠـﻪ ﺑﺎﻳـﺪ
ﺑﺘﻮﺍﻥ ﻳﮏ ﻧﮕﺎﺷﺖ ﻳﮏ ﺑﻪ ﻳﮏ ﺑﻴﻦ ﺟﻮﺍﺑﻬﺎﯼ ﺁﻧﻬﺎ ﺍﻳﺠﺎﺩ ﮐﺮﺩ.
ﻣﺜﺎﻝ :ﺑﻪ ﺑﺮﺭﺳﻲ ﺭﺍﺑﻄﻪﻫﺎﻱ ﺑﻴﻦ ﺍﻳﻦ ﻣﺴﺌﻠﻪﻫﺎ ﻣﻲﭘﺮﺩﺍﺯﻳﻢ)ﺳﻌﯽ ﮐﻨﻴﺪ ﺍﻳﻦ ﺭﻭﺍﺑﻂ ﺭﺍ ﺍﺯ ﺭﻭﯼ ﺷﮑﻞ ﺑﻴﺎﺑﻴﺪ(.
ﺭﺍﺑﻄﻪﺍﻱ ﺑﻴﻦ ﻣﺴﺌﻠﻪ ١ﻭ ٢
*
M1 *
M2 *
M3 M4
*
*
M1 * *
M4
*
M4 M1
*
M2
M3 M2
M3
* *
M1 M2
٥٩ )(Dynamic Programming
ز
ش و ر
ﺎ ﻫ ﺲ ﻳ ﺮ ﺗ ﺎ ﻣ ﻬ ﺑ ﻭ ﻱ ﻩ ﺮ ﺠ ﻧ ﺯ ﺏ ﺮ ﺿ
- -
ﻣﻴﺪﺍﻧﻴﻢ ﮐﻪ ﺩﺭ ﺿﺮﺏ ﺩﻭ ﻣﺎﺗﺮﻳﺲ ﮐﻪ ﺍﻭﻟﯽ ﺩﺍﺭﺍﯼ mﺳﻄﺮ ﻭ nﺳﺘﻮﻥ ﻭ ﺩﻭﻣﯽ ﺩﺍﺭﺍﯼ nﺳﻄﺮ ﻭ pﺳﺘﻮﻥ ﺍﺳﺖ ﺑﺎﻳﺪ ﺑـﻪ
ﺗﻌﺪﺍﺩ m*n*pﺿﺮﺏ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ﻭﻟﺬﺍ ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﻫﺰﻳﻨﻪ ﺿـﺮﺏ ﺍﻳـﻦ ﺩﻭ ﻣـﺎﺗﺮﻳﺲ ﺭﺍ ﺑﺮﺍﺑـﺮ ﺑـﺎ m*n*pﺩﺭ ﻧﻈـﺮ
ﻣﻴﮕﻴﺮﻳﻢ .ﺑﺎ ﺍﻳﻦ ﻓﺮﺽ ﺑﻪ ﺷﺮﺡ ﺻﻮﺭﺕ ﻣﺴﺌﻠﻪ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ .ﺩﺭ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ nﻣﺎﺗﺮﻳﺲ ﺑﺎﻳﺪ ﺩﺭ ﻫـﻢ
ﺿﺮﺏ ﺷﻮﻧﺪ ﻭ ﻫﺪﻑ ﺗﻌﻴﻴﻦ ﻃﺮﻳﻘﯽ ﺍﺯ ﺿﺮﺏ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﺁﻥ ﻫﺰﻳﻨﻪ ﮐﻤﻴﻨﻪ ﮔﺮﺩﺩ)ﻣﻴـﺪﺍﻧﻴﻢ ﮐـﻪ ﺗﻌـﺪﺍﺩ ﻃـﺮﻕ ﺿـﺮﺏ n
ﻣﺎﺗﺮﻳﺲ ﺑﺮﺍﺑﺮ ﺑﺎ Cn-1ﺍﺳﺖ(.
٦٠ )(Dynamic Programming
ز
ش و ر
m[i,i]=0 -۲
-۳ﺟﻮﺍﺏ =]m[1,n
m[i, j ] = min i≤k < j {m[i, k ] + m[k + 1, j ] + pi −1 p k p j } -۴
ﺗﻮﺿﻴﺢ:
ﺑﺎ ﮐﻤﯽ ﺩﻗﺖ ﺩﺭ ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﻧﺤﻮﻩ ﻣﺤﺎﺳﺒﻪ ﻋﻨﺎﺻﺮ ﻣﺎﺗﺮﻳﺲ mﺩﺳﺖ ﻳﺎﻓﺖ .ﻫﻤﭽﻨـﻴﻦ ﭼـﻮﻥ ﻫﻤﻴﺸـﻪ ﺩﺭ
] m[i,jﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ i≤jﻟﺬﺍ ﻓﻘﻂ ﻋﻨﺎﺻﺮ ﺑﺎﻻﯼ ﻗﻄﺮ ﺍﺻﻠﯽ ﺩﺭ ﻣﺎﺗﺮﻳﺲ mﺑﺎﻳﺪ ﻣﺤﺎﺳﺒﻪ ﺷﻮﻧﺪ.
ﻭﺍﺿﺢ ﺍﺳﺖ ﮐﻪ ﺑﺮﺍﯼ ﻣﺤﺎﺳﺒﻪ ﻣﺎﺗﺮﻳﺲ mﺑﺎﻳﺪ ﻋﻨﺎﺻﺮ ﺑﺎﻻﯼ ﻗﻄﺮ ﺍﺻﻠﯽ ﻣﺤﺎﺳﺒﻪ ﺷﻮﻧﺪ ﻭ ﺑﺮﺍﯼ ﻫﺮ ﺩﺭﺍﻳﻪ ﻧﻴﺰ ﺩﺭ ﺑﺪﺗﺮﻳﻦ
ﻭﺿﻌﻴﺖ ﻧﻴﺎﺯ ﺑﻪ ﻣﻴﻨﻴﻤﻢ ﮔﻴﺮﯼ ﺭﻭﯼ n-1ﻋﻀﻮ ﻭﺟﻮﺩ ﺩﺍﺭﺩ)ﺑﺮ ﺍﺳﺎﺱ ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ ﺩﺭ ﺍﻟﮕـﻮﺭﻳﺘﻢ( ﻭ ﺍﺯ ﺍﻳـﻦ ﺭﻭ ﺍﻳـﻦ
ﺍﻟﮕﻮﺭﻳﺘﻢ ﺩﺍﺭﺍﯼ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ) O(n3ﻣﻴﺒﺎﺷﺪ.
ﻣﺜﺎﻝ:
ﻣﺤﺎﺳﺒﻪ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺿﺮﺏ ٤ﻣﺎﺗﺮﻳﺲ ) :ﺑﻪ ٥ﻃﺮﻳﻖ ﻣﻲﺗﻮﺍﻥ ٤ﻣﺎﺗﺮﻳﺲ ﺭﺍ ﺿﺮﺏ ﻛﺮﺩ(.
ﻭﺭﻭﺩﯼ:
)M1(2*3)*M2(3*5)*M3(5*4)*M4(4*1
m[1,2]=min{m[1,1]+m[2,2]+p0p1p2}=2*3*5=30
m[2,3]=min{m[2,2]+m[3,3]+p1p2p3}=3*5*4=60
}m[1,3]=min{m[1,1]+m[2,3]+p0p1p3 , m[1,2]+m[3,3]+p0p2p3
=min{60+2*3*4,30+2*5*4}=70
m[3,4]=min{m[3,3]+m[4,4]+p2p3p4 }=20
}m[2,4]=min{m[2,2]+m[3,4]+p1p2p4 , m[2,3]+m[4,4]+p1p3p4
=min{20+3*5*1,60+3*4*1}=35
m[1,4]=min{m[1,1]+m[2,4]+p0p1p4 , m[1,2]+m[3,4]+p0p2p4, m[1,3]+ m[4,4] +
} p0p3p4
=min{35+2*3*1, 30+20+2*5*1,70+2*4*1}=41
ﻧﮑﺘﻪ :ﺑﺮﺍﯼ ﺑﺪﺳﺖ ﺁﻭﺭﺩﻥ ﻃﺮﻳﻖ ﺑﻬﻴﻨﻪ ﺿﺮﺏ ﺑﺎﻳﺪ ﺩﻗﺖ ﮐﺮﺩ ﮐﻪ ﺟﻮﺍﺏ ﺑﻬﻴﻨﻪ ﺑـﺮ ﺍﺳـﺎﺱ ﮐـﺪﺍﻡ ﺍﻧﺘﺨـﺎﺏ ﺑﺪﺳـﺖ ﺁﻣـﺪﻩ
ﺍﺳﺖ .ﺑﺮﺍﯼ ﻣﺜﺎﻝ ﺟﻮﺍﺏ ۴۱ﺩﺭ ﻣﺜﺎﻝ ﺑﺎﻻ ﺑﻪ ﺧﺎﻃﺮ ﮐﻤﻴﻨﻪ ﺑﻮﺩﻥ 35+2*3*1ﺑﺪﺳﺖ ﺁﻣﺪﻩ ﺍﺳـﺖ ﮐـﻪ ﺍﻳـﻦ ﻣﻘـﺪﺍﺭ ﻧﻴـﺰ
ﻫﻤﺎﻥ m[1,1]+m[2,4]+p0p1p4ﺍﺳﺖ ﻭ ﻟﺬﺍ ﺑﺎﻳﺪ ﺍﺑﺘﺪﺍ M1ﺭﺍ ﺟﺪﺍ ﮐﺮﺩ ﻭ ﺟﻮﺍﺏ ﺑﻬﻴﻨـﻪ M2*...*M4ﺭﺍ ﺑﺪﺳـﺖ
ﺁﻭﺭﺩ ﻭ ﺍﻳﻦ ﺩﻭ ﻣﺎﺗﺮﻳﺲ ﺭﺍ ﺩﺭ ﻫﻢ ﺿﺮﺏ ﮐﺮﺩ m[2,4] .ﻧﻴﺰ ﺧﻮﺩ ﺍﺯ ﺭﻭﯼ m[2,2]+m[3,4]+p1p2p4ﻣﺤﺎﺳﺒﻪ ﺷﺪﻩ
ﺍﺳﺖ ﻭ ﻟﺬﺍ ﺑﺎﻳﺪ ﺍﺑﺘﺪﺍ ﺟﻮﺍﺏ ﺑﻬﻴﻨﻪ M3*M4ﺭﺍ ﺑﺪﺳﺖ ﺁﻭﺭﺩﻩ ﻭ ﺩﺭ M2ﺿﺮﺏ ﮐﺮﺩ .ﭘﺲ ﻃﺮﻳﻘﻪ ﺿﺮﺏ ﺑﻬﻴﻨﻪ ﺑﺼـﻮﺭﺕ
ﺯﻳﺮ ﺍﺳﺖ:
) ) )(M1) * ( (M2) * ( (M3) * (M4
ﻪ
٥ ٥
ﺏ ﻣ ﻌ ﺿ ﻬ ﺑ ﯼ ﺑ ﺚ ﻣ
- -
ﺪ ﺤ ﯽ ﻠ ﺪ ﻨ ﭼ ﻨ ﻴ ﺪ ﻨ ﻠ ﺜ
ﻳﮑﯽ ﺩﻳﮕﺮ ﺍﺯ ﻣﺴﺌﻠﻪ ﻫﺎﻱ ﺟﺎﻟﺒﯽ ﮐﻪ ﺗﻮﺳﻂ ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﻣﻴﺘﻮﺍﻥ ﺑﺮﺍﯼ ﺁﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ ﮐﺎﺭﺍﻳﻲ ﺗﻮﻟﻴﺪ ﮐﺮﺩ ﻣﺴـﺌﻠﻪ
ﻣﺜﻠﺚ ﺑﻨﺪﯼ ) (triangulationﺑﻬﻴﻨﻪ ﻳﮏ ﭼﻨﺪ ﺿﻠﻌﯽ ﻣﺤﺪﺏ ﻧﺎﻡ ﺩﺍﺭﺩ .ﺍﮐﻨﻮﻥ ﺑﻪ ﺑﻴـﺎﻥ ﺍﻳـﻦ ﻣﺴـﺌﻠﻪ ﻭ ﺭﻭﺵ ﺣـﻞ ﺁﻥ
ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
ﻭﺭﻭﺩﯼ :ﻣﺨﺘﺼﺎﺕ n+1ﺭﺍﺱ ﺍﺯ ﻳﮏ n+1ﺿﻠﻌﯽ ﻣﺤﺪﺏ ﮐﻪ ﺭﺋﻮﺱ ﺁﻥ ﺑﺼﻮﺭﺕ V0, V1, ..., Vnﻣﻴﺒﺎﺷﺪ.
ﻫﺪﻑ :ﻣﺜﻠﺚ ﺑﻨﺪﯼ ﭼﻨﺪ ﺿﻠﻌﯽ ﺑﻪ ﮔﻮﻧﻪ ﺍﯼ ﮐﻪ ﻣﺠﻤﻮﻉ ﻣﺤﻴﻂ ﻣﺜﻠﺜﻬﺎ ﮐﻤﻴﻨﻪ ﮔﺮﺩﺩ.
٦٢ )(Dynamic Programming
ز
ش و ر
ﻗﺒﻞ ﺍﺯ ﺍﺭﺍﺋﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺍﺑﺘﺪﺍ ) W(i,j,kﺭﺍ ﺑﺼﻮﺭﺕ ﻫﺰﻳﻨﻪ ﻣﺜﻠﺚ Vi,Vj,Vkﻳﺎ ﻫﻤﺎﻥ ﻣﺤﻴﻂ ﻣﺜﻠـﺚ Vi,Vj,Vkﺗﻌﺮﻳـﻒ
ﻣﻴﮑﻨﻴﻢ.
ﺍﻟﮕﻮﺭﻳﺘﻢ:
ﺷﺒﻴﻪ ﺩﻳﮕﺮ ﻣﺴﺎﺋﻞ ﺑﺎﻳﺪ ﺑﻪ ﺍﺭﺍﺋﻪ ۴ﻣﺮﺣﻠﻪ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﺑﭙﺮﺩﺍﺯﻳﻢ:
-۱ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﻣﺜﻠﺚ ﺑﻨﺪﯼ ﺭﻭﯼ ﺭﺋﻮﺱ t[i,j] =Vi-1, Vi, ..., Vj
) t[i,i+1]=0 -۲ﺑﺪﻳﻬﯽ(
-۳ﺟﻮﺍﺏ = ]t[1,n
-۴ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ:
{
) t [ i , j ] = min t [i , k ] + t [ k + 1, j ] + w (v i −1 ,v k ,v j }
i ≤k < j
Vj
Vi-1
24@Q& IC 2& E"# M"4& R/S
Vi
ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ ﺑﺪﻳﻦ ﺻﻮﺭﺕ ﻧﻮﺷﺘﻪ ﺷﺪﻩ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﻃﺮﻳﻘﻪ ﻣﺜﻠﺚ ﺑﻨﺪﯼ ﺑﻬﻴﻨﻪ ﺭﺋـﻮﺱ Vi-1ﺗـﺎ Vjﺭﺍﺳـﯽ ﻣﺜـﻞ Vk
ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﻫﻢ ﺍﺯ Vi-1ﻭ ﻫﻢ ﺍﺯ Vjﺑﻪ ﺁﻥ ﻗﻄـﺮﯼ ﻣﺘﺼـﻞ ﮔﺮﺩﻳـﺪﻩ ﺍﺳـﺖ ﻭ ﻫﻤﭽﻨـﻴﻦ Vi-1ﺗـﺎ Vkﻭ Vkﺗـﺎ Vj
ﺑﺼﻮﺭﺕ ﺑﻬﻴﻨﻪ ﻣﺜﻠﺚ ﺑﻨﺪﯼ ﺷﺪﻩ ﺍﻧﺪ .ﺑﻨﺎﺑﺮﺍﻳﻦ ﺑﺮﺍﯼ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﭼﻨﻴﻦ kﺍﯼ ﺑﺎﻳﺪ ﺗﻤﺎﻡ ﺭﺋﻮﺱ ﺑﻴﻦ Vi-1ﺗﺎ Vjﺭﺍ ﺑﺮﺭﺳـﯽ
ﮐﺮﺩ.
ﻣﺜﺎﻝ :ﭼﻨﺪ ﺿﻠﻌﻲ ﺯﻳﺮ ﺭﺍ ﺑﻪ ﺭﻭﺵ ﺑﺎﻻ ﺑﺎ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﻣﺜﻠﺚﺑﻨﺪﻱ ﻛﻨﻴﺪ؟
t [1,2] = min{t (1,1) + t (2,2 ) + v0 v1v 2 } = 1 + 2 + 5
{
t [1,3] = min t (1,2 ) + t (2,3) + v 0 v 2 v3 = 3 + 2 + 3 5 2 2
t [3,4] = min{t (3,3) + t (4,4 ) + v 2 v3 v 4 } = 3 5 2
t [2,4] = min{t (2,2 ) + t (3,4 ) + v1v 2 v3 = 6 + 2 5
t (2,3) + t (4,4 ) + v1v3 v 4 = 6 + 2 5 }
٦٣ )(Dynamic Programming
ز
ش و ر
)(LCS
ﮎ
ﻪ
٦
٥
ﺮ ﺘ ﺸ ﻣ ﻟ ﺎ ﻧ ﺩ ﺮ ﻳ ﺯ ﻦ ﻳ ﺮ ﺗ ﻧ ﻻ ﻮ ﻃ
- -
ﺒ ﻲ
ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻣﺴﺌﻠﻪ ﻃﻮﻻﻧﯽ ﺗﺮﻳﻦ ﺯﻳـﺮ ﺩﻧﺒﺎﻟـﻪ ﻣﺸـﺘﺮﮎ ) (Longest Common Subsequenceﻣﻴﭙـﺮﺩﺍﺯﻳﻢ.
ﺍﺑﺘﺪﺍ ﺗﻌﺮﻳﻔﻬﺎﯼ ﻻﺯﻡ ﺭﺍ ﺍﺭﺍﺋﻪ ﻣﻴﺪﻫﻴﻢ.
ﺭﺷﺘﻪ :ﺩﻧﺒﺎﻟﻪ ﺍﯼ ﺍﺯ ﻛﺎﺭﺍﻛﺘﺮﻫﺎﻱ ﭘﺸﺖﺳﺮﻫﻢ ﺑﺎ ﺗﺮﺗﻴﺒﯽ ﺧﺎﺹ .ﺑﺮﺍﯼ ﻣﺜﺎﻝ ﺩﺭ ﺯﻳﺮ ﺭﺷـﺘﻪ Xﮐـﻪ ﺩﻧﺒﺎﻟـﻪ ﺍﯼ ﺍﺯ mﺣـﺮﻑ
ﺍﺳﺖ ﺩﻳﺪﻩ ﻣﻴﺸﻮﺩ.
ﭘﻴﺸﻮﻧﺪ iﺍﻡ i :Xﺣﺮﻑ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺍﺯ ﺍﺑﺘﺪﺍﯼ ﺭﺷﺘﻪ Xﺭﺍ ﭘﻴﺸﻮﻧﺪ iﺍﻡ Xﮔﻮﻳﻨﺪ ﻭ ﺑﺎ Xiﻧﺸﺎﻥ ﻣﻴﺪﻫﻨﺪ.
ﺣﺮﻑ iﺍﻡ h :ﺍﻣﻴﻦ ﺣﺮﻑ ﺭﺷﺘﻪ Xﺭﺍ ﺑﺎ xiﻧﺸﺎﻥ ﻣﻴﺪﻫﻨﺪ.
> X =< x1 ,L, xm
> X i =< x1 ,L, xi
> Z =< z1 ,L, z k
ﻣﺜﺎﻝ:
>X=<A,B,B,A,D,A,B,F
>Z= <B,A,A,F
i1 = 2 ⇒ z1 = x2
i = 4 ⇒ z = x
2 2 4
i3 = 6 ⇒ z 3 = x6
i4 = 8 ⇒ z 4 = x8
ﺩﺭﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺩﺭ ﻭﺭﻭﺩﻱ ﺩﻭ ﺭﺷﺘﻪ ﺑﻪ ﻃﻮﻝﻫـﺎﻱ n,mﻭﺟـﻮﺩ ﺩﺍﺭﺩ .ﻛـﻪ ﻫـﺪﻑ ﻣﺴـﺌﻠﻪ ﺑﺪﺳـﺖ ﺁﻭﺭﺩﻥ ﻃـﻮﻻﻧﻲﺗـﺮﻳﻦ
ﺯﻳﺮﺩﻧﺒﺎﻟﻪ ﻣﺸﺘﺮﻙ ﻣﻲﺑﺎﺷﺪ.
ﻭﺭﻭﺩﯼ:
ﺩﻭ ﺩﻧﺒﺎﻟﻪ Xﻭ Yﮐﻪ ﺍﻭﻟﯽ ﺑﻪ ﻃﻮﻝ mﻭ ﺩﻭﻣﯽ ﺑﻪ ﻃﻮﻝ nﻣﻴﺒﺎﺷﺪ.
ﺧﺮﻭﺟﯽ :ﻃﻮﻝ ﻃﻮﻻﻧﯽ ﺗﺮﻳﻦ ﺯﻳﺮ ﺩﻧﺒﺎﻟﻪ ﻣﺸﺘﺮﮎ Xﻭ Y
٦٤ )(Dynamic Programming
ز
ش و ر
ﻳﻚ ﺭﺍﻩﺣﻞ ﺳﺎﺩﻩ ﺟﻬﺖ ﺣﻞ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺗﺎﺑﻊ ﺯﻳﺮ ﻭ ﻳﻚ ﺁﺭﺍﻳﻪ ﺩﻭﺑﻌﺪﻱ m × nﻣﻲﺑﺎﺷﺪ.
ﺷﺒﻴﻪ ﺩﻳﮕﺮ ﻣﺴﺎﺋﻞ ﺑﺎﻳﺪ ﺑﻪ ﺍﺭﺍﺋﻪ ۴ﻣﺮﺣﻠﻪ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﺑﭙﺮﺩﺍﺯﻳﻢ:
-۱ﻃﻮﻝ ﻃﻮﻻﻧﯽ ﺗﺮﻳﻦ ﺯﻳﺮ ﺩﻧﺒﺎﻟﻪ ﻣﺸﺘﺮﮎ Xiﻭ c[i,j] = Yj
) c[i,0]=c[0,j]=0 ; ∀i,j -۲ﺑﺪﻳﻬﯽ() ﻭﻗﺘﻲ ﻳﻜﻲ ﺍﺯ ﺭﺷﺘﻪﻫﺎ ﺗﻬـﻲ ﺑﺎﺷـﺪ ﻫـﻴﭻ ﺍﺷـﺘﺮﺍﻛﻲ ﻭﺟـﻮﺩ ﻧﺨﻮﺍﻫـﺪ
ﺩﺍﺷﺖ(
-۳ﺟﻮﺍﺏ = ]c[m,n
-۴ﺭﺍﺑﻄﻪ ﺑﺎﺯﮔﺸﺘﯽ:
c[i − 1, j − 1] + 1 ; xi = y j
c[i, j ] =
max{c[i − 1, j ], c[i, j − 1]} ; else
ﺑﻪ ﺭﺍﺣﺘﯽ ﻣﻴﺘﻮﺍﻥ ﺑﺎ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻳﮏ ﻣﺎﺗﺮﻳﺲ ) (m+1)*(n+1ﺑﻪ ﺟﺎﯼ cﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺎﻻ ﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﯼ ﻧﻤﻮﺩ.
ﺭﻭﺵ ﻣﺤﺎﺳﺒﻪ :ﭼﻮﻥ ci,jﺑﺮﺍﯼ ﻣﺤﺎﺳﺒﻪ ﻧﻴﺎﺯ ﺑﻪ ci-1,j-1ﻭ ci,j-1ﻭ ci-1,jﺩﺍﺭﺩ ﻟﺬﺍ ﺭﻭﺵ ﻣﺤﺎﺳـﺒﻪ ﺑﺼـﻮﺭﺕ ﺯﻳـﺮ ﻗﺎﺑـﻞ
ﺍﺟﺮﺍ ﻣﻴﺒﺎﺷﺪ:
:ﻣﺜﺎﻝ
n ﺑﻪ ﻃﻮﻝY ﻭm ﺑﻪ ﻃﻮﻝX ﺩﻭ ﺩﻧﺒﺎﻟﻪ:ﻭﺭﻭﺩﻱ
Y ﻭX ﻃﻮﻝ ﻃﻮﻻﻧﻲﺗﺮﻳﻦ ﺯﻳﺮ ﺩﻧﺒﺎﻟﻪ ﻣﺸﺘﺮﻙ:ﺧﺮﻭﺟﻲ
X= <A,B,B,A,D,A,B,F>
Y= <B,F,A,F,D,H,B>
٦٦ )(Dynamic Programming
ز
ش و ر
ﺟﻬﺖ ﻭﺿﻮﺡ ﺑﻴﺸﺘﺮ ﻫﺮ ﺩﻭ ﻣﺎﺗﺮﻳﺲ cﻭ bﺩﺭ ﻳﮏ ﻣﺎﺗﺮﻳﺲ ﻧﺸﺎﻥ ﺩﺍﺩﻩ ﺷﺪﻩ ﺍﺳﺖ.
ﻧﮑﺘﻪ :ﻭﻗﺘﯽ ﻫﺮ ﺩﻭ ﺩﺭﺍﻳﻪ ] c[i-1,jﻭ ] c[i,j-1ﺑﺎ ﻫﻢ ﺑﺮﺍﺑﺮ ﺑﺎﺷـﻨﺪ ﻫـﺮ ﮐـﺪﺍﻡ ﺍﺯ ﺁﻧﻬـﺎ ﺑـﻪ ﺩﻟﺨـﻮﺍﻩ ﻣﻴﺘﻮﺍﻧﻨـﺪ ﺑـﻪ ﻋﻨـﻮﺍﻥ
}] max{c[i-1,j],c[i,j-1ﺍﻧﺘﺨﺎﺏ ﺷﻮﻧﺪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻧﻮﺷﺘﻪ ﺷﺪﻩ ﺩﺭ ﺑﺎﻻ ﺑﺼـﻮﺭﺗﯽ ﺍﺳـﺖ ﮐـﻪ ] c[i,j-1ﺭﺍ ﺑـﻪ ﻋﻨـﻮﺍﻥ
ﺑﻴﺸﻴﻨﻪ ﺍﻧﺘﺨﺎﺏ ﻣﻴﮑﻨﺪ.
ﺍﻟﮕﻮﺭﻳﺘﻢ print_LCSﻣﺴﻴﺮ ﻣﺸﺨﺺ ﺷﺪﻩ ﺑﻪ ﺭﻧﮓ ﺧﺎﮐﺴﺘﺮﯼ ﺭﺍ ﺍﺯ ﺁﺧﺮ ﺑﻪ ﺍﻭﻝ ﻃﻲ ﮐـﺮﺩﻩ ﻭ ﺩﻭﺑـﺎﺭﻩ ﺑـﺎﺯﻣﻴﮕﺮﺩﺩ)ﺑـﻪ
ﻋﻠﺖ ﺑﺎﺯﮔﺸﺘﯽ ﺑﻮﺩﻥ ﺭﻭﻳﻪ( ﻭ ﺩﺭ ﺣﻴﻦ ﺑﺎﺯﮔﺸﺖ ﺧﺎﻧﻪ ﻫﺎﻳﻲ ﮐﻪ ﺩﺭ ﺁﻥ ﻓﻠﺶ ﻣﻮﺭﺏ ﻣﻴﺒﻴﻨﺪ ﺭﺍ ﭼـﺎﭖ ﻣﻴﮑﻨـﺪ .ﺍﺯ ﺍﻳـﻦ ﺭﻭ
ﻃﻮﻻﻧﯽ ﺗﺮﻳﻦ ﺯﻳﺮ ﺩﻧﺒﺎﻟﻪ ﻣﺸﺘﺮﮎ Xﻭ Yﺑﺼﻮﺭﺕ ﺯﻳﺮ ﭼﺎﭖ ﺧﻮﺍﻫﺪ ﺷﺪ:
>Z= <B,A,D,B
ﻧﮑﺘﻪ :ﺑﺪﻭﻥ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻣﺎﺗﺮﻳﺲ bﻫﻢ ﺍﻟﮕﻮﺭﻳﺘﻢ print_LCSﻣﻴﺘﻮﺍﻧﺪ ﻃﻮﻻﻧﯽ ﺗﺮﻳﻦ ﺯﻳﺮ ﺩﻧﺒﺎﻟـﻪ ﻣﺸـﺘﺮﮎ ﺭﺍ ﭼـﺎﭖ
ﮐﻨﺪ!.
٧
٥
ﺩ ﺮ ﻩ ﺭ ﻭ ﺩ ﻩ ﺷ ﻭ ﺮ ﻓ
- -
ﺗﻌﺮﻳﻒ :ﺩﻭﺭ ﻫﺎﻣﻴﻠﺘﻮﻧﯽ ﺩﺭ ﻳﮏ ﮔﺮﺍﻑ ﺩﻭﺭﯼ ﺍﺳﺖ ﮐﻪ ﺍﺯ ﻫﻤﻪ ﺭﺋﻮﺱ ﺩﻗﻴﻘﺎﹰ ﻳﮑﺒﺎﺭ ﺑﮕﺬﺭﺩ.
ﺩﺭ ﻣﺴﺌﻠﻪ ﻓﺮﻭﺷﻨﺪﻩ ﺩﻭﺭﻩ ﮔﺮﺩ ) (Traveling Salesman Problemﻳﺎ ، TSPﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺩﻭﺭ ﻫﻤﻴﻠﺘﻮﻧﯽ ﺑـﺎ
ﻫﺰﻳﻨﻪ ﻣﻴﻨﻴﻤﻢ ﺩﺭ ﻳﮏ ﮔﺮﺍﻑ ﻭﺯﻥ ﺩﺍﺭ ﻭﺭﻭﺩﯼ ﻣﻴﺒﺎﺷﺪ.
ﻓﺮﺽ ﮐﻨﻴﺪ ﮔﺮﺍﻑ ﻭﺭﻭﺩﯼ ﺑﺼﻮﺭﺕ ) G(V,Eﻣﻴﺒﺎﺷﺪ ﮐﻪ ﺩﺭ ﺁﻥ } V={1,2,...,nﺍﺳﺖ ﻭ ci,jﻧﺸﺎﻧﺪﻫﻨﺪﻩ ﻫﺰﻳﻨﻪ ﻳـﺎﻝ
) (i,jﺑﺎﺷﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﺪﻭﻥ ﮐﻢ ﺷﺪﻥ ﺍﺯ ﮐﻠﻴﺖ ﻣﺴﺌﻠﻪ ﻓﺮﺽ ﮐﻨﻴﺪ ﺭﺍﺱ ﺁﻏﺎﺯﻳﻦ ﺭﺍﺱ ﺷﻤﺎﺭﻩ ۱ﺑﺎﺷﺪ.
٦٧ )(Dynamic Programming
ز
ش و ر
ﺷﺒﻴﻪ ﺑﻘﻴﻪ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﻳﻲ ﮐﻪ ﺑﻪ ﺭﻭﺵ ﺑﺮﻧﺎﻣﻪ ﺳﺎﺯﯼ ﭘﻮﻳﺎ ﺍﺭﺍﺋﻪ ﺷﺪ ﺑﺎﻳﺪ ۴ﻣﺮﺣﻠﻪ ﺭﺍ ﻃﺮﺍﺣﯽ ﮐﺮﺩ:
-۱ﻃﻮﻝ ﮐﻮﺗﺎﻫﺘﺮﻳﻦ ﻣﺴﻴﺮﯼ ﮐﻪ ﺍﺯ ﺭﺍﺱ iﺷﺮﻭﻉ ﺷﺪﻩ ﻭ ﺍﺯ ﮐﻠﻴﻪ ﺭﺋﻮﺱ ﻣﺠﻤﻮﻋـﻪ Sﺩﻗﻴﻘـﺎﹰ ﻳﮑﺒـﺎﺭ ﺑﮕـﺬﺭﺩ ﻭ ﺑـﻪ
ﺭﺍﺱ ۱ﺧﺘﻢ ﺷﻮﺩ = )(i∉S , 1∉S) g(i,S
) g(i, ∅)=ci,1 -۲ﺑﺪﻳﻬﯽ(
-۳ﺟﻮﺍﺏ = )}g(1, V-{1
(j∈S, 1∉S, i∉S) g(i,S)= min{ci,j + g( j, S - {j} ) } -۴
ﻣﺜﺎﻝ :ﺩﺭ ﮔﺮﺍﻑ ﺯﻳﺮ ﺩﻭﺭ ﻫﺎﻣﻴﻠﺘﻮﻧﯽ ﺑﺎ ﻫﺰﻳﻨﻪ ﮐﻤﻴﻨﻪ ﺭﺍ ﭘﻴﺪﺍ ﮐﻨﻴﺪ:
١
١٠
١
٩ ٢٠
٣ ٢
١٣
٨ ١٠
١٢ ٨
٩ T
ﺗﻮﻟﻴﺪ ﺩﻭﺭ ﮐﻤﻴﻨﻪ :ﺣﺎﻝ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺍﻳﻨﮑﻪ ﻣﻘﺪﺍﺭ ۳۵ﺑﺮ ﺍﺳﺎﺱ ﮐﻤﻴﻨﻪ ﺑﻮﺩﻥ ﮐﺪﺍﻡ ﻣﻘﺪﺍﺭ ﺗﻮﻟﻴﺪ ﺷﺪﻩ ﺍﺳﺖ ﺑﻪ ﺳـﻤﺖ ﻋﻘـﺐ
ﺑﺎﺯﻣﻴﮕﺮﺩﻳﻢ.
⇒ 35 = c1, 2 + g (2,{3,4}) = c1, 2 + c2, 4 + c4,3 + c3,1
14243
)}c2 , 4 + g ( 4 ,{3
1424 3
c 4 , 3 + c3 ,1
١
١٠
٣ ٢
١٠
٩ T
ﺗﺤﻠﻴﻞ ﺯﻣﺎﻧﯽ :ﺑﺎ ﮐﻤﯽ ﺩﻗﺖ ﻣﻴﺘﻮﺍﻥ ﺩﺭﻳﺎﻓﺖ ﮐﻪ ﻭﻗﺘﯽ |S|=n-1ﺑﺎﺷﺪ ﺗﻌﺪﺍﺩ ﻣﻘﺎﺩﻳﺮﯼ ﮐﻪ ﺑﺎﻳﺪ ﺭﻭﯼ ﺁﻧﻬﺎ ﻣﻴﻨﻴﻤﻢ ﻣﺤﺎﺳـﺒﻪ
ﮐﻨﻴﻢ n-1ﺍﺳﺖ ﻭ ﺩﺭ ﺑﻘﻴﻪ ﺣﺎﻻﺕ ﻭﻗﺘﯽ |S|=kﺍﺳﺖ ﺩﺭ ﺭﺍﺑﻄﻪ ) ، g(i,Sﺗﻌﺪﺍﺩ ﺣﺎﻻﺗﯽ ﮐﻪ ﻣﺘﻐﻴﺮ iﻣﻴﺘﻮﺍﻧﺪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ
n-1ﺣﺎﻟﺖ ﻭ ﺗﻌﺪﺍﺩ ﺣﺎﻻﺗﯽ ﮐﻪ ﻣﻴﺘﻮﺍﻥ ﻳﮏ ﻣﺠﻤﻮﻋﻪ kﻋﻀﻮﯼ ﺍﺯ n-1ﻋﻀﻮ ﺍﻧﺘﺨﺎﺏ ﮐﻨﻴﻢ ﺑﺮﺍﺑﺮ ﺑﺎ ﺗﺮﮐﻴـﺐ kﺍﺯ n-1
ﻣﻴﺒﺎﺷﺪ .ﺍﺯ ﺍﻳﻦ ﺭﻭ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺮﺍﺑﺮ ﺑﺎ ﻣﻘﺪﺍﺭ ﺯﻳﺮ ﺧﻮﺍﻫﺪ ﺑﻮﺩ:
n −2
n − 1
(n − 1) + ∑ (n − 1)
k =0 k
۶
)(Backtracking ﺩ ﺮ ﮕ ﺒ ﻘ ﻋ ﺵ ﻭ ﺭ -
ﺩﺭ ﺑﻌﻀﯽ ﺷﺮﺍﻳﻂ ﺩﺭ ﻫﻨﮕﺎﻡ ﺣﻞ ﻣﺴﺌﻠﻪ ﻧﻤﻴﺘﻮﺍﻥ ﺍﺯ ﺭﻭﺵ ﺧﺎﺻﯽ ﺍﺳـﺘﻔﺎﺩﻩ ﮐـﺮﺩ ﻭ ﺍﺯ ﺍﻳـﻦ ﺭﻭ ﻻﺯﻡ ﻣﻴﺸـﻮﺩ ﮐـﻪ ﻓﻀـﺎﯼ
ﺣﺎﻻﺕ ﺑﻄﻮﺭ ﮐﺎﻣﻞ ﺟﺴﺘﺠﻮ ﺷﺪﻩ ﺗﺎ ﺟﻮﺍﺏ ﻣﺴﺌﻠﻪ ﻣﺸﺨﺺ ﺷﻮﺩ .ﺩﺭ ﺍﻳﻦ ﺷﺮﺍﻳﻂ ﺍﺯ ﺭﻭﺵ ﺧﺎﺻـﯽ ﺑـﻪ ﻧـﺎﻡ ﺭﻭﺵ ﭘـﻲ-
ﺟﻮﻳﻲ ﺑﻪ ﻏﻘﺐ ﻳﺎ ﺭﻭﺵ ﻋﻘﺒﮕﺮﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻴﺸﻮﺩ .ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺩﺭﺧﺖ ﻓﻀﺎﯼ ﺣﺎﻟـﺖ ﺑـﻪ ﺭﻭﺵ "ﻋﻤـﻖ ﺍﻭﻝ" ﺟﺴـﺘﺠﻮ
ﻣﻴﺸﻮﺩ ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺗﺎ ﺯﻣﺎﻧﯽ ﮐﻪ ﺍﺯ ﺍﺷﺘﺒﺎﻩ ﺑﻮﺩﻥ ﻳﮏ ﻣﺴﻴﺮ ﻣﻄﻤﺌﻦ ﻧﺸـﺪﻩﺍﻳـﻢ ﺁﻥ ﻣﺴـﻴﺮ ﺭﺍ ﺍﺩﺍﻣـﻪ ﺩﺍﺩﻩ ﻭ ﺩﺭ ﺻـﻮﺭﺕ
ﺍﻃﻤﻴﻨﺎﻥ ﺍﺯ ﺍﺷﺘﺒﺎﻩ ﺑﻮﺩﻥ ﺁﻥ ﻳﮏ ﻣﺮﺣﻠﻪ ﺑﻪ ﻋﻘﺐ ﺑﺎﺯﮔﺸﺘﻪ ﻭ ﺩﻭﺑﺎﺭﻩ ﮐﺎﺭ ﺭﺍ ﺍﺩﺍﻣﻪ ﻣﻴﺪﻫﻴﻢ .ﺍﻳﻦ ﺭﻭﻧـﺪ ﺍﺩﺍﻣـﻪ ﻣﻴﻴﺎﺑـﺪ ﺗـﺎ ﺑـﻪ
ﺟﻮﺍﺏ ﻧﻬﺎﻳﻲ ﺑﺮﺳﻴﻢ.
ﺍﻳﻦ ﺭﻭﺵ ﻳﻚ ﺭﻭﺵ ﻏﻴﺮﻫﺪﻓﻤﻨﺪ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺩﺭ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺎﻳﺪ ﺗﻤﺎﻡ ﺣﺎﻻﺕ ﺭﺍ ﺩﺭﻧﻈﺮ ﺑﮕﻴﺮﻳﻢ ﺩﺭ ﺻﻮﺭﺗﻲﻛـﻪ ﺑﺘـﻮﺍﻧﻴﻢ
ﻳﻚ ﺳﺮﻱ ﺷﺮﻭﻁ ﺑﻨﺎ ﺑﻪ ﻣﻘﺘﻀﻴﺎﺕ ﻣﺴﺌﻠﻪ ،ﺍﺿﺎﻓﻪ ﻛﻨﻴﻢ ﺗﺎ ﮐﻞ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﭘﻴﻤـﺎﻳﺶ ﻧﺸـﻮﺩ ﻣﻴﺘـﻮﺍﻥ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﺑـﺎ ﺯﻣـﺎﻥ
ﻭﺍﻗﻌﯽ ﮐﻤﺘﺮﯼ ﺑﺪﺳﺖ ﺁﻭﺭﺩ ﻭﻟﻲ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﮐﺎﻫﺶ ﻧﻤﻴﺎﺑﺪ.
ﻣﺜﺎﻝ :ﺍﻋﺪﺍﺩ ۴ﺑﻴﺘﯽ ﺭﺍ ﭘﻴﺪﺍ ﮐﻨﻴﺪ ﮐﻪ ﺗﻌﺪﺍﺩ ﻳﮑﻬﺎﯼ ﺁﻧﻬﺎ ﺩﻗﻴﻘﺎﹰ ۲ﺗﺎ ﺑﺎﺷﺪ.
ﺑﺮﺍﯼ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﺭﺍ ﺭﺳﻢ ﻣﻴﮑﻨﻴﻢ:
1
1 0 1 0 1 0 1 0 1 0 0
=A4
د
ﺩﺭ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﻫﻨﮕﺎﻣﯽ ﮐﻪ ﻣﻄﻤﺌﻦ ﻫﺴﺘﻴﻢ ﮐﻪ ﺍﻳﻦ ﻣﺴﻴﺮ ﺑﻪ ﺟﻮﺍﺏ ﺩﺭﺳﺖ ﻣﻨﺠﺮ ﻧﺨﻮﺍﻫﺪ ﺷﺪ ﻋﻤﻞ ﻋﻘﺒﮕـﺮﺩ ﺻـﻮﺭﺕ
ﻣﻴﮕﻴﺮﺩ ﮐﻪ ﺩﺭ ﺷﮑﻞ ﺑﺎ ﻋﻼﻣﺖ ﻣﺸﺨﺺ ﺷﺪﻩ ﺍﺳﺖ .ﺗﻮﺳﻂ ﮐﺪ ﺯﻳـﺮ ﻣﻴﺘـﻮﺍﻥ ﻓﻀـﺎﯼ ﺣﺎﻟـﺖ ﺭﺳـﻢ ﺷـﺪﻩ ﺩﺭ ﺑـﺎﻻ ﺭﺍ
ﺗﺸﮑﻴﻞ ﺩﺍﺩ ﻭ ﺑﻪ ﺟﻮﺍﺏ ﺭﺳﻴﺪ:
)procedure BT(A, i, n
)f1←sum(A,n
if i>n then
if f1= 2 then write(A) endif
else
if f1>2 or 2-f1>n-i then return endif )*(
A[i] ←1
)BT(A,i+1,n
A[i] ←0
)BT(A,i+1,n
endif
end.
ﻧﮑﺘﻪ :ﻓﺮﺍﺧﻮﺍﻧﯽ ﺍﻭﻟﻴﻪ ﺭﻭﻳﻪ ﺑﺎﻻ ﺑﺎﻳﺪ ﺑﺼﻮﺭﺕ ) BT(A,1,4ﺻﻮﺭﺕ ﮔﻴﺮﺩ.
ﻧﮑﺘﻪ :ﺗﺎﺑﻊ sumﺩﺭ ﮐﺪ ﺑﺎﻻ ﺗﻌﺪﺍﺩ ﻳﮑﻬﺎﯼ ﺭﺷﺘﻪ Aﺭﺍ ﺗﺎ ﻣﺮﺣﻠﻪ ﻓﻌﻠﯽ ) i-1ﺍﻡ( ﻣﺤﺎﺳﺒﻪ ﻣﻴﮑﻨﺪ.
ﻧﮑﺘﻪ :ﺷﺮﻁ ﻣﺸﺨﺺ ﺷﺪﻩ ﺩﺭ )*( ﺑﺮﺭﺳﯽ ﻣﻴﮑﻨﺪ ﮐﻪ ﺩﺭ ﺻﻮﺭﺗﯽ ﮐﻪ ﻣﺴﻴﺮ ﻓﻌﻠﯽ ﻣﻨﺠﺮ ﺑﻪ ﺟﻮﺍﺏ ﺩﺭﺳـﺖ ﻧﺨﻮﺍﻫـﺪ ﺷـﺪ
ﻋﻤﻞ ﺑﺎﺯﮔﺸﺖ ﺑﻪ ﻋﻘﺐ ) (Backtrackﺭﺍ ﺍﻧﺠﺎﻡ ﻣﻴﺪﻫﺪ .ﺷﺮﻁ ﺍﻭﻝ ﺁﻥ ﻧﺸـﺎﻧﺪﻫﻨﺪﻩ ﺑـﻴﺶ ﺍﺯ ﺣـﺪ ﻣﺠـﺎﺯ ﺑـﻮﺩﻥ ﺗﻌـﺪﺍﺩ
ﻳﮑﻬﺎﺳﺖ ﻭ ﺷﺮﻁ ﺩﻭﻡ ﺁﻥ ﻧﺸﺎﻧﺪﻫﻨﺪﻩ ﮐﻤﺘﺮ ﺍﺯ ﺣﺪ ﻣﺠﺎﺯ ﺑﻮﺩﻥ ﺗﻌﺪﺍﺩ ﺑﻴﺘﻬﺎﯼ ﻣﺸﺨﺺ ﻧﺸﺪﻩ ﺗﺎ ﺑﺤﺎﻝ ﻣﻴﺒﺎﺷﺪ ﮐـﻪ ﻫـﺮ ﺩﻭ
ﺷﺮﻁ ﺩﻟﻴﻞ ﻏﻠﻂ ﺑﻮﺩﻥ ﻣﺴﻴﺮ ﻓﻌﻠﯽ ﻣﻴﺒﺎﺷﺪ.
ﻧﮑﺘﻪ :ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﮐﺪ ﺑﺎﻻ ) O(2nﻣﻴﺒﺎﺷﺪ.
ﻧﮑﺘﻪ :ﻫﺮﭼﻪ ﺗﻌﺪﺍﺩ ﺷﺮﻃﻬﺎﯼ ﺩﺳﺘﻮﺭ )*( ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ ﻳﻌﻨﯽ ﺩﺭ ﺩﺭﺧﺖ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﺯﻭﺩﺗﺮ ﻋﻘﺒﮕﺮﺩ ﻣﻴﮑﻨﻴﻢ ﻭ ﺍﻳﻦ ﻣﻨﺠـﺮ
ﺑﻪ ﮐﻢ ﺷﺪﻥ ﺯﻣﺎﻥ ﻭﺍﻗﻌﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺧﻮﺍﻫﺪ ﺷﺪ.
ﺣﺎﻝ ﺑﻪ ﺍﺭﺍﺋﻪ ﻣﺜﺎﻟﯽ ﺩﻳﮕﺮ ﺩﺭ ﺍﻳﻦ ﺭﺍﺑﻄﻪ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
۱ ۶
ﺕ
- -
ﺩﺭ ﺍﻳﻦ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻣﺠﻤﻮﻋﻪ ﺑﺎ n ≥ 1ﻋﻀﻮ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﻭ ﺗﺼﻤﻴﻢ ﺩﺍﺭﻳﻢ ﺗﻤﺎﻡ ﺗﺮﻛﻴﺒﺎﺕ ﻣﻤﻜﻦ ﺁﻥ ﺭﺍ ﺩﺍﺷﺘﻪ ﺑﺎﺷـﻴﻢ .ﺍﻳـﻦ
ﺭﻭﺵ ﺩﺍﺭﺍﻱ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﻲ )! (nﻣﻲﺑﺎﺷﺪ .ﺑﺮﺍﻱ ﺣﻞ ﻣﺴﺌﻠﻪ ﻣﺎ ﺍﺯ ﺭﻭﺵ Backtrackingﺍﺳﺘﻔﺎﺩﻩ ﻣﻲﻛﻨﻴﻢ.
)Procedure perm(A, k, n
if k=n then
)write(A
else
for i←k to n do
)]swap(A[k],A[i
)perm(A,k+1,n
repeat
endif
end.
٧١ (Backtracking)
ش و ر
د
ﺭﺍperm(A,1,n) ﻗـﺮﺍﺭ ﺩﺍﺩﻩ ﻭ ﺳـﭙﺲA ﺭﺍ ﺩﺭ ﺁﺭﺍﻳﻪn ﺗﺎ1 ﺍﺑﺘﺪﺍ ﺑﺎﻳﺪ ﻋﻨﺎﺻﺮperm ﺩﺭ ﻓﺮﺍﺧﻮﺍﻧﯽ ﺍﻭﻟﻴﻪ ﺭﻭﻳﻪ:ﻧﮑﺘﻪ
.ﻓﺮﺍﺧﻮﺍﻧﯽ ﮐﻨﻴﻢ
a c
b
a ? b ? c ?
a
b c a c b
ab ? ac ? ba ? bc ? cb ? ca ?
c b c a b a
abc acb bac bca cba cab
perm(A=abc,k=3,n=3)
perm(A=abc,k=2,n=3)
perm(A=acb,k=3,n=3)
perm(A=bac,k=3,n=3)
perm(A=abc,k=1,n=3) perm(A=bac,k=2,n=3)
perm(A=bca,k=3,n=3)
perm(A=cba,k=3,n=3)
perm(A=cba,k=2,n=3)
perm(A=cab,k=3,n=3)
٧٢ )(Backtracking
ش و ر
د
c
a
b
c b
c a a b
n
٦
٢
- -
ﺣﺎﻝ ﺑﻪ ﻃﺮﺡ ﻣﺴﺌﻠﻪﺍﯼ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ ﮐﻪ ﺩﺭ ﺍﺭﺍﺋﻪ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺑﺮﺍﯼ ﺁﻥ ﺍﺯ ﺭﻭﺵ ﻋﻘﺒﮕﺮﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻴﮑﻨﻴﻢ .ﺩﺭ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﻫـﺪﻑ
ﻗﺮﺍﺭ ﺩﺍﺩﻥ nﻣﻬﺮﻩ ﻭﺯﻳﺮ ﺩﺭ ﺻﻔﺤﻪ ﺷﻄﺮﻧﺞ ) (n*nﺑﻪ ﮔﻮﻧﻪﺍﯼ ﺍﺳﺖ ﮐﻪ ﻫﻴﭽﻴﮏ ﺍﺯ ﻭﺯﻳﺮﺍﻥ ﺩﻳﮕﺮﯼ ﺭﺍ ﺗﻬﺪﻳﺪ ﻧﮑﻨـﺪ .ﺩﺭ
ﻣﺴﺌﻠﻪ nﻭﺯﻳﺮ ﻓﺮﺽ ﺩﺭ ﻫﻴﭻ ﺳﻄﺮ ﻭ ﺳﺘﻮﻧﻲ ﺑﻴﺶ ﺍﺯ ﻳﻚ ﻭﺯﻳﺮ ﻗﺮﺍﺭ ﻧﮕﻴﺮﺩ .ﺣﺎﻝ ﺑﺎ ﺍﻳـﻦ ﻓـﺮﺽ ﺗﻤـﺎﻡ ﺟﺎﻳﮕﺸـﺖﻫـﺎﻱ
ﻣﻤﻜﻦ ﺭﺍ ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﻴﻢ ﻳﻌﻨﻲ ﻫﻤﺎﻥ ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ ﻳﺎ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﺭﺍ ﺑﻮﺟﻮﺩ ﻣﻲﺁﻭﺭﻳﻢ ﺳﭙﺲ ﺩﺭ ﻫﺮﻣﺮﺣﻠﻪ ﺑﺮﺭﺳﯽ
ﻣﻲﻛﻨﻴﻢ ﻛﻪ ﻣﺴﻴﺮ ﻓﻌﻠﯽ ﺩﺭ ﺩﺭﺧﺖ ﺑﺎ ﺍﻳﻦ ﻧﺤﻮﻩﺍﻱ ﭼﻴﺪﻣﺎﻥ ﻭﺯﻳﺮﻫﺎ ﺁﻳﺎ ﺩﺍﺭﺍﻱ ﺷـﺮﺍﻳﻂ ﻣﺴـﺌﻠﻪ ﻣـﻲﺑﺎﺷـﺪ ﻳﻌﻨـﻲ ﻭﺯﻳﺮﻫـﺎ
ﻳﻜﺪﻳﮕﺮ ﺭﺍ ﺗﻬﺪﻳﺪ ﻣﻲﻛﻨﻨﺪ ﻳﺎ ﺧﻴﺮ .ﺑﺮﺍﯼ ﻣﺜﺎﻝ ﺑﺮﺍﯼ n=4ﻣﺴﺌﻠﻪ ﺩﺍﺭﺍﯼ ﺩﻭ ﺟﻮﺍﺏ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﺟﻮﺍﺏ ﺍﻭﻝ:
*
*
*
*
ﮐﻪ ﺗﻮﺳﻂ ﺁﺭﺍﻳﻪ ﺯﻳﺮ ﻗﺎﺑﻞ ﻧﻤﺎﻳﺶ ﺍﺳﺖ:
٧٣ )(Backtracking
ش و ر
د
۲ ۴ ۱ ۳
ﺟﻮﺍﺏ ﺩﻭﻡ:
*
*
*
*
ﺍﮔﺮ nﺑﺮﺍﺑﺮ ٥ﺑﺎﺷﺪ ٥ﺟﻮﺍﺏ ﺑﺮﺍﯼ ﻣﺴﺌﻠﻪ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﻭ ﺑﺮﺍﯼ ۹۲ n=8ﺟﻮﺍﺏ ﻭﺟﻮﺩ ﺩﺍﺭﺩ.
ﻧﮑﺘﻪ :ﭼﻮﻥ ﺩﺭ ﻫﺮ ﻟﺤﻈﻪ ﺩﺭ ﻳﮏ ﺳﻄﺮ ﻭ ﻳﮏ ﺳﺘﻮﻥ ﻧﻤﻴﺘﻮﺍﻧﺪ ﺑﻴﺶ ﺍﺯ ﻳﮏ ﻭﺯﻳﺮ ﻗﺮﺍﺭ ﮔﻴﺮﺩ ﻟﺬﺍ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻳـﮏ ﻣـﺎﺗﺮﻳﺲ
ﻣﻮﺭﺩ ﻟﺰﻭﻡ ﻧﻴﺴﺖ ﻭ ﻓﻘﻂ ﻳﮏ ﺁﺭﺍﻳﻪ ﻳﮏ ﺑﻌﺪﯼ nﻋﻨﺼﺮﯼ ﮐﻔﺎﻳﺖ ﻣﻴﮑﻨﺪ .ﺩﺭ ﺍﻳﻦ ﺁﺭﺍﻳﻪ ﻧﻴـﺰ ﺍﮔـﺮ ﻓـﺮﺽ ﺯﻳـﺮ ﺭﺍ ﺍﻧﺠـﺎﻡ
ﺩﻫﻴﻢ:
ﺁﻧﮕﺎﻩ ﻋﻨﺎﺻﺮ ﺗﮑﺮﺍﺭﯼ ﺩﺭ ﺁﺭﺍﻳﻪ ﻧﺒﺎﻳﺪ ﻭﺟﻮ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ﻭ ﺍﺯ ﺍﻳﻦ ﺭﻭ ﻣﻴﺘـﻮﺍﻥ ﺍﺯ ﻫﻤـﺎﻥ ﺭﻭﻳـﻪ permﺑـﺮﺍﯼ ﺗﻮﻟﻴـﺪ ﻫﻤـﻪ
ﺟﺎﻳﮕﺸﺘﻬﺎ ﺩﺭ ﺁﺭﺍﻳﻪ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ ﻭ ﻓﻘﻂ ﻫﻨﮕﺎﻡ ﭼﺎﭖ ﺧﺮﻭﺟﻲ ﺷﺮﻃﻲ ﺭﺍ ﺑﺮﺍﻱ ﭼﺎﭖ ﺩﺭ ﺧﺮﻭﺟـﻲ ﻗـﺮﺍﺭ ﻣـﻲﺩﻫـﻴﻢ ﻛـﻪ
ﻫﻤﺎﻥ ﺗﺎﺑﻊ testﻣﻲﺑﺎﺷﺪ ﮐﻪ ﮐﺪ ﺩﺭ ﺯﻳﺮ ﺁﻭﺭﺩﻩ ﺷﺪﻩ ﺍﺳﺖ .ﺑﺮﺭﺳﯽ ﺍﻳﻨﮑﻪ ﺁﻳﺎ ﻭﺯﻳﺮﻫﺎﯼ ﻗﺮﺍﺭ ﮔﺮﻓﺘﻪ ﺩﺭ ﺁﺭﺍﻳـﻪ ﻫﻤـﺪﻳﮕﺮ ﺭﺍ
ﺗﻬﺪﻳﺪ ﻣﻴﮑﻨﻨﺪ ﻳﺎ ﺧﻴﺮ ﺑﻪ ﺭﺍﺣﺘﯽ ﺗﻮﺳﻂ ﺭﺍﺑﻄﻪ ﺯﻳﺮ ﻗﺎﺑﻞ ﺍﻧﺠﺎﻡ ﺍﺳﺖ .ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﯽ ﮐﻪ ﺍﮔﺮ ﻋﻨﺎﺻـﺮ ﻗـﺮﺍﺭ ﮔﺮﻓﺘـﻪ ﺩﺭ ﺁﺭﺍﻳـﻪ
ﺩﺍﺭﺍﯼ ﺍﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺎﺷﻨﺪ ﻫﻴﭽﮕﺎﻩ ﺩﻭ ﻭﺯﻳﺮ ﻳﮑﺪﻳﮕﺮ ﺭﺍ ﺗﻬﺪﻳﺪ ﻧﻤﻴﮑﻨﻨﺪ:
| ∀ i, j | i ≠ j ⇒ | A[i ] − A[ j ] | ≠| i − j
د
)function test(A,n
for i←1 to n do
for j←i+1 to n do
if | A[i] – A[j] | = | i-j | then return false endif
repeat
repeat
return true
end.
ﻁ
x
ﺍ ﺍ
٣ ٦
ﺎ ﻬ ﻧ ﺁ ﻞ ﻮ ﻓ ﻱ ﻭ ﺭ ﺯ ﺎ ﻫ ﺭ ﻮ ﻣ ﻱ ﻭ ﺭ ﺎ ﻘ ﻧ ﻦ ﻌ ﺗ
- -
ﻣﻴﺘﻮﺍﻥ ﺗﻮﺳﻂ ﺭﺍﺑﻄﻪ ﺯﻳﺮ ﺗﻌﺪﺍﺩ ﻓﻮﺍﺻﻠﯽ ﮐﻪ nﻧﻘﻄﻪ ﻣﻴﺘﻮﺍﻧﻨﺪ ﺑﺎ ﻳﮑﺪﻳﮕﺮ ﺗﻮﻟﻴﺪ ﮐﻨﻨﺪ ﺭﺍ ﺑﺪﺳﺖ ﺁﻭﺭﺩ:
)n ( n − 1 n
= D =
2 2
ﺑﺮﺍﯼ ﺟﻠﻮﮔﻴﺮﯼ ﺍﺯ ﻋﺪﻡ ﺗﻮﻟﻴﺪ ﺟﻮﺍﺑﻬﺎﯼ ﺑﺪﻳﻬﯽ ﻭ ﻣﻨﻔﯽ ﻓﺮﺽ ﻣﻴﮑﻨﻴﻢ ﮐﻪ X1=0ﻭ ﺑﻘﻴﻪ ﻧﻘﺎﻁ ﻫﻤﮕﯽ ﻣﺜﺒﺖ ﻫﺴﺘﻨﺪ.
ﺩﺭ ﻫﺮ ﻣﺮﺣﻠﻪ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ﺭﺍ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﻓﻮﺍﺻﻞ ﺍﻧﺘﺨﺎﺏ ﮐﺮﺩﻩ ،ﺍﻳﻦ ﻋﺪﺩ ﻳﺎ ﻓﺎﺻﻠﻪ ﺍﻭﻟـﻴﻦ ﻧﻘﻄـﻪ ) (x0ﺑـﺎ ﺁﺧـﺮﻳﻦ
ﻧﻘﻄﻪ ﻧﺎﻣﻌﻠﻮﻡ ﻭ ﻳﺎ ﻓﺎﺻﻠﻪ ﺁﺧﺮﻳﻦ ﻧﻘﻄﻪ ) (x6ﺑﺎ ﺍﻭﻟﻴﻦ ﻧﻘﻄﻪ ﻧﺎﻣﻌﻠﻮﻡ ﻣﻴﺒﺎﺷﺪ) .ﺩﺭ ﻫﺮ ﮔﺮﻩ ﻣﺴﻴﺮ ﺍﺯ ﺭﻳﺸﻪ ﺗﺎ ﺁﻥ ﮔﺮﻩ ﻧﺸـﺎﻥ
ﺩﻫﻨﺪﻩ ﻧﻘﺎﻁ ﻣﻌﻠﻮﻡ ﺗﺎ ﺁﻥ ﻟﺤﻈﻪ ﻣﻴﺒﺎﺷﻨﺪ (.ﺑﺎ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﺍﻳﻦ ﺩﻭ ﺣﺎﻟﺖ ﺑﻪ ﺩﻭ ﻧﻘﻄﻪ ﻣﻌﻠﻮﻡ ﺟﺪﻳـﺪ ﻣﺮﺳـﻴﻢ ﻭ ﻓﻮﺍﺻـﻞ
ﺑﻮﺟﻮﺩ ﺁﻧﺪﻩ ﺗﻮﺳﻂ ﺁﻥ ﻧﻘﺎﻁ ﺭﺍ ﺑﺎ ﻧﻘﺎﻁ ﻣﻌﻠﻮﻡ ﻗﺒﻠﯽ )ﺩﺭ ﺻﻮﺭﺕ ﻭﺟﻮﺩ( ﺍﺯ ﻣﺠﻤﻮﻋـﻪ ﻓﻮﺍﺻـﻞ ﺧـﻂ ﻣﻴـﺰﻧﻴﻢ .ﺍﮔـﺮ ﺍﻳـﻦ
ﻓﻮﺍﺻﻞ ﻣﻮﺟﻮﺩ ﻧﺒﻮﺩﻧﺪ ﺷﺎﺧﻪ ﻗﻄﻊ ﺷﺪﻩ ﻭ ﺷﺎﺧﻪ ﺩﻳﮕﺮﯼ ﺭﺍ ﺍﺩﺍﻣﻪ ﻣﻴﺪﻫﻴﻢ.
٧٥ )(Backtracking
ش و ر
د
x0 =0
ﺑﺎ ﻗﺮﺍﺭ ﺩﺍﺩﻥ x6=10ﻓﺎﺻﻠﻪ x0ﺑﺎ x6ﺑﺮﺍﺑﺮ ۱۰
ﺧﻮﺍﻫﺪ ﺷﺪ ﺑﻨﺎﺑﺮ ﺍﻳﻦ ﻋﺪﺩ ۱۰ﺭﺍ ﺍﺯ ﻣﺠﻤﻮﻋﻪ
ﺑﺎ ﻗﺮﺍﺭ ﺩﺍﺩﻥ x2=1ﻓﺎﺻﻠﻪ x0ﻭ x6ﺑﺎ x2ﺑﺮﺍﺑﺮ ۱ ﻓﻮﺍﺻﻞ ﺧﻂ ﻣﻴﺰﻧﻴﻢ
ﻭ ۹ﺧﻮﺍﻫﺪ ﺷﺪ ﺑﻨﺎﺑﺮ ﺍﻳﻦ ﺍﻋﺪﺍﺩ ۱ﻭ ۹ﺭﺍ ﺍﺯ
x 6 = 10
ﻣﺠﻤﻮﻋﻪ ﻓﻮﺍﺻﻞ ﺧﻂ ﻣﻴﺰﻧﻴﻢ
x3 = 2
x5 =8
ﺑﺎ ﻗﺮﺍﺭ ﺩﺍﺩﻥ x5=1ﻓﺎﺻﻠﻪ x0ﻭ x6ﻭ x2ﺑﺎ x5
ﺑﺮﺍﺑﺮ ۸ﻭ ۲ﻭ ۷ﺧﻮﺍﻫﺪ ﺷﺪ ﺑﻨﺎﺑﺮ ﺍﻳﻦ ﺍﻋﺪﺍﺩ ۸ﻭ
۲ﻭ ۷ﺭﺍ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﻓﻮﺍﺻﻞ ﺧﻂ ﻣﻴﺰﻧﻴﻢ
ﺟﻮﺍﺏ ﺍﻭﻝ:
x1 x2 x3 x4 x5 x6
٠ ١ ٣ ٦ ٨ ١٠
ﺗﻮﺿﻴﺢ :ﻧﻮﺩ ﺍﻭﻝ ﺭﺍ ﻓﺮﺽ ﻣﻲﻛﻨﻴﻢ ﺻﻔﺮ ﺍﺳﺖ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻓﺎﺻﻠﻪ ،ﻓﺎﺻﻠﻪ ﻧـﻮﺩ ﺍﻭﻝ ﻭ ﺁﺧـﺮ ﻣـﻲﺑﺎﺷـﺪ .ﺍﻳـﻦ ﻓﺎﺻـﻠﻪ ﺭﺍ ﺍﺯ
ﻣﺠﻤﻮﻉ ﻓﻮﺍﺻﻞ ﺣﺬﻑ ﻛﺮﺩﻩ ﻭ ﺩﻭﺑﺎﺭﻩ ﺍﺯ ﻣﺠﻤﻮﻉ ﻓﻮﺍﺻﻞ ﺑﺎﻗﻲﻣﺎﻧﺪﻩ ﻣﺎﻛﺰﻳﻤﻢ ﻓﺎﺻﻠﻪ ﺭﺍ ﭘﻴﺪﺍ ﻣﻲﻛﻨﻴﻢ ﻛﻪ ٢ﺣﺎﻟـﺖ ﭘـﻴﺶ
ﻣﻲﺁﻳﺪ:
-۱ﻓﺎﺻﻠﻪ ﺭﺃﺱ ﺍﻭﻝ ﺗﺎ ﻧﻮﺩ n-1ﺍﻡ ﺑﺮﺍﺑﺮ ﺍﻳﻦ ﻓﺎﺻﻠﻪ ﻣﻲﺑﺎﺷﺪ.
٧٦ )(Backtracking
ش و ر
د
ﻧ
ﻳ ﺤ ﺗ ﻭ ﺏ ﺎ ﻌ ﺸ ﺍ ﺵ ﻭ ﺭ -
ﺭﻭﺵ ﺩﻳﮕﺮﯼ ﮐﻪ ﺩﺭ ﺍﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺁﻥ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ ﺑﻪ ﻧﺎﻡ ﺭﻭﺵ ﺍﻧﺸﻌﺎﺏ ﻭ ﺗﺤﺪﻳﺪ ﻳﺎ ﺷﺎﺧﻪ ﻭ ﺣﺪ ﻣﻌـﺮﻭﻑ ﺍﺳـﺖ .ﺍﻳـﻦ
ﺭﻭﺵ ﻳﻚ ﺭﻭﺵ ﻏﻴﺮﻫﺪﻓﻤﻨﺪ ﻭﻟﻲ ﻫﻮﺷﻤﻨﺪ ﺍﺳﺖ .ﺩﺭ ﺍﻳﻦ ﺭﻭﺵ ﺑـﺮﺧﻼﻑ ﺭﻭﺵ ﻋﻘﺒﮕـﺮﺩ ﺗﻤـﺎﻣﻲ ﺣـﺎﻻﺕ ﺩﺭ ﻓﻀـﺎﯼ
ﺣﺎﻟﺖ ﺑﺮﺭﺳﯽ ﻧﻤﻲﺷﻮﺩ ﻭ ﺑﺮﺍﺳﺎﺱ ﺷﺮﻃﻲ ﻛﻪ ﺩﺭ ﻣﺴﺌﻠﻪ ﻗﺮﺍﺭ ﺩﺍﺩﻩ ﻣﻲﺷﻮﺩ )ﺍﻳﻦ ﺷﺮﻭﻁ ﻭﺍﺑﺴﺘﻪ ﺑﻪ ﻧﻮﻉ ﻣﺴـﺌﻠﻪ ﻣﺘﻔـﺎﻭﺕ
ﺍﺳﺖ( ﺑﺮﺧﻲ ﺍﺯ ﺣﺎﻟﺖﻫﺎ ﺑﺮﺭﺳﻲ ﻧﻤﻲﺷﻮﻧﺪ.
ﺳﻪ ﺗﻔﺎﻭﺕ ﻋﻤﺪﻩ ﺑﻴﻦ ﺭﻭﺵ ﻏﻘﺒﮕﺮﺩ ﻭ ﺭﻭﺵ ﺷﺎﺧﻪ ﻭ ﺣﺪ ﻭﺟﻮﺩ ﺩﺍﺭﺩ:
-۱ﺩﺭ ﺭﻭﺵ ﻋﻘﺒﮕﺮﺩ ﺩﺭﺧﺖ ﻓﻀﺎﯼ ﺣﺎﻟﺖ ﺑﺼﻮﺭﺕ ﻋﻤﻖ ﺍﻭﻝ ) (DFSﺟﺴﺘﺠﻮ ﻣﻴﺸﻮﺩ ﻭﻟﯽ ﺩﺭ ﺭﻭﺵ ﺷﺎﺧﻪ ﻭ
ﺣﺪ ﺍﺑﺘﺪﺍ ﮐﻠﻴﻪ ﻓﺮﺯﻧﺪﺍﻥ ﮔﺮﻩ ﻓﻌﻠﯽ ﺳﺎﺧﺘﻪ ﻣﻴﺸﻮﺩ ﻭ ﺳﭙﺲ ﺍﺯ ﺑﻴﻦ ﺁﻧﻬﺎ ﻳﮑﯽ ﺑﺴﺘﻪ ﺑﻪ ﺷﺮﺍﻳﻂ ﺍﻧﺘﺨﺎﺏ ﻣﻴﺸﻮﺩ ﻭﺗﺎ
ﺣﺪﻭﺩﯼ ﻣﻴﺘﻮﺍﻥ ﺁﻥ ﺭﺍ ﻣﻨﻄﺒﻖ ﺑﺎ ﺟﺴﺘﺠﻮﯼ ﺭﺩﻳﻔﯽ ) (BFSﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺖ.
-۲ﺩﺭ ﺭﻭﺵ ﺷﺎﺧﻪ ﻭ ﺣﺪ ﻳﮏ ﺗﺎﺑﻊ ﻣﺤﺪﻭﺩ ﮐﻨﻨﺪﻩ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺍﺯ ﮔﺴﺘﺮﺵ ﺑﻴﺶ ﺍﺯ ﺣﺪ ﻭ ﻧﺎﺑﺠﺎﯼ ﺷﺎﺧﻪ ﻫـﺎﯼ
ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ ﺟﻠﻮﮔﻴﺮﯼ ﻣﻴﮑﻨﺪ ﻭ ﺩﺭ ﻣﻮﻗﻊ ﻟﺰﻭﻡ ﺷﺎﺧﻪ ﻫﺎ ﺭﺍ ﻗﻄﻊ ﮐـﺮﺩﻩ ﻭ ﻣﺴـﻴﺮ ﻓﻌﻠـﯽ ﺭﺍ ﺍﺩﺍﻣـﻪ ﻧﻤـﯽ
ﺩﻫﺪ .ﺩﺭﺣﺎﻟﻴﮑﻪ ﺩﺭ ﺭﻭﺵ ﻋﻘﺒﮕﺮﺩ ﭼﻨﻴﻦ ﻣﻌﻴﺎﺭﯼ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ.
-۳ﺭﻭﺵ ﺷﺎﺥ ﻭ ﺣﺪ ﺩﺭ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﺭﻭﺵ ﻋﻘﺒﮕﺮﺩ ﻫﻮﺷﻤﻨﺪﺍﻧﻪ ﺗﺮ ﻋﻤﻞ ﻣﻴﮑﻨﺪ ﻭ ﺩﺭ ﻫﻨﮕﺎﻡ ﺍﻧﺘﺨﺎﺏ ﺷﺎﺧﻪ ﺟﻬـﺖ
ﮔﺴﺘﺮﺵ ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ ،ﺷﺎﺧﻪﺍﯼ ﮐﻪ ﺍﺣﺘﻤﺎﻝ ﺑﻴﺸﺘﺮﯼ ﺑﺮﺍﯼ ﺗﻮﻟﻴﺪ ﺟﻮﺍﺏ ﺩﺍﺭﺩ ﺍﻧﺘﺨﺎﺏ ﻣﻲﺷﻮﺩ.
ﺣﺎﻝ ﺑﻪ ﺍﺭﺍﺋﻪ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﻳﻲ ﻣﺒﺘﻨﯽ ﺑﺮ ﺍﻳﻦ ﺭﻭﺵ ﻣﻲﭘﺮﺩﺍﺯﻳﻢ.
١ ٧
ﺩ ﺮ ﻩ ﺭ ﻭ ﺩ ﻩ ﺷ ﻭ ﺮ ﻓ
- -
ﺩﺭ ﺍﻳﻦ ﺑﺨﺶ ﺑﻪ ﺍﺭﺍﺋﻪ ﺭﻭﺷﯽ ﻣﺒﻨﺘﯽ ﺑﺮ ﺷﺎﺧﻪ ﻭ ﺣﺪ ﺑﺮﺍﯼ ﻣﺴﺌﻠﻪ ﻓﺮﻭﺷﻨﺪﻩ ﺩﻭﺭﻩ ﮔﺮﺩ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ.
3
3
a b
7 4
4
8
6
e c
2 6 5
d
ﻭﺍﺿﺢ ﺍﺳﺖ ﮐﻪ ﻣﻘﺪﺍﺭ ﺗﺎﺑﻊ ﺑﺎﻻ ﺩﺭ ﮔﺮﺍﻑ ،Gﺣﺪ ﭘﺎﻳﻴﻨﯽ ﺑﺮﺍﯼ ﻫﺰﻳﻨﻪ ﺩﻭﺭﻫﺎﯼ ﻫﺎﻣﻴﻠﺘﻮﻧﯽ ﺧﻮﺍﻫﺪ ﺑـﻮﺩ ﭼـﻮﻥ ﺑـﺮﺍﯼ ﻫـﺮ
ﺭﺍﺱ ﺩﻭ ﻳﺎﻝ ﺑﺎ ﮐﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﮐﻪ ﻣﺠﺎﻭﺭ ﺑﻪ ﺁﻥ ﺭﺍﺱ ﻫﺴﺘﻨﺪ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﮐﺮﺩﻩ ﺍﺳﺖ .ﻟﺬﺍ ﺩﺭ ﮔﺴﺘﺮﺵ ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ
ﻫﺮ ﺩﻭﺭﯼ ﮐﻪ ﻫﺰﻳﻨﻪ ﺁﻥ ﺑﻪ ﻣﻘﺪﺍﺭ ﺗﺎﺑﻊ ﺑﺎﻻ ﻧﺰﺩﻳﮑﺘﺮ ﺑﻮﺩ ﺯﻭﺩﺗﺮ ﺟﻬﺖ ﮔﺴﺘﺮﺵ ﺍﻧﺘﺨﺎﺏ ﻣﻴﺸﻮﺩ.
٧٩ )(Branch & Bound
و ب ا ش و ر
ﺩﺭﺧﺖ ﻓﻀﺎﯼ ﺣﺎﻻﺕ ﺑﺮﺍﯼ ﮔﺮﺍﻓﯽ ﺑﺎ ٥ﺭﺃﺱ ﺩﺭ ﺣﺎﻟﺖ ﻛﻠﻲ ﺑﻪ ﺷﻜﻞ ﺯﻳﺮ ﻣﻲﺑﺎﺷﺪ:
ab
ab
adbce
adcbe
ﺗﻮﺿﻴﺢ:
ﺩﺭﻳﻚ ﮔﺮﺍﻑ ﺑﺮﺍﻱ ﻫﺮ ﺭﺃﺱ ٢ﻳﺎﻝ ﺑﺎ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻲﻛﻨﻴﻢ ﻣﺠﻤﻮﻉ ﻫﺰﻳﻨﻪﻫﺎ ﺭﺍ ﻣﺤﺎﺳﺒﻪ ﻛﺮﺩﻩ ﺳـﭙﺲ ﺑـﺮﺩﻭ
ﺗﻘﺴﻴﻢ ﻣﻲﻛﻨﻴﻢ ﺗﺎ ﻛﻤﺘﺮﻳﻦ ﻫﺰﻳﻨﻪﺍﻱ ﻛﻪ ﻣﻤﻜﻦ ﺍﺳﺖ ﺑﺪﺳﺖ ﺁﻳﺪ.
ﺍﻭﻟــﻴﻦ ﺩﻭﻣﻴﻦ ﺭﺍﺱ
ﻣﻴﻨﻴﻤﻢ ﻣﻴﻨﻴﻤﻢ
3 2 a
3 3 b
4 4 c
5 2 d
6 3 e
35 / 2 = 17 / 5
٨٠ )(Branch & Bound
و ب ا ش و ر
ﻧﻜﺘﻪ :ﺍﻟﮕﻮﺭﻳﺘﻢﻫﺎﻱ Branch & Boundﺍﺯ ﻟﺤﺎﻅ ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺗﻔﺎﻭﺗﻲ ﺑﺎ ﺍﻟﮕﻮﺭﻳﺘﻢﻫﺎﻱ Backtrakingﻧﺪﺍﺭﻧﺪ ﻭﻟﯽ
ﺍﺯ ﺯﻣﺎﻥ ﻭﺍﻗﻌﯽ ﮐﻤﺘﺮﯼ ﺑﺮﺧﻮﺭﺩﺍﺭﻧﺪ.
ﻧﮑﺘﻪ :ﺩﺭ ﺩﺭﺧﺖ ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺎﻻ ﻓﻘﻂ ۴ﺩﻭﺭ ﻣﺨﺘﻠﻒ ﻣﺤﺎﺳﺒﻪ ﺷﺪﻧﺪ ﺩﺭﺣﺎﻟﯽ ﮐﻪ ﺩﺭ ﺭﻭﺵ ﻋﻘﺒﮕـﺮﺩ ﺑﺎﻳـﺪ ﺗﻤـﺎﻡ ۱۲ﺩﻭﺭ
ﻣﺨﺘﻠﻒ ﺭﺍ ﺗﻮﻟﻴﺪ ﻣﻴﮑﺮﺩﻳﻢ.
ﻪ ﻪ
٢ ٧
ﻮ ﺠ ﻣ ﻚ ﻳ ﻱ ﺎ ﻫ ﻮ ﺠ ﻣ ﺮ ﻳ ﺯ ﻊ ﺟ
- -
ﻤ ﻤ ﻤ
ﻋ ﻋ
ﺣﺎﻝ ﺑﻪ ﺑﻴﺎﻥ ﻣﺴﺌﻠﻪ ﺩﻳﮕﺮﯼ ﮐﻪ ﺗﻮﺳﻂ ﺭﻭﺵ ﺷﺎﺧﻪ ﻭ ﺣﺪ ﻣﻴﺘﻮﺍﻥ ﺑﺮﺍﯼ ﺁﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺟﺎﻟﺒﯽ ﺍﺭﺍﺋﻪ ﮐﺮﺩ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ .ﺩﺭ ﺍﻳـﻦ
ﻣﺴﺌﻠﻪ ﻫﺪﻑ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺯﻳﺮ ﻣﺠﻤﻮﻋﻪﺍﯼ ﺍﺯ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻣﻔﺮﻭﺽ ﺍﺳﺖ ﮐﻪ ﻣﺠﻤﻮﻉ ﻫﻌﻀﺎﯼ ﺁﻥ ﻣﻘﺪﺍﺭ ﻣﺸﺨﺼﯽ ﺑﺎﺷﺪ.
ﻭﺭﻭﺩﯼ:
ﻣﺠﻤﻮﻋﻪ }S={s1, s2, ..., sn
ﻋﺪﺩ ﻣﻔﺮﻭﺽ M
ﺧﺮﻭﺟﻲ:
}X={x1, x2, ..., xn
) 1 (1≤ i ≤ nﻳﺎ xi = 0
n
∑ x .s
i =1
i i =M
k −1
∑ x .s
i =1
i i + sk ≤ M ) -۱ﺑﻪ ﺩﻟﻴﻞ ﺻﻌﻮﺩﯼ ﺑﻮﺩﻥ ﻋﻨﺎﺻﺮ (S
k −1 n
ﺗﻮﺿﻴﺢ:
ﺷﺮﻁ :۱ﺑﻴﺎﻥ ﻛﻨﻨﺪﻩ ﺍﻳﻦ ﻣﻄﻠﺐ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺍﮔﺮ ﻣﺠﻤﻮﻉ ﻭﺯﻥ ﻋﻨﺎﺻﺮﯼ ﻛﻪ ﺗﺎﻛﻨﻮﻥ ﺍﻧﺘﺨﺎﺏ ﺷـﺪﻩﺍﻧـﺪ ﺑـﻪ ﺍﺿـﺎﻓﻪﺍﻱ ﻭﺯﻥ
ﻋﻨﺼﺮ ﺑﻌﺪﻱ ،ﺍﺯ Mﺑﻴﺸﺘﺮ ﺷﻮﺩ ﭼﻮﻥ ﻋﻨﺎﺻﺮ ﺻﻌﻮﺩﻱ ﻫﺴﺘﻨﺪ ﻭﺯﻥ ﻋﻨﺎﺻﺮ ﺑﻌﺪﻱ ﺍﺯ ﻋﻨﺼﺮ kﺑﻴﺸـﺘﺮ ﺍﺳـﺖ ﭘـﺲ ﺍﺩﺍﻣـﻪ
ﻧﻤﻲﺩﻫﻴﻢ.
ﺷﺮﻁ :۲ﺑﻴﺎﻥ ﻛﻨﻨﺪﻩ ﺍﻳﻦ ﻣﻄﻠﺐ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺍﮔﺮ ﻣﺠﻤﻮﻉ ﻭﺯﻥ ﻋﻨﺎﺻﺮﻱ ﻛﻪ ﺗﺎﻛﻨﻮﻥ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩﺍﻧﺪ ﺑﻪ ﺍﺿﺎﻓﻪﺍﻱ ﻭﺯﻥ ﻛﻞ
ﻋﻨﺎﺻﺮ ﺑﺎﻗﻲ ﻣﺎﻧﺪﻩ ﻛﻤﺘﺮ ﺍﺯ ﻣﻘﺪﺍﺭ Mﺑﺎﺷﺪ ﺍﮔﺮ ﺗﻤﺎﻡ ﻋﻨﺎﺻﺮ ﺍﻧﺘﺨﺎﺏ ﻛﻨﻴﻢ ﺑﻪ ﻣﻘﺪﺍﺭ Mﻧﻤﻲﺭﺳﻴﻢ ﭘﺲ ﺍﺩﺍﻣﻪ ﻧﻤﻲﺩﻫﻴﻢ.
ﻣﺜﺎﻝ:
}S = {7,10,12,13,15,18
M=30
n=6
:Sﻣﺠﻤﻮﻉ ﻭﺯﻥ ﻋﻨﺎﺻﺮ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻩ ﺗﺎ ﺑﻪ ﺣﺎﻝ
:Kﻋﻨﺼﺮﯼ ﮐﻪ ﺭﻭﯼ ﺁﻥ ﺩﺭ ﺣﺎﻝ ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ ﻫﺴﺘﻴﻢ
:rﻣﺠﻤﻮﻉ ﻫﺰﻳﻨﻪﻫﺎﻱ ﺍﺯ ﺭﺃﺱ kﺑﻪ ﺑﻌﺪ
٨٣ )(Branch & Bound
و ب ا ش و ر
x3=1 0
ﻧﮑﺘﻪ :ﻋﺪﺩ ﻳﮏ ﺩﺭ ﺷﺎﺧﻪ ﻫﺎ ﻧﺸﺎﻥﺩﻫﻨﺪﻩ ﺍﻧﺘﺨﺎﺏ ﺷﺪﻥ ﻋﻨﺼﺮ ﻭ ﻋﺪﺩ ﺻﻔﺮ ﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﺍﻧﺘﺨﺎﺏ ﻧﺸﺪﻥ ﻋﻨﺼﺮ ﻣﻴﺒﺎﺷﺪ.
ﻧﮑﺘﻪ :ﻣﺮﺗﺒﻪ ﺯﻣﺎﻧﯽ ﺍﻟﮕﻮﺭﻳﺘﻢ ) O(2nﻣﻴﺒﺎﺷﺪ!.
۸
ﺪ
ﺕ
ﻣ ﯽ
ﺎ ﺒ ﺳ ﺎ ﺤ ﮔ ﻴ ﭽ ﻴ ﭘ -
ﺩﺭ ﺍﻳﻦ ﺑﺨﺶ ﺑﻪ ﺩﺳﺘﻪ ﺑﻨﺪﯼ ﻣﺴﺎﺋﻞ ﺍﺯ ﻟﺤﺎﻅ ﺳﺎﺩﮔﯽ ﻭ ﺳﺨﺘﯽ ﻣﻴﭙﺮﺩﺍﺯﻳﻢ .ﺍﺑﺘﺪﺍ ﭼﻨﺪ ﺗﻌﺮﻳﻒ ﺍﺭﺍﺋﻪ ﻣﻴﺪﻫﻴﻢ:
ﻣﺴﺎﺋﻞ ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ :ﻣﺴﺎﺋﻠﯽ ﮐﻪ ﺧﺮﻭﺟﯽ ﺁﻧﻬﺎ ﺩﺍﺭﺍﯼ ﺩﻭ ﺣﺎﻟﺖ ﺑﺎﺷﺪ.
ﻣﺜﺎﻝ :ﮔﺮﺍﻑ ﻭﺯﻥ ﺩﺍﺭﯼ ﻣﻔﺮﻭﺽ ﺍﺳﺖ .ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﺁﻳﺎ ﻫﺰﻳﻨﻪ ﺩﻭﺭ ﻫﺎﻣﻴﻠﺘﻮﻧﯽ ﻣﻴﻨﻴﻤﻢ ﺍﻳﻦ ﮔـﺮﺍﻑ ﺍﺯ ﻣﻘـﺪﺍﺭ kﮐﻤﺘـﺮ
ﺍﺳﺖ ﻳﺎ ﺧﻴﺮ ﻳﮏ ﻣﺴﺌﻠﻪ ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ ﻣﺤﺴﻮﺏ ﻣﻴﺸﻮﺩ.
ﻛﻼﺱ :Pﻣﺠﻤﻮﻋﻪ ﻣﺴﺎﺋﻞ ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ ﻛﻪ ﺑﺮﺍﻱ ﺁﻧﻬﺎ ﻳﻚ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻗﻄﻌﻲ ﺑﺎ ﺯﻣﺎﻥ ﭼﻨﺪ ﺟﻤﻠﻪﺍﻱ ﻭﺟﻮﺩ ﺩﺍﺭﺩ.
ﻛﻼﺱ :NPﻣﺠﻤﻮﻋﻪ ﻣﺴﺎﺋﻞ ﺗﺼﻤﻴﻢ ﮔﻴﺮﯼ ﻛﻪ ﺑﺮﺍﻱ ﺁﻧﻬﺎ ﻳﻚ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻏﻴﺮﻗﻄﻌﻲ ﺑﺎ ﺯﻣﺎﻥ ﭼﻨﺪ ﺟﻤﻠﻪﺍﻱ ﻭﺟﻮﺩ ﺩﺍﺭﺩ.
ﻣﺜﺎﻝ:
ﺗﺸﺨﻴﺺ ﻣﺮﺗﺐ ﺑﻮﺩﻥ ﻳﮏ ﺁﺭﺍﻳﻪ
ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﻳﮏ ﺭﺷﺘﻪ ﻣﻔﺮﻭﺽ ﺷﺎﻣﻞ ﺯﻳﺮ ﺭﺷﺘﻪ ﺧﺎﺻﯽ ﻫﺴﺖ ﻳﺎ ﺧﻴﺮ
ﺗﺸﺨﻴﺺ ﻫﻤﺒﻨﺪ ﺑﻮﺩﻥ ﻳﮏ ﮔﺮﺍﻑ
ﻫﻤﮕﯽ ﺟﺰﻭ ﮐﻼﺱ Pﻫﺴﺘﻨﺪ.
ﻣﺜﺎﻝ:
ﺗﺸﺨﻴﺺ ﻣﺮﺗﺐ ﺑﻮﺩﻥ ﻳﮏ ﺁﺭﺍﻳﻪ
ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﻳﮏ ﺭﺷﺘﻪ ﻣﻔﺮﻭﺽ ﺷﺎﻣﻞ ﺯﻳﺮ ﺭﺷﺘﻪ ﺧﺎﺻﯽ ﻫﺴﺖ ﻳﺎ ﺧﻴﺮ
ﺗﺸﺨﻴﺺ ﻫﻤﺒﻨﺪ ﺑﻮﺩﻥ ﻳﮏ ﮔﺮﺍﻑ
ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﺁﻳﺎ ﺑﻴﺸﺘﺮﻳﻦ ﺳﻮﺩ ﺣﺎﺻﻞ ﺩﺭ ﻣﺴﺌﻠﻪ ﮐﻮﻟﻪ ﭘﺸﺘﯽ ﺻﻔﺮ ﻭ ﻳﮏ ﺍﺯ ﻣﻘﺪﺍﺭ ﺧﺎﺻﯽ ﺑﻴﺸﺘﺮ ﺍﺳﺖ
ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻣﻔﺮﻭﺽ ﺭﺍ ﻣﻴﺘﻮﺍﻥ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺑﻪ ﮔﻮﻧﻪ ﺍﯼ ﺍﻓﺮﺍﺯ ﮐﺮﺩ ﮐﻪ ﻣﺠﻤـﻮﻉ ﺩﻭ ﻗﺴـﻤﺖ ﻣﺴـﺎﻭﯼ
ﺑﺎﺷﺪ)ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺑﻪ ﻧﺎﻡ PARTITIONﺷﻨﺎﺧﺘﻪ ﻣﻴﺸﻮﺩ(.
ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﻣﻴﺘﻮﺍﻥ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻣﻔﺮﻭﺽ ﻳﮏ ﺯﻳﺮ ﻣﺠﻤﻮﻋﻪ ﭘﻴﺪﺍ ﮐﺮﺩ ﮐﻪ ﻣﺠﻤﻮﻉ ﻋﻨﺎﺻﺮ ﺁﻥ ﺑﺮﺍﺑﺮ ﺑـﺎ ﻋـﺪﺩ ﺩﺍﺩﻩ
ﺷﺪﻩ Mﺑﺎﺷﺪ)ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﺑﻪ ﻧﺎﻡ Sum of Subsetﺷﻨﺎﺧﺘﻪ ﻣﻴﺸﻮﺩ(.
ﻫﻤﮕﯽ ﺟﺰﻭ ﮐﻼﺱ NPﻫﺴﺘﻨﺪ.
ﻧﮑﺘﻪ :ﻫﺮ ﻣﺴﺌﻠﻪ Pﻣﺘﻌﻠﻖ ﺑﻪ NPﻧﻴﺰ ﻣﻴﺒﺎﺷﺪ ﺑﻪ ﺑﻴﺎﻥ ﺩﻳﮕﺮ ﻫﻤﻴﺸﻪ .P⊆NPﭼﻮﻥ ﺍﮔﺮ ﺑﺮﺍﯼ ﻣﺴﺌﻠﻪ ﺍﯼ ﺍﻟﮕﻮﺭﻳﺘﻢ ﻗﻄﻌـﯽ
ﭼﻨﺪ ﺟﻤﻠﻪ ﺍﯼ ﻭﺟﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ﻣﻴﺘﻮﺍﻥ ﻫﻤﺎﻥ ﺍﻟﮕﻮﺭﻳﺘﻢ ﺭﺍ ﻋﻴﺮ ﻗﻄﻌﯽ ﻫﻢ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺖ.
٨٥
ت
ﻣﺜﺎﻝ:
Sorting ∝p Convex Hull
PARTITION ∝p Sum of Subset
ﻣﺮﺗﺐ ﮐﺮﺩﻥ nﻋﺪﺩ ﺗﻮﺳﻂ ﺍﻟﮕﻮﺭﻳﺘﻢ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ :ﺍﻋﺪﺍﺩ ﻭﺭﻭﺩﯼ ﺭﺍ ﻣﺨﺘﺼﻪ xﺑﺮﺍﯼ nﻧﻘﻄﻪ ﺩﺭ ﻧﻈﺮ ﻣﻴﮕﻴﺮﻳﻢ ﻭ ﺑـﻪ
ﻋﻨﻮﺍﻥ ﻣﺨﺘﺼﻪ yﻣﻘﺪﺍﺭ x2ﺭﺍ ﺩﺭ ﻧﻈﺮ ﻣﻴﮕﻴﺮﻳﻢ .ﺣﺎﻝ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ nﻧﻘﻄﻪ ﺭﺍ ﻣﻴﺴﺎﺯﻳﻢ .ﻗﺎﺑﻞ ﺍﺛﺒﺎﺕ ﺍﺳﺖ ﮐﻪ ﺗﺮﺗﻴﺐ x
ﻧﻘﺎﻁ ﺭﻭﯼ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﻣﺮﺗﺐ ﺷﺪﻩ ﺍﻋﺪﺍﺩ ﺍﻭﻟﻴﻪ ﻫﺴﺘﻨﺪ.
ﻣﺜﺎﻝ:
ﻧﮑﺘﻪ :ﺍﺯ ﻗﺎﺑﻞ ﺗﺒﺪﻳﻞ ﺑﻮﺩﻥ ﻣﺴﺌﻠﻪ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﺑﻪ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﻣﻴﺘﻮﺍﻥ ﺍﺛﺒﺎﺕ ﮐﺮﺩ ﮐﻪ ﺑﻬﺘـﺮﻳﻦ ﺍﻟﮕـﻮﺭﻳﺘﻢ ﺑـﺮﺍﯼ ﺗﻮﻟﻴـﺪ
ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﺩﺍﺭﺍﯼ ﺯﻣﺎﻥ ) O(n. log nﻣﻴﺒﺎﺷﺪ! .ﭼﻮﻥ ﺍﮔﺮ ﺑﺘﻮﺍﻥ ﭘﻮﺳﺘﻪ ﻣﺤﺪﺏ ﺭﺍ ﺩﺭ ﺯﻣﺎﻥ ﮐﻤﺘﺮ ﺍﺯ )O(n. log n
ﺗﻮﻟﻴﺪ ﮐﺮﺩ ﭘﺲ ﻣﺮﺗﺐ ﺳﺎﺯﯼ ﻫﻢ ﺩﺭ ﮐﻤﺘﺮ ﺍﺯ ) O(n. log nﺍﻣﮑﺎﻥ ﭘﺬﻳﺮ ﺍﺳﺖ ﮐﻪ ﺍﻳﻦ ﻏﻴﺮ ﻣﻤﮑﻦ ﺍﺳـﺖ ﭼـﻮﻥ ﻣﺮﺗـﺐ
ﺳﺎﺯﯼ nﻋﺪﺩ ﺗﻮﺳﻂ ﺍﻟﮕﻮﺭﻳﺘﻤﻬﺎﯼ ﻣﻘﺎﻳﺴﻪ ﺍﯼ ﺩﺭ ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ ) Ω(n. log nﺍﺳﺖ.
ﻣﺴﺌﻠﻪ :NP-Complete
A ∈ NP
A ∈ NPC
∃B ∈ NPC | B α A
ﻣﺜﺎﻝ:
ﻣﺴﺌﻠﻪ ﻛﻮﻟﻪ ﭘﺸﺘﻲ ٠/١
ﻣﺴﺌﻠﻪ ﻓﺮﻭﺷﻨﺪﻩ ﺩﻭﺭﻩﮔﺮﺩ
ﻣﺴﺌﻠﻪ PARTITION
ﻣﺴﺌﻠﻪ ﻭﺟﻮﺩ ﻭﻳﺎ ﻋﺪﻡ ﻭﺟﻮﺩ ﺩﻭﺭ ﻫﺎﻣﻴﻠﺘﻮﻧﯽ ﺩﺭ ﮔﺮﺍﻑ
ﻣﺴﺌﻠﻪ Sum of Subset
ﻣﺴﺌﻠﻪ ﺭﻧﮓ ﺁﻣﻴﺰﯼ ﮔﺮﺍﻑ
ﻣﺴﺌﻠﻪ ﺗﺎ ﮐﺮﺩﻥ ﺧﻂ ﮐﺶ )(Ruler Folding
٨٦
ت
ﻂ ﻪ
١
٨
ﻥ
- -
ﻳﻚ ﭘﺎﺭﻩﺧﻂ ﺑﺎ ﺗﻌﺪﺍﺩﻱ ﻣﻔﺼﻞ ﺑﺮ ﺭﻭﻱ ﺁﻥ ﺩﺍﺭﻳﻢ ﻛﻪ ﻫﺮ ﭘﺎﺭﻩ ﺧﻂ ﻣﻴﺘﻮﺍﻧﺪ ﺣﻮﻝ ﻣﻔﺎﺻﻞ ﺩﻭ ﻃـﺮﻓﺶ ﭼـﺮﺧﺶ ﺗـﺎ ٣٦٠
ﺩﺭﺟﻪ ﺭﺍ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ .ﻫﺪﻑ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻃﻮﻝ ﺣﺎﺻﻞ ﺍﺯ ﺗﺎ ﮐﺮﺩﻥ ﺍﻳﻦ ﭘﺎﺭﻩ ﺧﻄﻬﺎ ﺑﺮ ﺭﻭﯼ ﺧﻂ ﺍﻓﻘﯽ ﺍﺳﺖ.
٧ ٣ ١ ٩ ﻣﺜﺎﻝ:
٢٠
٧
٣ ١T
١ ٩
٧ ٣
١٠
٩ ١
)(PARTITION
ﺍ ﺍ ﻪ
٢
٨
- -
ﻠ ﺌ
ﺩﺭ ﺍﻳﻦ ﻣﺴﺌﻠﻪ ﻣﺠﻤﻮﻋﻪﺍﻱ ﺍﺯ ﺍﻋﺪﺍﺩ ﺩﺍﺩﻩ ﺷﺪﻩ ﺍﺳﺖ ﻭ ﻫﺪﻑ ﺍﻓﺮﺍﺯ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺑﻪ ﮔﻮﻧﻪ ﺍﯼ ﺍﺳﺖ ﮐﻪ ﻣﺠﻤـﻮﻉ
ﻋﻨﺎﺻﺮ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﻣﺴﺎﻭﯼ ﺑﺎﺷﺪ.
ﻣﺜﺎﻝ :ﺑﺎ ﻭﺭﻭﺩﻱ ﻣﺠﻤﻮﻋﻪ ﺯﻳﺮ ﻣﺴﺌﻠﻪ ﭘﺎﺭﺗﻴﺸﻦ ﺑﻪ ﻧﺤﻮﻩﺍﻱ ﻛﻪ ﺩﺍﺭﺍﻱ ﻃﻮﻝﻫﺎﻱ ﻳﻜﺴﺎﻧﻲ ﺑﺎﺷﻨﺪ).ﻫﺰﻳﻨﻪﻫﺎﻱ ﻳﻜﺴﺎﻥ(
}{1,3, 7,9
ت
ﻣﺜﺎﻝ :ﺛﺎﺑﺖ ﮐﻨﻴﺪ ﻣﺴﺌﻠﻪ ﺍﻓﺮﺍﺯ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻗﺎﺑﻞ ﺗﺒﺪﻳﻞ ﺑﻪ ﻣﺴﺌﻠﻪ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﻣﺴﻴﺮﯼ ﺑﻪ ﻃﻮﻝ kﺩﺭ ﮔـﺮﺍﻑ ﺍﺳـﺖ .ﺑـﺮﺍﯼ
ﺍﻳﻦ ﮐﺎﺭ ﮔﺮﺍﻓﯽ ﻣﻴﺴﺎﺯﻳﻢ ﮐﻪ ﺩﺍﺭﺍﯼ n+1ﺭﺍﺱ ﺍﺳﺖ .ﺑﻴﻦ ﺭﺍﺱ i-1ﺍﻡ ﻭ iﺍﻡ ﺩﻭ ﻳﺎﻝ ﺟﻬﺘﺪﺍﺭ ﺑﺮﻗـﺮﺍﺭ ﻣﻴﮑﻨـﻴﻢ .ﻳـﺎﻝ ﺍﻭﻝ
ﺩﺍﺭﺍﯼ ﻫﺰﻳﻨﻪ ﻋﻨﺼﺮ iﺍﻡ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﺍﻋﺪﺍﺩ ﺩﺍﺩﻩ ﺷﺪﻩ ﻭ ﻳﺎﻝ ﺩﻭﻡ ﺩﺍﺭﺍﯼ ﻣﻘﺪﺍﺭ ﻗﺮﻳﻨﻪ ﻳﺎﻝ ﺍﻭﻝ ﻣﻴﺒﺎﺷـﺪ .ﺣـﺎﻝ ﭘﻴـﺪﺍ ﮐـﺮﺩﻥ
ﻣﺴﻴﺮﯼ ﺑﻪ ﻃﻮﻝ ﺻﻔﺮ ﺩﺭ ﺍﻳﻦ ﮔﺮﺍﻑ ﻣﻨﺠﺮ ﺑﻪ ﺍﻓﺮﺍﺯ ﻣﺠﻤﻮﻋﻪ ﺍﻭﻟﻴﻪ ﺑﻪ ﺩﻭ ﻗﺴﻤﺖ ﺑﺎ ﻣﺠﻤﻮﻉ ﻳﮑﺴﺎﻥ ﺧﻮﺍﻫﺪ ﺷﺪ! .ﺍﻧﺘﺨﺎﺏ
ﻋﻨﺎﺻﺮ ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻳﺎﻟﻬﺎﯼ ﺍﻭﻝ ﺍﺯ ﻫﺮ ﺭﺍﺱ ﺑﻪ ﺭﺍﺱ ﺑﻌﺪﯼ ﺩﺭ ﻣﺴﻴﺮ ﻣﻮﺭﺩ ﻧﻈﺮ ﻣﻨﺠﺮ ﺑﻪ ﺍﻓﺮﺍﺯ ﻣﻮﺭﺩ ﻧﻈﺮ ﺧﻮﺍﻫﺪ ﺷﺪ.
ﻓﺮﺽ ﮐﻨﻴﺪ ﻫﺪﻑ ﺍﻓﺮﺍﺯ ﻣﺠﻤﻮﻋﻪ } {3,1,7,9ﻣﻴﺒﺎﺷﺪ .ﮔﺮﺍﻓﯽ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﺳـﺎﺧﺘﻪ ﻭ ﺩﺭ ﺁﻥ ﻣﺴـﻴﺮﻱ ﺍﺯ Aﺑـﻪ Bﺑـﻪ
ﻃﻮﻝ ﺻﻔﺮ ﺭﺍ ﺑﺮﺭﺳﯽ ﻣﻴﮑﻨﻴﻢ:
A B
٣ ٧
A B
-١ -٩
ﻥ
ﻣ