HW3_Solution.pdf

‫ساختمان دادهها و الگوریتمها‬
‫نیم سال دوم ‪93-92‬‬
‫دانشکده مهندسی کامپیوتر‬
‫تمرین سوم‬
‫مدرس‪ :‬دکتر جمزاد‬
‫پشته‪ ،‬صف و مقدمات درخت‬
‫تاریخ ‪ 23 :‬اسفند‬
‫سوال ‪:1‬‬
‫صف ‪ Q‬که شامل ‪ N‬عنصر است با کمک دو پشتهی ‪ s1‬و ‪ s2‬ساخته شدهاست‪.‬‬
‫(آ) چند بار ‪ PUSH‬برای درج یک عنصر به صف الزم هست؟‬
‫(ب) فرض کنید بدین صورت مساله را در نظر میگیریم که برای درج یک عنصر در انتهای صف باید )‪ PUSH(S1‬و برای‬
‫حذف یک عنصر از ابتدای صف در صورتی که پشتهی دوم خالی نباشد باید )‪ POP(S2‬را انجام دهیم وگرنه همه عناصر‬
‫پشتهی اول را ‪ POP‬نموده و در پشتهی دوم وارد مینماییم‪ ،‬حال عمل ‪ POP‬بر روی پشتهی دوم عنصر ابتدایی صف را باز‬
‫میگرداند که جواب میباشد‪ .‬در ابتدا با استفاده از تحلیل سرشکن ‪ Aggregate Method‬ثابت کنید که هزینهی دو کار‬
‫قیدشده در باال برابر )‪ O(1‬است؟‬
‫اگر بر روی صف که در ابتدا خالی میباشد ‪ 200‬عمل صورت گیرد مثل درج در ابتدا و حذف از انتها حداکثر هزینه به چه‬
‫صورت است؟‬
‫حل‪( :‬آ) ‪2N+1‬‬
‫(ب) ‪ PUSH = 199 , POP = 199+1 TOTAL = 399‬هزینه های مرتبط با هر یک از عناصر حداکثر ‪ 4‬خواهد‬
‫بود )‪PUSH(S1) POP(S1) PUSH(S2)POP(S2‬‬
‫کران باالی هزینههای واقعی از ‪ N‬عملیات ‪ T(N) = 4N‬خواهدشد لذا هزینهی استهالک برابر )‪T(N)/N = 4 = O(1‬‬
‫سوال ‪:2‬‬
‫برای استفاده از لیست پیوندی تک سویه‪ ،‬انتظار داریم در آن دور وجود نداشته باشد‪ .‬اما ممکن است یک لیست پیوندی‬
‫درست ایجاد نشده باشد و در آن دور وجود داشتهباشد‪ .‬می خواهیم پیش از شروع کار با یک لیست پیوندی تشخیص دهیم که‬
‫در آن دور وجود دارد یا خیر‪ .‬الگوریتمی با پیچیدگی زمانی )‪ O(n‬و پیچیدگی حافظه )‪ O(1‬ارائه دهید که این کار را انجام‬
‫دهد‪.‬‬
‫حل‪ :‬از دو متغیر ‪ count‬و ‪ pointer‬استفاده میکنیم‪ .‬از ابتدای لیست پیوندی شروع به جلو رفتن در لیست میکنیم و‬
‫تعداد حرکتها را نیز در متغیر ‪ count‬نگه می داریم‪ .‬اگر پس از یک حرکت به انتهای لیست رسیدیم اعالم میکنیم که‬
‫لیست دور ندارد‪ .‬پس از هر حرکت‪ ،‬اگر مقدار ‪ count‬توانی از دو بود‪ ،‬اشارهگر به خانهی فعلی لیست را در ‪ pointer‬نگه‬
‫میداریم‪ .‬اگر در هر مرحلهای وارد خانهای شدیم که ‪ pointer‬به آن اشاره میکند اعالم میکنیم که لیست دور دارد‪.‬‬
‫‪1‬‬
‫سوال ‪.3‬‬
‫دو پشتهی ‪ S1‬و ‪ S2‬به شما داده شدهاست‪ .‬در پشتهی ‪ ،S1‬اعداد ‪ 1‬تا ‪ n‬به ترتیب قرار قرار گرفتهاند و پشتهی ‪ S2‬در ابتدا‬
‫خالی است‪ .‬میخواهیم اعداد پشتهی ‪ S1‬به همین ترتیب در ‪ S2‬قرار بگیرند‪ .‬برای این کار تنها مجازیم در هر مرحله یکی از‬
‫این اعمال را انجام دهیم‪:‬‬
‫‪‬‬
‫عنصر باالی ‪ S1‬را خارج کنیم و در باالی ‪ S2‬وارد کنیم‪.‬‬
‫‪‬‬
‫عنصر باالی ‪ S2‬را خارج کنیم و در باالی ‪ S1‬وارد کنیم‪.‬‬
‫‪‬‬
‫عناصر باالی دو پشته را جابهجا کنیم‪.‬‬
‫روشی برای انجام این کار ارائه کنید‪.‬‬
‫حل‪ :‬سه عمل گفتهشده در صورت سوال را ‪ Op2 ،Op1‬و ‪ Swap‬مینامیم‪ .‬تابع بازگشتی )‪ k ،transfer(k‬عنصر باالی‬
‫پشتهی ‪ 1‬را به همان ترتیب که هستند‪ ،‬به باالی پشتهی ‪ 2‬منتقل میکند‪ .‬بنابراین کافیاست )‪ transfer(n‬را اجرا کنیم تا‬
‫عناصر به همان ترتیب که در پشتهی ‪ 1‬بودند‪ ،‬در پشتهی ‪ 2‬قرار بگیرند‪.‬‬
‫سوال ‪.4‬‬
‫با شبه کد‪ ،‬یک پیاده سازی (از هر مرتبه زمانی) ارائه دهید که با کمک یک صف و حداکثر )‪ O(1‬حافظهی اضافی‪ ،‬داده‬
‫ساختار پشته را شبیهسازی کند‪ .‬فرض کنید در صف تنها اعمال ‪ Enqueue‬و ‪ Dequeue‬پیادهسازی شدهاند و باید توابع‬
‫‪ Top ،Pop ،Push‬و ‪ Size‬را برای پشته پیادهسازی کنید‪.‬‬
‫حل‪ :‬از یک صف به نام ‪ Q‬استفاده میکنیم و در یک متغیر به نام ‪ size‬تعداد عناصر موجود در صف را نگه میداریم‪:‬‬
‫‪2‬‬
‫سوال ‪.5‬‬
‫ترتیب میانوندی )‪ (LVR‬درخت دودویی با ترتیب پیشوندی )‪ (VLR‬و پسوندی )‪ (LRV‬زیر که هر گره دارای دو فرزند‬
‫است را همراه با نمایش درخت مربوطه بیابید‪:‬‬
‫‪A C M I L K H G B J F E P O D :LRV‬‬
‫‪L K I H M G C F P O E J D B A :VLR‬‬
‫حل‪ :‬به راحتی با توجه به دو عبارت داده شده ریشه ‪ A‬و زیر درخت چپ و راست مشخص هست‬
‫درخت ‪:‬‬
‫))‪A(B(DJ(E(OP)F))C(GM(NI(KL‬‬
‫‪LVR: D B O E P J F A G C H M K I L‬‬
‫سوال ‪.6‬‬
‫تعداد درختان دودویی متوازنی که با ارتفاع برابر ‪ H‬و با ‪ M‬عنصر میتوان ساخت را بیابید‪:‬‬
‫)‪H = floor (lg M‬‬
‫حل‪ :‬درخت پری که با حذف برگ های این درخت بدست میآید دارای ارتفاع ‪،H-1‬‬
‫با اضافه نمودن برگ ها به تعداد‬
‫حداقل ‪ 1‬و حداکثر‬
‫گره و‬
‫برگ است پس‬
‫(– ‪ M‬به آن‪ ،‬درخت بدست میآید ‪.‬در ارتفاع ‪ H‬درخت به علت متوازن بودن‬
‫برگ دارد لذا تعداد حاالتی که بدست میآید برابر‬
‫‪3‬‬
‫است‪.‬‬