Upload
vahidvs
View
312
Download
0
Embed Size (px)
Citation preview
روش حریصانهGreedy Method
طراحی الگوریتم ها - دانشگاه فردوسی مشهد - صمد پایدار
22 روش حریصانه
مطالب مورد بحث
مقدمهبررسی چند مساله نمونه
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمPrim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
33 روش حریصانه
مقدمه
،در مسائلی که به این روش حل می شوندمعموال:
.ورودی مساله شامل مجموعه ای از عناصر است خروجی مساله شامل مجموعه ای از عناصر است که
بیشتر مواقع، زیرمجموعه ورودی مساله می باشد. علیرغم استفاده از لفظ مجموعه، ممکن است ترتیب عناصر
مجموعه جواب، مهم باشد..موضوع بهینگی مطرح است
یعنی حل مساله، مستلزم انتخاب زیرمجموعه ای از مجموعهعناصر ورودی می باشد که تابع هدف مساله را بهینه می
نمایند. .جواب را می توان بصورت مرحله به مرحله بدست آورد
)در هر مرحله یک مولفه جواب را بدست آورد(مثال: خرد کردن اسکناس
44 روش حریصانه
مقدمه
کلیات روش حریصانه.در ابتدا مجموعه جواب را تهی در نظر می گیریم:بطور مرحله به مرحله عمل می کنیم. در هر مرحله
از بین عناصر ممکن که می توانیم بعنوان عنصر بعدیمجموعه جواب انتخاب کنیم، بهترین عنصر را در نظر می
گیریم. بررسی می کنیم آیا با انتخاب آن مولفه، امکان رسیدن به
جواب وجود دارد یا خیر..اگر بله: آن مولفه را به مجموعه جواب اضافه می کنیم اگر خیر: آن مولفه را به مجموعه جواب اضافه نمی کنیم و آن را
برای همیشه کنار می گذاریم. با افزودن هر عنصر به مجموعه جواب، بررسی می کنیم اگر
جواب مساله حاصل شده است، جواب بدست آمده بهینه خواهد بود و کار تمام است.
.بنابراین با بدست آوردن اولین جواب کار تمام می شود
55 روش حریصانه
مقدمه
یک الگوریتم حریصانه باید بطور صریح یاضمنی دارای این اجزا باشد:
قسمتی برای انتخاب مولفه بعدی جواب از بیننامزدهای ممکن
قسمتی برای تعیین اینکه آیا با انتخاب مولفه جدید)بهمراه عناصری که تا کنون انتخاب شده
اند(امکان رسیدن به جواب وجود دارد یا خیر.قسمتی برای تعیین میزان ارزش مجموعه جواب قسمتی برای بررسی اینکه آیا مجموعه عناصر
انتخاب شده، جواب مساله را تولید کرده است یا کار باید ادامه پیدا کند.
66 روش حریصانه
مطالب مورد بحث
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمPrim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
77 روش حریصانه
کوله پشتی غیر صفر و یک
.تعدادی شیء و یک کوله پشتی داریم شیءi دارای وزن wi و ارزش pi.می باشد ظرفیت وزنی کوله پشتی برابرM.می باشد هدف: اشیا را برای قرار دادن در داخل کوله پشتی
انتخاب کنیم، بگونه ای که ضمن رعایت ظرفیت وزنی کوله پشتی، مجموع ارزش اشیای انتخاب
شده، ماکزیمم گردد. .امکان انتخاب کسری از هر شیء نیز وجود دارد
واحد انتخاب می xi به میزان iبنابراین از هر شیء (xi ≤1 ≥ 0کنیم. )
اگر اینطور نباشد، یعنی یا باید یک شیء را بطور کاملانتخاب کنیم یا اصال آن را انتخاب نکنیم. در اینصورت،
مساله به مساله کوله پشتی صفر و یک تبدیل خواهد شد.
88 روش حریصانه
کوله پشتی غیر صفر و یک
xp maximizen
1iii
n
1iii Mxw subject to
بیان ریاضی :تعداد اشیاn0 ≤ xi ≤ 1
99 روش حریصانه
کوله پشتی غیر صفر و یک
:حدس چون ارزش اشیا تاثیر مثبت دارد و می خواهیم
مجموع ارزش اشیای انتخاب شده را ماکزیمم کنیم، پس بهتر است اشیا را به ترتیب بیشترین ارزش
انتخاب کنیم. چون وزن اشیا تاثیر منفی دارد و می خواهیم کوله
پشتی دیرتر پر شود، پس بهتر است اشیا را به ترتیب کمترین وزن انتخاب کنیم.
چون ارزش اشیا تاثیر مثبت و وزن اشیا تاثیر منفی pi/wiدارد، بهتر است اشیا را به ترتیب بیشترین
انتخاب کنیم. در هر صورت، کوله پشتی را تا حداکثر ظرفیت پر
می کنیم، مگر آنکه اشیا تمام شوند.
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
1111 روش حریصانه
کوله پشتی غیر صفر و یک
.درستی این حدس را باید اثبات کنیم
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;}}}
1313 روش حریصانه
کوله پشتی غیر صفر و یک
محاسبه مرتبه زمانی ورودی: لیست وزن و ارزش اشیای ورودی و
Mمقدار اندازه ورودی: تعداد اشیای ورودی یعنیn عمل کلیدی: مقایسهW[i] با rc :تابع پیچیدگی
W(n) = n + WpwSort(n) WpwSort(n) = O(n logn)
W)n( = O)n logn(
1414 روش حریصانه
کوله پشتی غیر صفر و یک
الگوریتم منطبق بر الگوی روش حریصانه میباشد.
اثبات درستی
1515 روش حریصانه
مطالب مورد بحث
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمPrim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
1616 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
تعدادی برنامه با زمان اجرای معلوم موجود است. میخواهیم برنامه ها را به ترتیبی اجرا کنیم که زمان
متوسط برگشت آنها مینیمم گردد.( زمان برگشتturnaround time مدت سپری شده ،)
از زمان تحویل برنامه به کامپیوتر تا پایان اجرای آن می باشد.
ویژگیهای مساله ورودی مجموعه ای از عناصر است )مجموعه زمان اجرای
برنامه ها( خروجی مجموعه ای از عناصر است. در این مثال تعداد
عناصر مجموعه خروجی با تعداد عناصر مجموعه ورودی برابر است و فقط ترتیب عناصر ممکن است متفاوت باشد.
مساله بهینه سازی مطرح است: کمینه کردن متوسط زمانبرگشت
1717 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
احتماال می توانیم در هر مرحله یکی از مولفه هایمجموعه جواب را تعیین کنیم.
این ویژگیها مساله به احتمال زیاد به روش حریصانه قابل حل است.
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
1919 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
از آنجا که می خواهیم میانگین را مینیمم کنیم، پس باید( را مینیمم کنیم.sumمجموع زمانهای برگشت )
بار در 3زمان اجرای برنامه اول sum ظاهر می شود و بار و زمان اجرای برنامه 2زمان اجرای برنامه دوم،
بار. 1سوم، حدس: برنامه ها را به ترتیب زمان اجرا، بطور غیر
نزولی مرتب کرده و بهمان ترتیب اجرا نماییم. بدین ترتیب برنامه ای که بیشترین تاثیر را درsum ،دارد
برنامه ای خواهد بود که کمترین زمان اجرا را دارد و ....
زمان ترتیب اجرابرگشت
برنامه اول
زمان برگشت
برنامه دوم
زمان برگشت برنامه سوم
مجموع زمان برگشت
Px Py Pzxx + yx + y + z
3x + 2y +z
2020 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
.درستی این حدس را هم باید اثبات کرد
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دفعه بعد از خانه
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];
}
2323 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
محاسبه مرتبه زمانی الگوریتمselectMinعمل کلیدی: عمل مقایسه
TselectMin(n,i) = n-i-1
T(n, 0) = n-1T(n, 1) = n-2 …T(n, n-1) = 1
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
2525 روش حریصانه
زمانبندی بهینه اجرای برنامه ها
الگوریتم دیگر با مرتبه زمانی بهتر )منطبق برالگوی روش حریصانه نیست(
void optOrder2( float P[], float C[], int n) {C = descendingSort(P);
} از آنجا که الگوریتم هایی برای مرتب سازی با
وجود داردO(nlogn)مرتبه زمانی پس الگوریتم optOrder2 نیز مرتبه زمانی اش O(n
logn).می باشد ( نکته: الگوریتم قبلیoptOrder را می توان )
یک الگوریتم مرتب سازی مبتنی بر روش حریصانه به حساب آورد.
2626 روش حریصانه
مطالب مورد بحث
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمPrim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
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( }
2828 روش حریصانه
درخت پوشای مینیمم
گراف جهت دار
V = { A, B, C, D, E }
E = { <A,B>, <D,A>, <D,A>, <B,C>, <B,E>, <D,C> }
A B
CD
E
2929 روش حریصانه
درخت پوشای مینیمم
گراف وزن دار: گرافی که یالهای آن دارای وزنمی باشند. مفهوم وزن یالها، به اینکه گراف در
چه کاربردی استفاده شده باشد، بستگی دارد. گراف راههای ارتباطی بین شهرها
گره ها: شهرهایالها: جاده هاوزن یالها: طول جاده ها
بین دو گرهu و v مسیری وجود دارد اگر یک یال بین دو گرهu و v موجود باشد. یا یک گرهz موجود باشد که با یک یال به گره u متصل
موجود باشد.v و zباشد و ضمنا مسیری بین دو گره
3030 روش حریصانه
درخت پوشای مینیمم
( چرخه یا حلقهcycle اگر در یک گراف :)مسیری از یک گره به خودش وجود داشته
باشد، آن گراف دارای حلقه خواهد بود.( گراف متصل یا همبندconnected گرافی :)
که بین هر دو گره دلخواه آن حداقل یک مسیر وجود داشته باشد.
درخت: گراف همبند بدون جهت بدون حلقه زیرگراف: گرافG2=(V2, E2) زیرگراف ،
خواهد بود اگرG1=(V1,E1)گراف V2 شامل تمام گره های V1.باشد E2 زیرمجموعه E1.باشد
3131 روش حریصانه
درخت پوشای مینیمم
A B
CD
E
A B
CD
E
Gگراف یک زیرگراف از Gگراف
3232 روش حریصانه
درخت پوشای مینیمم
درخت پوشا اگرG ،یک گراف همبند بدون جهت باشد T یک
است اگرGدرخت پوشا برای T یک زیرگراف از گراف G باشد و T.یک درخت باشد
( درخت پوشای مینیممMST: Minimum Spanning Tree)
اگرG ،یک گراف همبند بدون جهت وزن دار باشد T یک درخت پوشای مینیمم برای Gاست اگر
T یک درخت پوشا برای Gباشد و هزینهT از هزینه تمام درخت های پوشای گراف G کمتر
باشد.
3333 روش حریصانه
درخت پوشای مینیمم
A B
CD
E
1
3 3 6
4
2 5
یک درخت پوشای غیر
مینیمم برای Gگراف
Gگراف
A B
CD
E
3 6
4
5
3434 روش حریصانه
درخت پوشای مینیمم
A B
CD
E
1
3
4
2
A B
CD
E
1
3 3 6
4
2 5
Gگراف درخت پوشای مینیمم Gگراف
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
3636 روش حریصانه
درخت پوشای مینیمم
مساله: الگوریتمی که گراف همبند بدون را گرفته و درخت پوشای Gجهت وزن دار
مینیمم آن را بدست آورد. الگوریتمPrim و همچنین الگوریتم Kruskal
مبتنی بر روش حریصانه برای حل این مساله طراحی شده اند.
3737 روش حریصانه
درخت پوشای مینیمم / الگوریتم Prim
روش کلی از آنجا که تمام گره ها باید درMST باشند، ابتدا
یک گره را به دلخواه بعنوان عضو اول مجموعه جواب انتخاب می کنیم. سپس در هر مرحله یک
گره انتخاب نشده را به عنوان عضو بعدی مجموعه جواب انتخاب می کنیم.
در هر مرحله گره ای را انتخاب می کنیم که با کمترین هزینه )وزن
یال( به گره های مجموعه جواب متصل می شود..این گره را به مجموعه جواب اضافه می کنیم
3838 روش حریصانه
درخت پوشای مینیمم / الگوریتم Prim
افزودن یک یال )بین گره های موجود( 1قضیه :به یک درخت موجب ایجاد حلقه می شود.
اثبات: درختT با n گره موجود است. یال e را به را به هم متصل v و uآن می افزاییم که گره های
در ابتدا، درخت بود بنابراین Tمی کند. از آنجا که موجود بوده است v و uمسیری بین دو گره
متصل v را به u که e(. با افزودن یال p1)مسیر بوجود خواهد آمد v و uمی کند، مسیر دیگری بین
(. p2 در واقع یک مسیر جدید است: e)خود یال ، یک حلقه می باشد.p2 و p1ترکیب دو مسیر
واضح است که یال افزوده شده در حلقه قرار دارد.
3939 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
G=(V,E) یک گراف همبند، بدون جهت و وزن دار
تعریف: مجموعهF زیرمجموعه E را ، این F( گوییم اگر promisingامیدوارکننده )
منتهی MST(G)قابلیت را داشته باشد که به شود.
یعنی بتوان با افزودن تعدادی از یالهایG ،به آن رسید. Gبه درخت پوشای مینیمم
یعنیF.شامل هیچ یال مزاحمی نباشد
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
4141 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
2قضیه :G=(V,E) گراف همبند بدون جهت و وزن دار است.
:فرضF زیرمجموعه E و ،Y مجموعه گره هایی بهم متصل می شوند. همچنین Fکه توسط یالهای
F.امیدوارکننده است حکم: اگرe کم وزن ترین یالی باشد که یک گره Y
F∪{e} متصل می کند، آنگاه V-Yرا به گره ای در نیز امیدوارکننده خواهد بود.
یعنی با افزودن یالe به F باز هم F این قابلیت را دارد منتهی شود.MST(G)که به
اثبات
4242 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
الگوریتمprim عمل می کند. 2 بر اساس قضیه ابتداY تنها شامل یک گره می باشد )به دلخواه انتخاب
می شود( درنتیجهF تهی می باشد. )واضح است که F امیدوارکننده
است( ،در هرگام
ابتدا گره های موجود درV-Y را بررسی می کنیم و برای هر ، کم هزینه ترین یالی را که آن گره را به V-Y موجود در iگره
متصل می کند مشخص می کنیم، وزن این یال Yگره ای در نمایش می دهیم. dist(i)را با
سپس گره ای را که دارای کمترینdist می باشد را انتخاب منتقل می کنیم. همچنین یال V-Yکرده و آن را به مجموعه
اضافه می کنیم. Fمربوط به آن را به ادامه می دهیم تاY شامل تمام گره های G.شود
4343 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
nodes
YnearminDist
0
1
...
n برای هر گره انتخاب نشده، شمارهنزدیکترین گره انتخاب شده را
مشخص می کند. برای گره های - 1انتخاب شده مقدار این ستون
برای هر گره انتخاب نشده، فاصله می باشد.نزدیکترین گره انتخاب شده را
مشخص می کند. برای گره های انتخاب شده مقدار این ستون ∞
می باشد.
مشخص می کند که آیا گره یعنی 1انتخاب شده یا نه.
یعنی انتخاب 0انتخاب شده و نشده
ساختار مورد استفاده برای انجام عملیات الگوریتم
4444 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
مثال
0 1
23
5
10
30 45
35
40
20
55
4
15
50
25
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
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
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
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
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
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
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(
5252 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
محاسبه مرتبه زمانی به روش ذهنی :تعداد گره های گرافn الگوریتم شاملn مرحله است که در هر مرحله یک
گره را انتخاب می کنیم. ،در هر مرحله برای هر گره انتخاب نشدهminDist ،
را مشخص Yیعنی مینیمم فاصله آن گره با گره های می کنیم. برای این کار باید وزن یال بین آن گره و هر
را بررسی کنیم. )برای راحتی کار Yیک از گره های O(n) در نظر می گیریم( nتعداد این گره ها را
سپس باید در بین گره های انتخاب نشده، گره با کمترینminDist .را انتخاب کنیم O(n)
در نهایت الگوریتم از مرتبه زمانیO(n2( می باشد.
5353 روش حریصانه
درخت پوشای مینیمم / الگوریتم Kruskal
روش کلی برای گراف دارایn ،گره MST شامل n-1 یال خواهد
بود )چون درخت است(. یالها را بر حسب وزنشان بطور غیرنزولی مرتب می
کنیم. ابتدا گراف را در قالبn مجموعه که هر یک دارای یک
گره می باشند در نظر می گیریم. یالها را از ابتدای لیست مرتب، یکی یکی بررسی می
کنیم. در هر مرحله اگر یال مورد بررسی دو مجموعه جدا از هم را به هم متصل
در نظر می MSTمی کند، آن را بعنوان یک یال موجود در گیریم و دو مجموعه مربوط به ابتدا و انتهای یال را با هم
ادغام می کنیم. این کار را ادامه می دهیم تاn-1 .یال انتخاب شوند
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
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
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
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
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
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
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
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
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++;
}}}
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(
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 .بهتر است
6565 روش حریصانه
درخت پوشای مینیمم / الگوریتم Kruskal
مقایسه الگوریتمKruskal و Prim حاصل الگوریتمprim در هر مرحله یک درخت
در هر مرحله kruskalاست ولی حاصل الگوریتم یک جنگل است.
6666 روش حریصانه
درخت پوشای مینیمم / الگوریتم Kruskal
چرا مرتبه زمانیfindSet و merge را لگاریتمی در نظر گرفتیم؟
با استفاده از ساختمان داده خاصی با نامDisjoint Sets می توان اعمال فوق را طوری
پیاده سازی نمود که مرتبه زمانی لگاریتمی داشته باشند.
6767 روش حریصانه
مطالب مورد بحث
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمprim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
6868 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
Single-Source Shortest Path گرافG=(V, E)مفروض است هدف، یافتن کوتاهترین مسیرها از یک گره
مشخص به گره های دیگر می باشد. مثال: گرافG بیانگر شبکه راههای ارتباطی
شهرهای کشور باشد، هدف یافتن کوتاهترین مسیر از تهران به دیگر شهرها می باشد.
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
7070 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
:ایده اصلی مسیرها را به ترتیب از کوتاهترین به بلندترین، پیدا
کنیم. اگر گرهv گره مبدأ باشد، واضح است که کوتاهترین
مسیر از این گره تا یک گره دیگر، باید تنها یک لبه را مستقیما به مقصد متصل می کند. vداشته باشد که
S مجموعه گره هایی که کوتاهترین مسیر از گره :v به آنها پیدا شده است.
در ابتداS تنها شامل v .است .اولین کوتاهترین مسیر را مشخص می کنیم سپس در هر مرحله، کوتاهترین مسیر بعدی، ازv
می گذرد و به Sشروع می شود و از گره های داخل گره ای برسد که تا حاال مسیری برای آن پیدا نشده
است.
7171 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
قضیه: اگر کوتاهترین مسیر بعدی به گرهu شروع شده و می vباشد، آنگاه این مسیر از
u بگذرد و به Sتواند تنها از گره های داخل ختم شود.
اثبات با برهان خلف
7272 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
الگوریتم دیکسترا مبتنی بر همین ایده
7373 روش حریصانه
درخت پوشای مینیمم / الگوریتم prim
nodes
Sdistpath
0
1
...
n طول کوتاهترین مسیر فعلی ازمبدأ تا این گره، که فقط از گره
های انتخاب شده می گذرد.
کوتاهترین مسیر فعلی از مبدأ تا طول آن را distاین گره، که
مشخص می کند.
مشخص می کند که آیا گره یعنی 1انتخاب شده یا نه.
یعنی انتخاب 0انتخاب شده و نشده
ساختار مورد استفاده برای انجام عملیات الگوریتم
7474 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
مثال 0گره مبدأ: گره
0 1 2
3 5
50
4
25
20 10 15
14
12
1020
15
30
35
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
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
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
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
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
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
8181 روش حریصانه
کوتاهترین مسیرها از مبدأ واحد
محاسبه مرتبه زمانی عملیات شاملn( مرحله می باشد n تعداد گره های
مرحلهnگراف(، در هر یک از این ابتدا برای هر گره مقدارdist را مشخص می کنیم. برای
قابل انجام است. O(1)هر گره، این کار با مرتبه زمانی برای n گره این کار از مرتبه زمانی O(n) قابل انجام
است. سپس در ستونdist کوچکترین مقدار را مشخص می
کنیم تا گره مربوط به آن را انتخاب کنیم. این کار با قابل انجام است. O(n)مرتبه زمانی
پس هر یک ازn مرحله، با مرتبه زمانی O(n) قابل انجام است.
در نتیجه مرتبه زمانی کل الگوریتمO(n2(.می باشد
8282 روش حریصانه
مطالب مورد بحث
کوله پشتی غیر صفر و یکزمانبندی بهینه اجرای برنامه هادرخت پوشای مینیمم
الگوریتمprim الگوریتمKruskal
کوتاهترین مسیرها از مبدأ واحد فشرده سازی با استفاده از کدHuffman
8383 روش حریصانه
فشرده سازی با استفاده از کد هافمن
( مفهوم فشرده سازیcompression) به یک روشencoding و یک روش decoding
نیاز داریم. باencryption و decryption.اشتباه نشود
مزیت: صرفه جویی در هزینه ذخیره و ارسال دو روش مختلفencoding
انکدینگ با طول ثابت: کد مربوط به تمام نویسه ها ازنظر طول یکسان می باشند.
در سیستمASCII بیت در نظر گرفته شده 8 برای هر کاراکتر است.
انکدینگ با طول متغیر: کد مربوط به نویسه هایمختلف ممکن است از نظر طول با هم یکسان نباشند.
8484 روش حریصانه
فشرده سازی با استفاده از کد هافمن
در روش انکدینگ با طول متغیر ،می توان به نویسه هایی که تکرار بیشتری دارند
کد کوتاهتری نسبت داد تا در مجموع میزان فشرده سازی افزایش یابد.
مشکل اصلی: نیاز به درج جداکننده در زمانانکدینگ
روش هافمن یک روش انکدینگ با طول متغیراست که مشکل فوق را حل کرده است یعنی
نیازی به درج جداکننده ندارد.
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
8686 روش حریصانه
فشرده سازی با استفاده از کد هافمن
در روش هافمن کد هیچ نویسه ای، پیشوند کد نویسهدیگری نمی باشد. در نتیجه نیازی به جدا کننده نمی
باشد.( اصطالحا کدها پیشوند-آزاد می باشندprefix-free
code) مثال با استفاده ازcodebook صفحه قبل می توان
متن زیر را دیکد کرد:
Input: 010010001001
Output: eacd
کد مربوطه
نویسه
00a
101b
1000c
1001d
01e
11f
8787 روش حریصانه
فشرده سازی با استفاده از کد هافمن
روش هافمن برای بدست آوردن کد نویسه هامحاسبه تعداد تکرار یا بسامدتمام نویسه های موجود در متن
یا استفاده از یک برآورد معتبر هر نویسه را بهمراه بسامد آن بعنوان ریشه یک درخت در
نظر می گیریم..پس در حالت اولیه یک جنگل خواهیم داشت
در هر مرحله دو درختی که دارای کمترین بسامد در ریشه می باشند را انتخاب
کرده آن دو درخت را با هم ادغام می کنیم و درخت جدیدی می سازیم که
بسامد ریشه آن مجموع بسامد ریشه های دو درخت می باشد و درختی که بسامد ریشه اس کمتر بوده را زیردرخت چپ و درختی را که بسامد ریشه اش بیشتر بوده را زیردرخت راست قرار می دهیم.
درخت جدید را جایگزین دو درخت اولیه می کنیم. این کار را تا زمانیکه تنها یک درخت باقی بماند ادامه می
دهیم.
a:30 b:10 c:7 d:8 e:40 f:14
8888 روش حریصانه
فشرده سازی با استفاده از کد هافمن
در درخت حاصل نویسه ها در برگها قرار می گیرند )نشانه پیشوند آزاد
بودن(. کد هر نویسه در مسیر ریشه تا آن نویسه نهفته است
و حرکت به راست را معادل 0حرکت به سمت چپ را معادل در نظر می گیریم.1
:برای دیکدینگ یک رشته در ورودی 0از ریشه حرکت می کنیم و با مشاهده هر
در ورودی به سمت 1به سمت چپ و با مشاهده هر راست حرکت می کنیم تا به برگ برسیم و نویسه
موجود در آن برگ را به خروجی اضافه می کنیم و دوباره به ریشه رفته و کار را از آنجا ادامه می دهیم.