درس طراحی الگوریتم ها (با شبه کد های c ++ )

44
م ها ت ی ور گ ل ی ا ح را ط درس م ها ت ی ور گ ل ی ا ح را ط درس کد های ه ب ش ا ب( کد های ه ب ش ا ب( c c ++ ++ ) ) واحد:اد عد ت واحد:اد عد ت3 3 ی ن ی م ورا, پ ر عف ج ده : ن3 ی ک ه ب ه ت ی ن ی م ورا, پ ر عف ج ده : ن3 ی ک ه ب ه ت ها م ت ی ور گ ل ی ا ح را ط اب ن ک ع : ب ی م م : = ج ر مت م : = ج ر مت ادB ژ ن ر عف ج ادB ژ ن ر عف ج ی م ق ی م ق

Upload: vielka-buck

Post on 03-Jan-2016

83 views

Category:

Documents


4 download

DESCRIPTION

درس طراحی الگوریتم ها (با شبه کد های c ++ ). تعداد واحد: 3 تهیه کننده : جعفر پورامینی منبع : کتاب طراحی الگوریتمها مترجم : جعفر نژاد قمی. فصل دوم: روش تقسیم و حل. روش تقسیم و حل یک روش بالا به پایین است. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درس طراحی الگوریتم درس طراحی الگوریتم هاها

(( ++ ++cc)با شبه کد های )با شبه کد های

33تعداد واحد: تعداد واحد:

تهیه کننده : جعفر پورامینیتهیه کننده : جعفر پورامینیمنبع : کتاب طراحی الگوریتمها

قمی قمی جعفر نژادجعفر نژادمترجم : مترجم :

Page 2: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

فصل دوم:فصل دوم:

روش تقسیم و حلروش تقسیم و حل

Page 3: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

روش تقسیم و حل یک روش باال به پایین روش تقسیم و حل یک روش باال به پاییناست.است.

حل یک نمونه سطح باالی مسئله با رفتن به حل یک نمونه سطح باالی مسئله با رفتن بهجزء و بدست آوردن حل نمونه های کوچکتر جزء و بدست آوردن حل نمونه های کوچکتر

حاصل می شود.حاصل می شود.

Page 4: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

:هنگام پی ریزی یک الگوریتم بازگشتی ، باید:هنگام پی ریزی یک الگوریتم بازگشتی ، باید

- راهی برای به دست آوردن حل یک نمونه از - راهی برای به دست آوردن حل یک نمونه از 11روی حل یک نمونه ازروی حل یک یا چند نمونه روی حل یک نمونه ازروی حل یک یا چند نمونه

کوچک تر طراحی کنیم.کوچک تر طراحی کنیم.

- شرط)شرایط ( نهایی نزدیک شدن به - شرط)شرایط ( نهایی نزدیک شدن به 22نمونه)های( کوچک تر را تعیین کنیم.نمونه)های( کوچک تر را تعیین کنیم.

- حل را در حالت شرط )شرایط(نهایی تعیین - حل را در حالت شرط )شرایط(نهایی تعیین 33کنیم.کنیم.

Page 5: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

جست و جوی دودویی )بازگشتی(جست و جوی دودویی )بازگشتی( ::22--11الگوریتمالگوریتم

index index location ( location ( indexindex low, low, indexindex high ) high ){ { indexindex mid; mid; ifif (low > high ) (low > high ) returnreturn 0; 0; elseelse { { mid = mid = Į Į (low + high) /2⌡;(low + high) /2⌡; ifif (x = = S [mid]) (x = = S [mid]) return return mid; mid;

else ifelse if ( x < S [mid]) ( x < S [mid]) return return location (low , mid – 1); location (low , mid – 1); elseelse return return location (mid + 1, high); location (mid + 1, high); }} }}

location(1, n) فراخوانی اولیه:

Page 6: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم جست و جوی دودویی بازگشتیجست و جوی دودویی بازگشتی

..S [mid]S [mid] با با xxمقایسه مقایسه عمل اصلی: عمل اصلی:

، تعداد عناصر آرایه. ، تعداد عناصر آرایه.nn اندازه ورودی: اندازه ورودی:

W (n) = W (n / 2) + 1W (n) = W (n / 2) + 1

/ W (n) = W (n / W (n) = W (n است است 22 توانی از توانی از n >1n >1 ، ، nn برای برای 2) + 12) + 1

W (1) = 1W (1) = 1

W (n) = Į lg n ⌡+ 1 W (n) = Į lg n ⌡+ 1 ЄЄ θθ (lg n) (lg n)

Page 7: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی ادغامیمرتب سازی ادغامی2-22-2

.ادغام یک فرآیند مرتبط با مرتب سازی است.ادغام یک فرآیند مرتبط با مرتب سازی است

ادغام دوطرفه به معنای ترکیب دو آرایه مرتب ادغام دوطرفه به معنای ترکیب دو آرایه مرتبشده در یک آرایه ی مرتب است.شده در یک آرایه ی مرتب است.

Page 8: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی ادغامی شامل مراحل زیر می مرتب سازی ادغامی شامل مراحل زیر میشود:شود:

n/2n/2- تقسیم آرایه به دو زیر آرایه، هر یک با - تقسیم آرایه به دو زیر آرایه، هر یک با 11عنصر.عنصر.

- حل هر زیر آرایه با مرتب سازی آن.- حل هر زیر آرایه با مرتب سازی آن.22

حل های زیر آرایه ها از طریق ادغام حل های زیر آرایه ها از طریق ادغام ترکیبترکیب- - 33آن ها در یک آرایه مرتب.آن ها در یک آرایه مرتب.

Page 9: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مراحل انجام شده توسط انسان در هنگام مرتب سازی ادغامیمراحل انجام شده توسط انسان در هنگام مرتب سازی ادغامی

Page 10: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی ادغامیمرتب سازی ادغامی: : 22--22الگوریتمالگوریتم

voidvoid mergsort ( mergsort (intint n , n , keytypekeytype S [ ]) S [ ]){ {

const intconst int h = Į n/2 ⌡ , m = n – h h = Į n/2 ⌡ , m = n – h;; keytypekeytype U [1...h],V [1..m] U [1...h],V [1..m];;

ifif (n >1) (n >1){ { copy S[1] through S[h] to U[h]copy S[1] through S[h] to U[h];;

copy S [h + 1] through S[h] to V[1] through copy S [h + 1] through S[h] to V[1] through V[m]V[m];;

mergesort(h, U)mergesort(h, U);; mergesort(m,V)mergesort(m,V);;

merge (h , m , U,V,S)merge (h , m , U,V,S);;} } } }

Page 11: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامادغام ::22--33الگوریتمالگوریتم

voidvoid merg ( merg ( intint h , h , intint m, m, const keytypeconst keytype U U,] [,] [

const keytypeconst keytype V V ,] [ ,] [

keytype keytype S S) ] [) ] [

{ {

indexindex i , j , k i , j , k;;

i = 1; j = 1 ; k = 1i = 1; j = 1 ; k = 1;;

whilewhile (i <= h (i <= h &&&& j <= m) j <= m){ {

ifif (U [i] < V [j]) (U [i] < V [j]){ {

S [k] = U [i]S [k] = U [i]

ii; + +; + +

Page 12: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

}}

elseelse{ {

S [k] = V [j]S [k] = V [j];;

jj;+ +;+ +

} }

kk;+ +;+ +

} }

if ( i > h)if ( i > h)

copy V [j] through V [m] to S [k] through S [ h + m ]copy V [j] through V [m] to S [k] through S [ h + m ]

elseelse

copy U [i] through U [h] to S [k] through S [ h + m ]copy U [i] through U [h] to S [k] through S [ h + m ]

}}

Page 13: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم )ادغام()ادغام(22--33

V[j]V[j]. . با با U [i]U [i]مقایسهمقایسه عمل اصلی: عمل اصلی:

،تعداد عناصر موجود در هر یک از دو ،تعداد عناصر موجود در هر یک از دو mm و و hh اندازه ورودی: اندازه ورودی:آرایه ورودی.آرایه ورودی.

W ( h , m) = h + m - 1W ( h , m) = h + m - 1

Page 14: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم ) مرتب سازی ادغامی() مرتب سازی ادغامی(22--22

مقایسه ای که درادغام صورت می پذیرد.مقایسه ای که درادغام صورت می پذیرد.عمل اصلی: عمل اصلی:

..SS ، تعداد عناصر آرایه ، تعداد عناصر آرایه nnاندازه ورودی: اندازه ورودی: W (n) = W (h) + W ( m) + h + m – 1W (n) = W (h) + W ( m) + h + m – 1

↓ ↓ ↓ ↓ ↓ ↓

سازی مرتب برای الزم زمان ادغام برای الزم سازی زمان مرتب برای الزم زمان ادغام برای الزم سازی VV زمان مرتب برای الزم سازی زمان مرتب برای الزم زمان UU

از nnکه که n >1n >1برای برای از توانی W (n) = 2 W( n / 2)W (n) = 2 W( n / 2) + + n -1n -1 است است 22توانی

W (1) = 0W (1) = 0

W( n ) W( n ) ЄЄ θθ ( n lg n) ( n lg n)

Page 15: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی درجا: روشی که از فضایی بیشتر مرتب سازی درجا: روشی که از فضایی بیشتراز آنچه مورد نیاز ورودی است استفاده نمی کند.از آنچه مورد نیاز ورودی است استفاده نمی کند.

الگوریتم گفته شده درجا نیست ← زیرا از آرایه الگوریتم گفته شده درجا نیست ← زیرا از آرایهUU و و VV به همرا آرایه ورودی به همرا آرایه ورودی SS.استفاده می کند. استفاده می کند

:میزان حافظه اضافی:میزان حافظه اضافی

n +n/2 +n/4+ ...≈2nn +n/2 +n/4+ ...≈2n کاهش مقدار حافظه اضافی به کاهش مقدار حافظه اضافی بهnn؟ ؟

Page 16: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

( (mergesort 2mergesort 2))22مرتب سازی ادغامی مرتب سازی ادغامی : : 22--44الگوریتمالگوریتم

void void mergesort2 (mergesort2 (indexindex low, low, indexindex high) high)

{ {

index midindex mid;;

if (low < high)if (low < high){ {

mid = Į ( low + high) / 2mid = Į ( low + high) / 2;⌡ ;⌡

mergesort 2 (low, mid)mergesort 2 (low, mid);;

mergesort 2 (mid +1, high)mergesort 2 (mid +1, high);;

merge2(low,mid,high)merge2(low,mid,high)

} }

} }

Page 17: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

22ادغامادغام::22--55الگوریتمالگوریتم

ایجاد شده ایجاد شده mergesortmergesortدردر کهکه SSادغام دو آرایه ی مرتب ادغام دو آرایه ی مرتب مسئله:مسئله: اند.اند.

voidvoid mrge2 ( mrge2 (indexindex low, low, index index mid, mid, indexindex high) high){ {

indexindex i, j , k i, j , k;; keytypekeytype U [ low..high] U [ low..high]

i = low; j = mid +1 ; k = lowi = low; j = mid +1 ; k = low;; while while ( i <= mid ( i <= mid && && j <= high)j <= high){ {

ifif ( S [i] < S [j] ) ( S [i] < S [j] ){ { U [k] = S [i]U [k] = S [i];;

ii; + + ; + + } }

Page 18: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

elseelse{ { U [k] = S [j]U [k] = S [j]

jj;++ ;++ } }

kk;++ ;++ } }

if if ( i > mid )( i > mid ) move S [j] through S [high] to U [k] through U [high]move S [j] through S [high] to U [k] through U [high]

elseelse

move S [i] through S [mid] to U [k] through U [high]move S [i] through S [mid] to U [k] through U [high]

move U [low] through U [high] to S [low] through S [high]move U [low] through U [high] to S [low] through S [high] } }

Page 19: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

روش تقسیم و حلروش تقسیم و حل3-23-2

راهبرد طراحی تقسیم و حل شامل مراحل زیر راهبرد طراحی تقسیم و حل شامل مراحل زیر است:است:

- تقسیم نمونه ای ازیک مسئله به یک یا چند - تقسیم نمونه ای ازیک مسئله به یک یا چند 11نمونه کوچکتر.نمونه کوچکتر.

- حل هر نمونه کوچکتر. اگر نمونه های کوچک تر - حل هر نمونه کوچکتر. اگر نمونه های کوچک تر 22به قدر کوچک تر به قدر کافی کوچک نبودند، به قدر کوچک تر به قدر کافی کوچک نبودند،

برای این منظور از بازگشت استفاده کنید.برای این منظور از بازگشت استفاده کنید.

- در صورت نیاز، حل نمونه های کوچک تر را - در صورت نیاز، حل نمونه های کوچک تر را 33ترکیب کنید تا حل نمونه اولیه به دست آید.ترکیب کنید تا حل نمونه اولیه به دست آید.

Page 20: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

((quicksortquicksort مرتب سازی سریع ) مرتب سازی سریع )4-24-2

در مرتب سازی سریع، ترتیب آنها از چگونگی در مرتب سازی سریع، ترتیب آنها از چگونگیافراز آرایه ها ناشی می شود.افراز آرایه ها ناشی می شود.

همه عناصر کوچک تر آز عنصر محوری در همه عناصر کوچک تر آز عنصر محوری درطرف چپ آن وهمه عناصربزرگ تر، درطرف طرف چپ آن وهمه عناصربزرگ تر، درطرف

راست آن واقع هستند.راست آن واقع هستند.

Page 21: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی سریع، به طور بازگشتی مرتب سازی سریع، به طور بازگشتیفراخوانی می شود تافراخوانی می شود تا

هر یک از دوآرایه را مرتب کند، آن ها نیز افراز هر یک از دوآرایه را مرتب کند، آن ها نیز افراز می شوندمی شوند

واین روال ادامه می یابد تا به آرایه ای با یک واین روال ادامه می یابد تا به آرایه ای با یک عنصربرسیم.عنصربرسیم.

m مرتب است. m مرتب است. چنین آرایه ای ذاتا چنین آرایه ای ذاتا

Page 22: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مراحل انجام شده توسط انسان در هنگام مرتب سازی سریعمراحل انجام شده توسط انسان در هنگام مرتب سازی سریع

Page 23: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب سازی سریعمرتب سازی سریع : :22--66الگوریتمالگوریتم

..کلید با ترتیب غیر نزولیکلید با ترتیب غیر نزولی nn مرتب سازیمرتب سازی مسئله:مسئله:

voidvoid quicksort (index low , index high) quicksort (index low , index high)

{ {

index pivotpointindex pivotpoint;;

if ( high > low)if ( high > low){ {

partition (low , high , pivotpoint)partition (low , high , pivotpoint)

quicksort (low , pivotpoint – 1)quicksort (low , pivotpoint – 1)

quicksort (pivotpoint + 1 , high)quicksort (pivotpoint + 1 , high);;

} }

}}

Page 24: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

افراز آرایهافراز آرایه: : 22--77الگوریتمالگوریتم

برای مرتب سازی سریع. برای مرتب سازی سریع.SSافراز آرایه افراز آرایه مسئله: مسئله:

void void partition (partition (indexindex low, low, indexindex high) high)

index &index & pivotpoint pivotpoint))

{ {

indexindex i , j i , j;;

keytypekeytype pivotitem pivotitem;;

pivotitem = S [low]pivotitem = S [low];;

j = lowj = low

for for ( i = low +1 ; i <= high; i ++)( i = low +1 ; i <= high; i ++)

Page 25: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if if ( S [i] < pivotitem )( S [i] < pivotitem ){ {

jj;++;++

exchange S [i] and S [j]exchange S [i] and S [j];;

} }

pivotpoint = jpivotpoint = j;;

exchange S [low] and S [ pivotpoint]exchange S [low] and S [ pivotpoint];;

}}

Page 26: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی در حالت معمول برای الگوریتم تحلیل پیچیدگی زمانی در حالت معمول برای الگوریتم ) افراز() افراز(22--77

. .pivotitempivotitem با با S [i]S [i]مقایسهمقایسهعمل اصلی: عمل اصلی:

، تعداد عناصرموجود ، تعداد عناصرموجود n = high – how +1n = high – how +1اندازه ورودی: اندازه ورودی: در زیر آرایه.در زیر آرایه.

T(n) = n - 1T(n) = n - 1

Page 27: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتم تحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتم )مرتب سازی سریع()مرتب سازی سریع(22--66

partitionpartition در روال در روال pivotitempivotitem با با S [i]S [i]مقایسهمقایسهعمل اصلی: عمل اصلی: ..

..SS ، تعداد عناصر موجود درآرایه ، تعداد عناصر موجود درآرایه nnاندازه ورودی: اندازه ورودی:

T(n) = T(0) + T( n – 1) + n – 1T(n) = T(0) + T( n – 1) + n – 1

↓ ↓ ↓ ↓ ↓ ↓ زمان زمان زمان الزم برای مرتب سازیزمان الزم برای مرتب سازی زمان الزم برای افراززمان الزم برای افراز

الزم برای مرتب سازی الزم برای مرتب سازی زیر آرایه طرف زیر آرایه طرف زیرآرایه طرف راست زیرآرایه طرف راست

چپ چپ

Page 28: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

n > 0 n > 0 T (n) = T (n – 1) + n – 1 T (n) = T (n – 1) + n – 1 به ازای به ازای

T (0) = 0T (0) = 0

W (n) = n (n – 1) / 2 W (n) = n (n – 1) / 2 ЄЄ θθ (n²) (n²)

Page 29: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی در حالت میانگین برای الگوریتم تحلیل پیچیدگی زمانی در حالت میانگین برای الگوریتم )مرتب سازی سریع()مرتب سازی سریع(22--66

. .partitionpartition در در pivotitempivotitem با با S [i]S [i]مقایسهمقایسهعمل اصلی: عمل اصلی:

..SS ، تعداد عناصر موجود در ، تعداد عناصر موجود در nnاندازه ورودی: اندازه ورودی:

Page 30: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی در حالت میانگین برای الگوریتم تحلیل پیچیدگی زمانی در حالت میانگین برای الگوریتم )مرتب سازی سریع()مرتب سازی سریع(22--66

و ساده سازی رابطه زیر و ساده سازی رابطه زیر A(n-1)A(n-1) و و A(n)A(n)حال با کسر حال با کسر بدست می آیدبدست می آید

Page 31: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم ضرب ماتریس استراسنالگوریتم ضرب ماتریس استراسن5-25-2

پیچیدگی این الگوریتم از لحاظ ضرب، جمع و پیچیدگی این الگوریتم از لحاظ ضرب، جمع وتفریق بهتر از پیچیدگی درجه سوم است.تفریق بهتر از پیچیدگی درجه سوم است.

روش استراسن در مورد ضرب ماتریس های روش استراسن در مورد ضرب ماتریس های22××22. ندارد چندانی .ارزش ندارد چندانی ارزش

Page 32: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مروری بر ضرب ماتریسمروری بر ضرب ماتریس حاصلضرب ماتریسهای مربعی حاصلضرب ماتریسهای مربعیAA و و BB به صورت به صورت

ودودزیر تعریف می شزیر تعریف می ش

یه عنوان مثال در حالت یه عنوان مثال در حالتn = 2n = 2:برای برای داریم: داریم عمل ضرب داریم. عمل ضرب داریم. nnمحاسبه هر درایه نیاز به محاسبه هر درایه نیاز به

CC درایه ماتریس درایه ماتریس nn22بنابراین برای محاسبه تمامی بنابراین برای محاسبه تمامی عمل ضرب نیاز خواهیم داشت. عمل ضرب نیاز خواهیم داشت.nn33به به

Page 33: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

جمالت ضرب استراسنجمالت ضرب استراسن

P1 = (A11+ A22)(B11+B22)

P2 = (A21 + A22) * B11

P3 = A11 * (B12 - B22)

P4 = A22 * (B21 - B11)

P5 = (A11 + A12) * B22

P6 = (A21 - A11) * (B11 + B12)

P7 = (A12 - A22) * (B21 + B22)

C11 = P1 + P4 - P5 + P7

C12 = P3 + P5

C21 = P2 + P4

C22 = P1 + P3 - P2 + P6

A11 A12

A21 A22

B11 B12

B21 B22

C11 C12

C21 C22

* =

Page 34: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

استراسناستراسن ::22--88الگوریتم الگوریتم

آن n n ×n×nتعیین حاصلضرب دو ماتریس تعیین حاصلضرب دو ماتریس مسئله : مسئله : در آن که در از nnکه از توانی .22توانی .است است void starssen ( int n, n × n _ matrix A,void starssen ( int n, n × n _ matrix A, n × n _ matrix B, n × n _ matrix & C){n × n _ matrix B, n × n _ matrix & C){if ( n <= threshold) if ( n <= threshold) compute C = A × B using the standard algorithm;compute C = A × B using the standard algorithm;

elseelse { { partition A into four submatrics Apartition A into four submatrics A11, 11, AA12 , 12 , AA2121,A,A2222;; partition B into four submatrics Bpartition B into four submatrics B11, 11, BB12 , 12 , BB2121,B,B2222;;

compute C = A × B using Starssen’s Methodcompute C = A × B using Starssen’s Method;;} }

} }

Page 35: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

--88تحلیل پیچیدگی زمانی تعداد ضرب ها در الگوریتم تحلیل پیچیدگی زمانی تعداد ضرب ها در الگوریتم )استرسن(در حالت معمول)استرسن(در حالت معمول22

یک ضرب ساده.یک ضرب ساده. عمل اصلی: عمل اصلی:

، تعداد سطرها و ستون ها در ماتریس. ، تعداد سطرها و ستون ها در ماتریس. nn اندازه ورودی: اندازه ورودی:

T (n) = 7 T T (n) = 7 T استاست22 توانی از توانی از nn که که n > 1n > 1به ازای به ازای (n / 2)(n / 2)

T (1) = 1T (1) = 1

T (n) T (n) ЄЄ θθ ( n ^2.81) ( n ^2.81)

Page 36: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی تعدادجمع هاو تفریقهای تحلیل پیچیدگی زمانی تعدادجمع هاو تفریقهای الگوریتم )استرسن(درحالت معمولالگوریتم )استرسن(درحالت معمول

یک جمع یا تفریق ساده.یک جمع یا تفریق ساده.عمل اصلی: عمل اصلی:

، تعداد سطرها و ستون ها در ماتریس. ، تعداد سطرها و ستون ها در ماتریس. nn اندازه ورودی: اندازه ورودی:

= ² ² +( +(T (n) = T (n)((n/2n/2 ) )1818استاست22 توانی از توانی از nn که که n > 1n > 1به ازای به ازای 7T(n/27T(n/2

T ( 1 ) = 1T ( 1 ) = 1

T ( n ) T ( n ) ЄЄ θθ ( n ^ 2.81) ( n ^ 2.81)

Page 37: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ضرب اعداد بزرگضرب اعداد بزرگ

دربرخی از مسایل الزم است با اعداد بسیار دربرخی از مسایل الزم است با اعداد بسیاربزرگ محاسباتی انجام دهیم. بزرگ محاسباتی انجام دهیم.

ضرب دو عدد بسیار بزرگ نمونه ای از این ضرب دو عدد بسیار بزرگ نمونه ای از اینموارد است که می توان الگوریتم آن را به موارد است که می توان الگوریتم آن را به

روش تقسیم و حل تهیه کرد. روش تقسیم و حل تهیه کرد.

Page 38: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

روند الگوریتمروند الگوریتم دو عدد دو عدد uu و و vv با تعداد ارقام باال و متفاوت را می با تعداد ارقام باال و متفاوت را می

توان به دو بخش عددی تفکیک کرد. قسمت اول توان به دو بخش عددی تفکیک کرد. قسمت اول رقم دارند. رقم دارند.mmهر دو عدد هر دو عدد

W X

Y Z

U

V

UV=(W*10m+X)(Y*10m+Z)=WY*102m+(WZ+XY)*10m+XZ

Page 39: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ضرب اعداد صحیح بزرگضرب اعداد صحیح بزرگ: : 22--99الگوریتمالگوریتم

vvو و uu ضرب دو عدد صحیح بزرگضرب دو عدد صحیح بزرگمسئله: مسئله:

large _ integer large _ integer prod ( large_integer u, large_integer v)prod ( large_integer u, large_integer v)

{ {

large_inregerlarge_inreger x , y , w , z x , y , w , z; ;

intint n , m n , m; ;

n = maximum(number of digits in u,number of digits in n = maximum(number of digits in u,number of digits in v)v)

if (u = = 0 || v = = 0)if (u = = 0 || v = = 0)

return 0return 0; ;

Page 40: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else ifelse if (n < = threshold (n < = threshold)) returnreturn u × v obtained in the usual way u × v obtained in the usual way;;

elseelse {{

m = Į n / 2m = Į n / 2;⌡ ;⌡ x = u x = u dividedivide 10 ^ 10 ^ m m ; y = ; y = remrem 10 ^ 10 ^ mm;;

w = v w = v dividedivide 10 ^ 10 ^ m m ; z =; z = rem rem 10 ^ 10 ^ mm;;

returnreturn prod (x ,w) × 10 ^ prod (x ,w) × 10 ^2m2m + ( prod ( x, z) + + ( prod ( x, z) + prod (w, y )) × 10 ^ m + prod ( y, z)prod (w, y )) × 10 ^ m + prod ( y, z);;

} }

} }

Page 41: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تحلیل پیچیدگی زمانی در بدترین حالت برای ا تحلیل پیچیدگی زمانی در بدترین حالت برای ا ) ضرب اعداد صحیح() ضرب اعداد صحیح(22--99لگوریتملگوریتم

دستکاری یک رقم دهدهی در یک عدد صحیح بزرگ دستکاری یک رقم دهدهی در یک عدد صحیح بزرگ عمل اصلی: عمل اصلی: دردر

، ، divide 10 ^ divide 10 ^ mm هنگام جمع کردن ، تفریق کردن، یا انجام اعمال هنگام جمع کردن ، تفریق کردن، یا انجام اعمال

rem 10 ^rem 10 ^mm 1010×× یایا ^ ^ mmاز این اعمال را از این اعمال را . هر یک. هر یکmm بار انجام می بار انجام می دهد.دهد.

، تعداد ارقام هر یک از دو عدد صحیح.، تعداد ارقام هر یک از دو عدد صحیح. nn اندازه ورودی:اندازه ورودی:

W ( n ) = 4 W (n / 2) + cnW ( n ) = 4 W (n / 2) + cnاستاست22 توانی از توانی از nn که که n > sn > sبه ازای به ازای

W ( s ) = 0W ( s ) = 0

W ( n ) W ( n ) ЄЄ θθ ( n² ) ( n² )

Page 42: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

22ضرب اعداد صحیح بزرگ ضرب اعداد صحیح بزرگ ::22--1010الگوریتم الگوریتم

large_integerlarge_integer prod2 ( prod2 (large_integerlarge_integer u , u , large_ integerlarge_ integer v) v)

{ {

large_integerlarge_integer x , y , w , z , r , p , q x , y , w , z , r , p , q;;

intint n , m n , m;;

n = maximum (number of digits in u,number of digits in n = maximum (number of digits in u,number of digits in v)v);;

if if (u = = 0 || v = = 0) (u = = 0 || v = = 0)

return return 00; ;

else ifelse if (n < = threshold (n < = threshold)) returnreturn u × v obtained in the usual way u × v obtained in the usual way ; ;

Page 43: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

elseelse {{

m = Į n / 2m = Į n / 2;⌡ ;⌡ x = u x = u dividedivide 10 ^ 10 ^ m m ; y = ; y = remrem 10 ^ 10 ^ mm ; ;

w = v w = v dividedivide 10 ^ 10 ^ m m ; z =; z = rem rem 10 ^ 10 ^ mm;;

r = prod2 (x + y, w + z )r = prod2 (x + y, w + z );;

p = prod2 ( x , w )p = prod2 ( x , w )

q = prod2 ( y , z )q = prod2 ( y , z );;

return p ×10 ^ 2m + ( r – p – q ) × 10 ^ m +qreturn p ×10 ^ 2m + ( r – p – q ) × 10 ^ m +q ; ; } }

} }

Page 44: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

--1010تحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتمتحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتم((22) ضرب اعداد صحیح) ضرب اعداد صحیح22

دستکاری یک رقم دهدهی در یک عدد صحیح بزرگ دستکاری یک رقم دهدهی در یک عدد صحیح بزرگ عمل اصلی: عمل اصلی: دردر

، ، divide 10 ^ divide 10 ^ mm هنگام جمع کردن ، تفریق کردن، یا انجام اعمال هنگام جمع کردن ، تفریق کردن، یا انجام اعمال

rem 10 ^rem 10 ^mm 1010×× یایا ^ ^ mmاز این اعمال را از این اعمال را . هر یک. هر یکmm بار انجام می بار انجام می دهد.دهد.

، تعداد ارقام هر یک از دو عدد صحیح.، تعداد ارقام هر یک از دو عدد صحیح. nn اندازه ورودی:اندازه ورودی:

استاست22 توانی از توانی از nn که که n > sn > sبه ازای به ازای

3W(n/2)+ c n <=W (n) <= 3W (n / 2 +1) + c n3W(n/2)+ c n <=W (n) <= 3W (n / 2 +1) + c n

W (s) = 0W (s) = 0

W (n) = W (n) = θθ (n ^ 1.58) (n ^ 1.58)