88
ه ن صا ی ر ح روشGreedy Method دار ای مد ی ص- هد ش م ی س ردو ف گاه ش ن دا- م ها ت ی ور گ ل ی ا ح را ط

Algorythm Design (5)

  • Upload
    vahidvs

  • View
    316

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algorythm Design (5)

روش حریصانهGreedy Method

طراحی الگوریتم ها - دانشگاه فردوسی مشهد - صمد پایدار

Page 2: Algorythm Design (5)

22 روش حریصانه

مطالب مورد بحث

مقدمهبررسی چند مساله نمونه

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمPrim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 3: Algorythm Design (5)

33 روش حریصانه

مقدمه

،در مسائلی که به این روش حل می شوندمعموال:

.ورودی مساله شامل مجموعه ای از عناصر است خروجی مساله شامل مجموعه ای از عناصر است که

بیشتر مواقع، زیرمجموعه ورودی مساله می باشد. علیرغم استفاده از لفظ مجموعه، ممکن است ترتیب عناصر

مجموعه جواب، مهم باشد..موضوع بهینگی مطرح است

یعنی حل مساله، مستلزم انتخاب زیرمجموعه ای از مجموعهعناصر ورودی می باشد که تابع هدف مساله را بهینه می

نمایند. .جواب را می توان بصورت مرحله به مرحله بدست آورد

)در هر مرحله یک مولفه جواب را بدست آورد(مثال: خرد کردن اسکناس

Page 4: Algorythm Design (5)

44 روش حریصانه

مقدمه

کلیات روش حریصانه.در ابتدا مجموعه جواب را تهی در نظر می گیریم:بطور مرحله به مرحله عمل می کنیم. در هر مرحله

از بین عناصر ممکن که می توانیم بعنوان عنصر بعدیمجموعه جواب انتخاب کنیم، بهترین عنصر را در نظر می

گیریم. بررسی می کنیم آیا با انتخاب آن مولفه، امکان رسیدن به

جواب وجود دارد یا خیر..اگر بله: آن مولفه را به مجموعه جواب اضافه می کنیم اگر خیر: آن مولفه را به مجموعه جواب اضافه نمی کنیم و آن را

برای همیشه کنار می گذاریم. با افزودن هر عنصر به مجموعه جواب، بررسی می کنیم اگر

جواب مساله حاصل شده است، جواب بدست آمده بهینه خواهد بود و کار تمام است.

.بنابراین با بدست آوردن اولین جواب کار تمام می شود

Page 5: Algorythm Design (5)

55 روش حریصانه

مقدمه

یک الگوریتم حریصانه باید بطور صریح یاضمنی دارای این اجزا باشد:

قسمتی برای انتخاب مولفه بعدی جواب از بیننامزدهای ممکن

قسمتی برای تعیین اینکه آیا با انتخاب مولفه جدید)بهمراه عناصری که تا کنون انتخاب شده

اند(امکان رسیدن به جواب وجود دارد یا خیر.قسمتی برای تعیین میزان ارزش مجموعه جواب قسمتی برای بررسی اینکه آیا مجموعه عناصر

انتخاب شده، جواب مساله را تولید کرده است یا کار باید ادامه پیدا کند.

Page 6: Algorythm Design (5)

66 روش حریصانه

مطالب مورد بحث

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمPrim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 7: Algorythm Design (5)

77 روش حریصانه

کوله پشتی غیر صفر و یک

.تعدادی شیء و یک کوله پشتی داریم شیءi دارای وزن wi و ارزش pi.می باشد ظرفیت وزنی کوله پشتی برابرM.می باشد هدف: اشیا را برای قرار دادن در داخل کوله پشتی

انتخاب کنیم، بگونه ای که ضمن رعایت ظرفیت وزنی کوله پشتی، مجموع ارزش اشیای انتخاب

شده، ماکزیمم گردد. .امکان انتخاب کسری از هر شیء نیز وجود دارد

واحد انتخاب می xi به میزان iبنابراین از هر شیء (xi ≤1 ≥ 0کنیم. )

اگر اینطور نباشد، یعنی یا باید یک شیء را بطور کاملانتخاب کنیم یا اصال آن را انتخاب نکنیم. در اینصورت،

مساله به مساله کوله پشتی صفر و یک تبدیل خواهد شد.

Page 8: Algorythm Design (5)

88 روش حریصانه

کوله پشتی غیر صفر و یک

xp maximizen

1iii

n

1iii Mxw subject to

بیان ریاضی :تعداد اشیاn0 ≤ xi ≤ 1

Page 9: Algorythm Design (5)

99 روش حریصانه

کوله پشتی غیر صفر و یک

:حدس چون ارزش اشیا تاثیر مثبت دارد و می خواهیم

مجموع ارزش اشیای انتخاب شده را ماکزیمم کنیم، پس بهتر است اشیا را به ترتیب بیشترین ارزش

انتخاب کنیم. چون وزن اشیا تاثیر منفی دارد و می خواهیم کوله

پشتی دیرتر پر شود، پس بهتر است اشیا را به ترتیب کمترین وزن انتخاب کنیم.

چون ارزش اشیا تاثیر مثبت و وزن اشیا تاثیر منفی pi/wiدارد، بهتر است اشیا را به ترتیب بیشترین

انتخاب کنیم. در هر صورت، کوله پشتی را تا حداکثر ظرفیت پر

می کنیم، مگر آنکه اشیا تمام شوند.

Page 10: Algorythm Design (5)

1010 روش حریصانه

کوله پشتی غیر صفر و یک

:مثالM=20 و n=3 (p1 , p2 , p3) = (25, 24, 15)

(w1 , w2 , w3) = (18, 15, 10)

مجموع ارزش اشیای انتخاب

شده

مجموع وزن اشیای انتخاب

شده

حدس مورد جواباستفاده

28.220(1 ,2/15 ,0)

حدس اول

حدس دوم(1, 2/3, 0)3120

حدس سوم(1/2, 1, 0)31.520

Page 11: Algorythm Design (5)

1111 روش حریصانه

کوله پشتی غیر صفر و یک

.درستی این حدس را باید اثبات کنیم

Page 12: Algorythm Design (5)

1212 روش حریصانه

کوله پشتی غیر صفر و یک

void knapsack(float P[], float W[], float M, float X[], int n) {pwSort(P, W, n); // ،اشیا را بر حسب نسبت ارزش به وزننزولی مرتب کن

for(int i=0; i<n; i++) X[i] = 0; // مقداردهی اولیه

rc = M; // rc= remained capacity ظرفیت باقیمانده کولهپشتی

for(int i=0; i<n; i++) {if (W[i] ≤ rc) {

X[i] = 1; rc=rc – W[i];} else {

X[i] = rc/W[i]; break;}}}

Page 13: Algorythm Design (5)

1313 روش حریصانه

کوله پشتی غیر صفر و یک

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

Mمقدار اندازه ورودی: تعداد اشیای ورودی یعنیn عمل کلیدی: مقایسهW[i] با rc :تابع پیچیدگی

W(n) = n + WpwSort(n) WpwSort(n) = O(n logn)

W)n( = O)n logn(

Page 14: Algorythm Design (5)

1414 روش حریصانه

کوله پشتی غیر صفر و یک

الگوریتم منطبق بر الگوی روش حریصانه میباشد.

اثبات درستی

Page 15: Algorythm Design (5)

1515 روش حریصانه

مطالب مورد بحث

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمPrim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 16: Algorythm Design (5)

1616 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

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

متوسط برگشت آنها مینیمم گردد.( زمان برگشتturnaround time مدت سپری شده ،)

از زمان تحویل برنامه به کامپیوتر تا پایان اجرای آن می باشد.

ویژگیهای مساله ورودی مجموعه ای از عناصر است )مجموعه زمان اجرای

برنامه ها( خروجی مجموعه ای از عناصر است. در این مثال تعداد

عناصر مجموعه خروجی با تعداد عناصر مجموعه ورودی برابر است و فقط ترتیب عناصر ممکن است متفاوت باشد.

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

Page 17: Algorythm Design (5)

1717 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

احتماال می توانیم در هر مرحله یکی از مولفه هایمجموعه جواب را تعیین کنیم.

این ویژگیها مساله به احتمال زیاد به روش حریصانه قابل حل است.

Page 18: Algorythm Design (5)

1818 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

مثال : سه برنامهP1 و P2 و P3 8 با زمان های اجرای زمان ترتیب اجرا6 و 4و

برگشت برنامه اول

زمان برگشت

برنامه دوم

زمان برگشت برنامه سوم

زمان متوسط برگشت

P1 P2 P384 + 86 + 4 + 8

12.7

P1 P3 P286 + 84 + 6 + 8

13.3

P2 P1 P348 + 46 + 8 + 4

11.3

P2 P3 P146 + 48 + 6 + 4

10.7

P3 P1 P268 + 64 + 8 + 6

12.7

P3 P2 P164 + 68 + 4 + 6

11.3

Page 19: Algorythm Design (5)

1919 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

از آنجا که می خواهیم میانگین را مینیمم کنیم، پس باید( را مینیمم کنیم.sumمجموع زمانهای برگشت )

بار در 3زمان اجرای برنامه اول sum ظاهر می شود و بار و زمان اجرای برنامه 2زمان اجرای برنامه دوم،

بار. 1سوم، حدس: برنامه ها را به ترتیب زمان اجرا، بطور غیر

نزولی مرتب کرده و بهمان ترتیب اجرا نماییم. بدین ترتیب برنامه ای که بیشترین تاثیر را درsum ،دارد

برنامه ای خواهد بود که کمترین زمان اجرا را دارد و ....

زمان ترتیب اجرابرگشت

برنامه اول

زمان برگشت

برنامه دوم

زمان برگشت برنامه سوم

مجموع زمان برگشت

Px Py Pzxx + yx + y + z

3x + 2y +z

Page 20: Algorythm Design (5)

2020 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

.درستی این حدس را هم باید اثبات کرد

Page 21: Algorythm Design (5)

2121 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

الگوریتم منطبق بر الگوی روش حریصانهvoid optOrder(float P[], float C[], int n) {

زمان اجرای برنامه ها را شامل می شودPآرایه // خروجی برنامه است که ترتیب اجرای برنامه ها را Cآرایه //

مشخص می کند.

for (int i=0; i<n ; i++)C[i] = selectMin(P, i, n);

} امین i را جستجو کرده و P، آرایه selectMinتابع

امین( i+1کوچکترین عنصر آن را پیدا کرده )در واقع ام آرایه عوض می کند تا در iو جایش را با عنصر

به بعد را جستجو کند. i+1دفعه بعد از خانه

Page 22: Algorythm Design (5)

2222 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

الگوریتمselectMinint selectMin(float P[], int k, int n) {

min = P[k];minIndex = k;for( int i=k+1; i<n; i++)

if (P[i] < min) {min = P[i]; minIndex = i;

}swap P[minIndex] and P[k]return P[k];

}

Page 23: Algorythm Design (5)

2323 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

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

TselectMin(n,i) = n-i-1

T(n, 0) = n-1T(n, 1) = n-2 …T(n, n-1) = 1

Page 24: Algorythm Design (5)

2424 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

محاسبه مرتبه زمانی الگوریتمoptOrder عمل کلیدی: عمل انتسابC[i]

)n(O)n(T

2

n

2

n)n(T

2

n)1n(n)1in(n)n(T

2

2

1n

0i

Page 25: Algorythm Design (5)

2525 روش حریصانه

زمانبندی بهینه اجرای برنامه ها

الگوریتم دیگر با مرتبه زمانی بهتر )منطبق برالگوی روش حریصانه نیست(

void optOrder2( float P[], float C[], int n) {C = descendingSort(P);

} از آنجا که الگوریتم هایی برای مرتب سازی با

وجود داردO(nlogn)مرتبه زمانی پس الگوریتم optOrder2 نیز مرتبه زمانی اش O(n

logn).می باشد ( نکته: الگوریتم قبلیoptOrder را می توان )

یک الگوریتم مرتب سازی مبتنی بر روش حریصانه به حساب آورد.

Page 26: Algorythm Design (5)

2626 روش حریصانه

مطالب مورد بحث

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمPrim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 27: Algorythm Design (5)

2727 روش حریصانه

درخت پوشای مینیمم

:گرافG=(V, E)Vمجموعه گره ها :Eمجموعه یالها :A B

CD

E V = { A, B, C, D, E }

E = { )A,B(, )A,D(, )B,C(, )B,E(, )C, D( }

Page 28: Algorythm Design (5)

2828 روش حریصانه

درخت پوشای مینیمم

گراف جهت دار

V = { A, B, C, D, E }

E = { <A,B>, <D,A>, <D,A>, <B,C>, <B,E>, <D,C> }

A B

CD

E

Page 29: Algorythm Design (5)

2929 روش حریصانه

درخت پوشای مینیمم

گراف وزن دار: گرافی که یالهای آن دارای وزنمی باشند. مفهوم وزن یالها، به اینکه گراف در

چه کاربردی استفاده شده باشد، بستگی دارد. گراف راههای ارتباطی بین شهرها

گره ها: شهرهایالها: جاده هاوزن یالها: طول جاده ها

بین دو گرهu و v مسیری وجود دارد اگر یک یال بین دو گرهu و v موجود باشد. یا یک گرهz موجود باشد که با یک یال به گره u متصل

موجود باشد.v و zباشد و ضمنا مسیری بین دو گره

Page 30: Algorythm Design (5)

3030 روش حریصانه

درخت پوشای مینیمم

( چرخه یا حلقهcycle اگر در یک گراف :)مسیری از یک گره به خودش وجود داشته

باشد، آن گراف دارای حلقه خواهد بود.( گراف متصل یا همبندconnected گرافی :)

که بین هر دو گره دلخواه آن حداقل یک مسیر وجود داشته باشد.

درخت: گراف همبند بدون جهت بدون حلقه زیرگراف: گرافG2=(V2, E2) زیرگراف ،

خواهد بود اگرG1=(V1,E1)گراف V2 شامل تمام گره های V1.باشد E2 زیرمجموعه E1.باشد

Page 31: Algorythm Design (5)

3131 روش حریصانه

درخت پوشای مینیمم

A B

CD

E

A B

CD

E

Gگراف یک زیرگراف از Gگراف

Page 32: Algorythm Design (5)

3232 روش حریصانه

درخت پوشای مینیمم

درخت پوشا اگرG ،یک گراف همبند بدون جهت باشد T یک

است اگرGدرخت پوشا برای T یک زیرگراف از گراف G باشد و T.یک درخت باشد

( درخت پوشای مینیممMST: Minimum Spanning Tree)

اگرG ،یک گراف همبند بدون جهت وزن دار باشد T یک درخت پوشای مینیمم برای Gاست اگر

T یک درخت پوشا برای Gباشد و هزینهT از هزینه تمام درخت های پوشای گراف G کمتر

باشد.

Page 33: Algorythm Design (5)

3333 روش حریصانه

درخت پوشای مینیمم

A B

CD

E

1

3 3 6

4

2 5

یک درخت پوشای غیر

مینیمم برای Gگراف

Gگراف

A B

CD

E

3 6

4

5

Page 34: Algorythm Design (5)

3434 روش حریصانه

درخت پوشای مینیمم

A B

CD

E

1

3

4

2

A B

CD

E

1

3 3 6

4

2 5

Gگراف درخت پوشای مینیمم Gگراف

Page 35: Algorythm Design (5)

3535 روش حریصانه

درخت پوشای مینیمم

یک روش نمایش گراف: ماتریس مجاورت

باO(1) می توان هزینه یال بین دو گره را بدست آورد.

∞13∞∞

1∞63∞

∞6∞45

334∞2

∞∞52∞

A B

CD

E

1

3 3 6

4

2 5

A

B

C

D

E

A B C D E

Page 36: Algorythm Design (5)

3636 روش حریصانه

درخت پوشای مینیمم

مساله: الگوریتمی که گراف همبند بدون را گرفته و درخت پوشای Gجهت وزن دار

مینیمم آن را بدست آورد. الگوریتمPrim و همچنین الگوریتم Kruskal

مبتنی بر روش حریصانه برای حل این مساله طراحی شده اند.

Page 37: Algorythm Design (5)

3737 روش حریصانه

درخت پوشای مینیمم / الگوریتم Prim

روش کلی از آنجا که تمام گره ها باید درMST باشند، ابتدا

یک گره را به دلخواه بعنوان عضو اول مجموعه جواب انتخاب می کنیم. سپس در هر مرحله یک

گره انتخاب نشده را به عنوان عضو بعدی مجموعه جواب انتخاب می کنیم.

در هر مرحله گره ای را انتخاب می کنیم که با کمترین هزینه )وزن

یال( به گره های مجموعه جواب متصل می شود..این گره را به مجموعه جواب اضافه می کنیم

Page 38: Algorythm Design (5)

3838 روش حریصانه

درخت پوشای مینیمم / الگوریتم Prim

افزودن یک یال )بین گره های موجود( 1قضیه :به یک درخت موجب ایجاد حلقه می شود.

اثبات: درختT با n گره موجود است. یال e را به را به هم متصل v و uآن می افزاییم که گره های

در ابتدا، درخت بود بنابراین Tمی کند. از آنجا که موجود بوده است v و uمسیری بین دو گره

متصل v را به u که e(. با افزودن یال p1)مسیر بوجود خواهد آمد v و uمی کند، مسیر دیگری بین

(. p2 در واقع یک مسیر جدید است: e)خود یال ، یک حلقه می باشد.p2 و p1ترکیب دو مسیر

واضح است که یال افزوده شده در حلقه قرار دارد.

Page 39: Algorythm Design (5)

3939 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

G=(V,E) یک گراف همبند، بدون جهت و وزن دار

تعریف: مجموعهF زیرمجموعه E را ، این F( گوییم اگر promisingامیدوارکننده )

منتهی MST(G)قابلیت را داشته باشد که به شود.

یعنی بتوان با افزودن تعدادی از یالهایG ،به آن رسید. Gبه درخت پوشای مینیمم

یعنیF.شامل هیچ یال مزاحمی نباشد

Page 40: Algorythm Design (5)

4040 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

A B

CD

E

1

3 3 6

4

2 5

G

A B

CD

E

1

3

4

2

MST)G(

F={ )B,C(, )A,B( } is not promising

F={ )A,B(, )A,D( } is promising

Page 41: Algorythm Design (5)

4141 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

2قضیه :G=(V,E) گراف همبند بدون جهت و وزن دار است.

:فرضF زیرمجموعه E و ،Y مجموعه گره هایی بهم متصل می شوند. همچنین Fکه توسط یالهای

F.امیدوارکننده است حکم: اگرe کم وزن ترین یالی باشد که یک گره Y

F∪{e} متصل می کند، آنگاه V-Yرا به گره ای در نیز امیدوارکننده خواهد بود.

یعنی با افزودن یالe به F باز هم F این قابلیت را دارد منتهی شود.MST(G)که به

اثبات

Page 42: Algorythm Design (5)

4242 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

الگوریتمprim عمل می کند. 2 بر اساس قضیه ابتداY تنها شامل یک گره می باشد )به دلخواه انتخاب

می شود( درنتیجهF تهی می باشد. )واضح است که F امیدوارکننده

است( ،در هرگام

ابتدا گره های موجود درV-Y را بررسی می کنیم و برای هر ، کم هزینه ترین یالی را که آن گره را به V-Y موجود در iگره

متصل می کند مشخص می کنیم، وزن این یال Yگره ای در نمایش می دهیم. dist(i)را با

سپس گره ای را که دارای کمترینdist می باشد را انتخاب منتقل می کنیم. همچنین یال V-Yکرده و آن را به مجموعه

اضافه می کنیم. Fمربوط به آن را به ادامه می دهیم تاY شامل تمام گره های G.شود

Page 43: Algorythm Design (5)

4343 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

0

1

...

n برای هر گره انتخاب نشده، شمارهنزدیکترین گره انتخاب شده را

مشخص می کند. برای گره های - 1انتخاب شده مقدار این ستون

برای هر گره انتخاب نشده، فاصله می باشد.نزدیکترین گره انتخاب شده را

مشخص می کند. برای گره های انتخاب شده مقدار این ستون ∞

می باشد.

مشخص می کند که آیا گره یعنی 1انتخاب شده یا نه.

یعنی انتخاب 0انتخاب شده و نشده

ساختار مورد استفاده برای انجام عملیات الگوریتم

Page 44: Algorythm Design (5)

4444 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

مثال

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

Page 45: Algorythm Design (5)

4545 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞

10010

200∞

30030

40045

500∞

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه

0

Cost=0

Page 46: Algorythm Design (5)

4646 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞11-1∞20150

30030

40140

50125

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه Cost=10

0 110

Page 47: Algorythm Design (5)

4747 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞11-1∞20515

30520

40140

51-1∞

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه Cost=35

0 110

5

25

Page 48: Algorythm Design (5)

4848 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞11-1∞21-1∞30520

40235

51-1∞

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه Cost=50

0 110

5

25215

Page 49: Algorythm Design (5)

4949 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞11-1∞21-1∞31-1∞40235

51-1∞

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه Cost=70

0 110

5

25215

3 20

Page 50: Algorythm Design (5)

5050 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

YnearminDist

01-1∞11-1∞21-1∞31-1∞41-1∞51-1∞

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های عضو

(Yمجموعه

Cost=105

0 110

5

25

2153 20

4

35

Page 51: Algorythm Design (5)

5151 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

0 1

23

5

10

35

20

4

15 25

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

GMST)G(

Page 52: Algorythm Design (5)

5252 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

محاسبه مرتبه زمانی به روش ذهنی :تعداد گره های گرافn الگوریتم شاملn مرحله است که در هر مرحله یک

گره را انتخاب می کنیم. ،در هر مرحله برای هر گره انتخاب نشدهminDist ،

را مشخص Yیعنی مینیمم فاصله آن گره با گره های می کنیم. برای این کار باید وزن یال بین آن گره و هر

را بررسی کنیم. )برای راحتی کار Yیک از گره های O(n) در نظر می گیریم( nتعداد این گره ها را

سپس باید در بین گره های انتخاب نشده، گره با کمترینminDist .را انتخاب کنیم O(n)

در نهایت الگوریتم از مرتبه زمانیO(n2( می باشد.

Page 53: Algorythm Design (5)

5353 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

روش کلی برای گراف دارایn ،گره MST شامل n-1 یال خواهد

بود )چون درخت است(. یالها را بر حسب وزنشان بطور غیرنزولی مرتب می

کنیم. ابتدا گراف را در قالبn مجموعه که هر یک دارای یک

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

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

در نظر می MSTمی کند، آن را بعنوان یک یال موجود در گیریم و دو مجموعه مربوط به ابتدا و انتهای یال را با هم

ادغام می کنیم. این کار را ادامه می دهیم تاn-1 .یال انتخاب شوند

Page 54: Algorythm Design (5)

5454 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

0 1

23

5

4

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

Sorted list of edges

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Page 55: Algorythm Design (5)

5555 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

0 1

23

5

4

Sorted list of edges0 1

10edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Page 56: Algorythm Design (5)

5656 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

23

5

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

2

5

15

Page 57: Algorythm Design (5)

5757 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

3

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

2

5

15

3

20

5

Page 58: Algorythm Design (5)

5858 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

3

20

5

2

5

15

1

5

25

Page 59: Algorythm Design (5)

5959 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

3

20

5

2

5

15

1

5

25

Page 60: Algorythm Design (5)

6060 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

3

20

5

2

5

15

1

5

25

354

2

Page 61: Algorythm Design (5)

6161 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

4

edgecost

(0,1)10

(2,5)15

(3,5)20

(1,5)25

(0,3)30

(2,4)35

(1,4)40

(0,4)45

(1,2)50

(4,5)55

Sorted list of edges0 1

10

3

20

5

2

5

15

1

5

25

354

2

Cost of MST = 105

Page 62: Algorythm Design (5)

6262 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

شبه کدالگوریتم

m تعداد :یالها

n تعداد گره :ها

void kruskal)int n, int m( {

sortEdges)m(;

selectedEdges = 0;

while)selectedEdges < n-1( {

e = edge with min weight not yet considred;

i , j = source and dest of edge e;

p = findSet)i(; q = findSet)j(;

if ) p != q ( {

merge)p, q(;

add e to selected edges; selectedEdges++;

}}}

Page 63: Algorythm Design (5)

6363 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

مرتبه زمانی برm و nحسب

void kruskal)int n, int m( {

sortEdges)m(;

selectedEdges = 0;

while)selectedEdges < n-1( {

e = edge with min weight not yet considred;

i , j = source and dest of edge e;

p = findSet)i(; q = findSet)j(;

if ) p != q ( {

merge)p, q(;

add e to selected Edges; k++;

}}}

O)m log m(

O)n log n(

Page 64: Algorythm Design (5)

6464 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

W(m,n) = O(n log n) + O(m log m) از آنجا که برای گراف همبندm>=n-1 پس

W(m,n) = O(m log m) ضمنا از آنجا کهn-1≤ m ≤ n(n-1)/2می توان گفت

اگر تعداد یالها به حد پایین یعنیn-1 نزدیک باشد مرتبه میل می کند و اگر تعداد یالها O(n log n)زمانی به سمت

O(n2به سمت حد باال میل کند مرتبه زمانی به سمت logn).میل می کند

با توجه به اینکه مرتبه زمانی الگوریتمprim، O(n2( بود

( هر چه گراف خلوت ترsparse باشد الگوریتم )kruskal بهتر است و هر چه شلوغتر و متصل تر باشد، الگوریتم

prim .بهتر است

Page 65: Algorythm Design (5)

6565 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

مقایسه الگوریتمKruskal و Prim حاصل الگوریتمprim در هر مرحله یک درخت

در هر مرحله kruskalاست ولی حاصل الگوریتم یک جنگل است.

Page 66: Algorythm Design (5)

6666 روش حریصانه

درخت پوشای مینیمم / الگوریتم Kruskal

چرا مرتبه زمانیfindSet و merge را لگاریتمی در نظر گرفتیم؟

با استفاده از ساختمان داده خاصی با نامDisjoint Sets می توان اعمال فوق را طوری

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

Page 67: Algorythm Design (5)

6767 روش حریصانه

مطالب مورد بحث

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمprim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 68: Algorythm Design (5)

6868 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

Single-Source Shortest Path گرافG=(V, E)مفروض است هدف، یافتن کوتاهترین مسیرها از یک گره

مشخص به گره های دیگر می باشد. مثال: گرافG بیانگر شبکه راههای ارتباطی

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

Page 69: Algorythm Design (5)

6969 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1

23

5

10

30 45

35

40

20

55

4

15

50

25

0گره مبدأ: گره

کوتاهترین مسیر از گره 1 به گره 0

کوتاهترین مسیر از گره 2 به گره 0

کوتاهترین مسیر از گره 3 به گره 0

کوتاهترین مسیر از گره 4 به گره 0

کوتاهترین مسیر از گره 5 به گره 0

Page 70: Algorythm Design (5)

7070 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

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

کنیم. اگر گرهv گره مبدأ باشد، واضح است که کوتاهترین

مسیر از این گره تا یک گره دیگر، باید تنها یک لبه را مستقیما به مقصد متصل می کند. vداشته باشد که

S مجموعه گره هایی که کوتاهترین مسیر از گره :v به آنها پیدا شده است.

در ابتداS تنها شامل v .است .اولین کوتاهترین مسیر را مشخص می کنیم سپس در هر مرحله، کوتاهترین مسیر بعدی، ازv

می گذرد و به Sشروع می شود و از گره های داخل گره ای برسد که تا حاال مسیری برای آن پیدا نشده

است.

Page 71: Algorythm Design (5)

7171 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

قضیه: اگر کوتاهترین مسیر بعدی به گرهu شروع شده و می vباشد، آنگاه این مسیر از

u بگذرد و به Sتواند تنها از گره های داخل ختم شود.

اثبات با برهان خلف

Page 72: Algorythm Design (5)

7272 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

الگوریتم دیکسترا مبتنی بر همین ایده

Page 73: Algorythm Design (5)

7373 روش حریصانه

درخت پوشای مینیمم / الگوریتم prim

nodes

Sdistpath

0

1

...

n طول کوتاهترین مسیر فعلی ازمبدأ تا این گره، که فقط از گره

های انتخاب شده می گذرد.

کوتاهترین مسیر فعلی از مبدأ تا طول آن را distاین گره، که

مشخص می کند.

مشخص می کند که آیا گره یعنی 1انتخاب شده یا نه.

یعنی انتخاب 0انتخاب شده و نشده

ساختار مورد استفاده برای انجام عملیات الگوریتم

Page 74: Algorythm Design (5)

7474 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

مثال 0گره مبدأ: گره

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35

Page 75: Algorythm Design (5)

7575 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

گام اول: مقدار دهیاولیه

گام های بعد: تعیین و انتخاب distکوچکترین

گره مربوطه و بروزرسانی سطرهای جدول )برای گره های

انتخاب نشده(

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35

گره های زرد مشخص کننده گره های انتخاب شده هستند )گره های

(Sعضو مجموعه

nodesSdistpath

0100-0

10500-1

20∞0-2

30200-3

40∞0-4

50∞0-5

Page 76: Algorythm Design (5)

7676 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35nodesSdistpath

0100-0

10350-3-1

20∞0-2

31200-3

40320-3-4

50∞0-5

Page 77: Algorythm Design (5)

7777 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35nodesSdistpath

0100-0

10350-3-1

20670-3-4-2

31200-3

41320-3-4

50∞0-5

Page 78: Algorythm Design (5)

7878 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35nodesSdistpath

0100-0

11350-3-1

20600-3-1-2

31200-3

41320-3-4

50∞0-5

Page 79: Algorythm Design (5)

7979 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35nodesSdistpath

0100-0

11350-3-1

21600-3-1-2

31200-3

41320-3-4

50∞0-5

Page 80: Algorythm Design (5)

8080 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

0 1 2

3 5

50

4

25

20 10 15

14

12

1020

15

30

35nodesSdistpath

0100-0

11350-3-1

21600-3-1-2

31200-3

41320-3-4

51∞0-5

Page 81: Algorythm Design (5)

8181 روش حریصانه

کوتاهترین مسیرها از مبدأ واحد

محاسبه مرتبه زمانی عملیات شاملn( مرحله می باشد n تعداد گره های

مرحلهnگراف(، در هر یک از این ابتدا برای هر گره مقدارdist را مشخص می کنیم. برای

قابل انجام است. O(1)هر گره، این کار با مرتبه زمانی برای n گره این کار از مرتبه زمانی O(n) قابل انجام

است. سپس در ستونdist کوچکترین مقدار را مشخص می

کنیم تا گره مربوط به آن را انتخاب کنیم. این کار با قابل انجام است. O(n)مرتبه زمانی

پس هر یک ازn مرحله، با مرتبه زمانی O(n) قابل انجام است.

در نتیجه مرتبه زمانی کل الگوریتمO(n2(.می باشد

Page 82: Algorythm Design (5)

8282 روش حریصانه

مطالب مورد بحث

کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم

الگوریتمprim الگوریتمKruskal

کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman

Page 83: Algorythm Design (5)

8383 روش حریصانه

فشرده سازی با استفاده از کد هافمن

( مفهوم فشرده سازیcompression) به یک روشencoding و یک روش decoding

نیاز داریم. باencryption و decryption.اشتباه نشود

مزیت: صرفه جویی در هزینه ذخیره و ارسال دو روش مختلفencoding

انکدینگ با طول ثابت: کد مربوط به تمام نویسه ها ازنظر طول یکسان می باشند.

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

انکدینگ با طول متغیر: کد مربوط به نویسه هایمختلف ممکن است از نظر طول با هم یکسان نباشند.

Page 84: Algorythm Design (5)

8484 روش حریصانه

فشرده سازی با استفاده از کد هافمن

در روش انکدینگ با طول متغیر ،می توان به نویسه هایی که تکرار بیشتری دارند

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

مشکل اصلی: نیاز به درج جداکننده در زمانانکدینگ

روش هافمن یک روش انکدینگ با طول متغیراست که مشکل فوق را حل کرده است یعنی

نیازی به درج جداکننده ندارد.

Page 85: Algorythm Design (5)

8585 روش حریصانه

فشرده سازی با استفاده از کد هافمن

نویسه8100مثال: متن اولیه شامل حجم متن در سیستم اسکی

بیت 8برای هر نویسه 64800بیت حجم متن در یک سیستم انکدینگ با طول ثابت

بیت کافی است3 نویسه مختلف ، کدی با طول 6برای بیت 3برای هر نویسه 24300بیت

حجم متن با استفاده از روش هافمن (2000*2) + (1000*3) +

(500*4) + (500*4) + (2000*2) + (2100*2) =

19100 bits

تعداد تکرار

نویسه

2000a

1000b

500c

500d

2000e

2100f

کد مربوطه

نویسه

000a

001b

010c

011d

100e

101f

کد مربوطه

تعداد تکرار

نویسه

002000a

1011000b

1000500c

1001500d

012000e

112100f

codebook

Page 86: Algorythm Design (5)

8686 روش حریصانه

فشرده سازی با استفاده از کد هافمن

در روش هافمن کد هیچ نویسه ای، پیشوند کد نویسهدیگری نمی باشد. در نتیجه نیازی به جدا کننده نمی

باشد.( اصطالحا کدها پیشوند-آزاد می باشندprefix-free

code) مثال با استفاده ازcodebook صفحه قبل می توان

متن زیر را دیکد کرد:

Input: 010010001001

Output: eacd

کد مربوطه

نویسه

00a

101b

1000c

1001d

01e

11f

Page 87: Algorythm Design (5)

8787 روش حریصانه

فشرده سازی با استفاده از کد هافمن

روش هافمن برای بدست آوردن کد نویسه هامحاسبه تعداد تکرار یا بسامدتمام نویسه های موجود در متن

یا استفاده از یک برآورد معتبر هر نویسه را بهمراه بسامد آن بعنوان ریشه یک درخت در

نظر می گیریم..پس در حالت اولیه یک جنگل خواهیم داشت

در هر مرحله دو درختی که دارای کمترین بسامد در ریشه می باشند را انتخاب

کرده آن دو درخت را با هم ادغام می کنیم و درخت جدیدی می سازیم که

بسامد ریشه آن مجموع بسامد ریشه های دو درخت می باشد و درختی که بسامد ریشه اس کمتر بوده را زیردرخت چپ و درختی را که بسامد ریشه اش بیشتر بوده را زیردرخت راست قرار می دهیم.

درخت جدید را جایگزین دو درخت اولیه می کنیم. این کار را تا زمانیکه تنها یک درخت باقی بماند ادامه می

دهیم.

a:30 b:10 c:7 d:8 e:40 f:14

Page 88: Algorythm Design (5)

8888 روش حریصانه

فشرده سازی با استفاده از کد هافمن

در درخت حاصل نویسه ها در برگها قرار می گیرند )نشانه پیشوند آزاد

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

و حرکت به راست را معادل 0حرکت به سمت چپ را معادل در نظر می گیریم.1

:برای دیکدینگ یک رشته در ورودی 0از ریشه حرکت می کنیم و با مشاهده هر

در ورودی به سمت 1به سمت چپ و با مشاهده هر راست حرکت می کنیم تا به برگ برسیم و نویسه

موجود در آن برگ را به خروجی اضافه می کنیم و دوباره به ریشه رفته و کار را از آنجا ادامه می دهیم.