E4.pdf

‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫فخاریان‬
‫تمرین چهارم‬
‫ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ‬
‫مسئله ‪-1‬‬
‫روش درهمسازی‬
‫میخواهیم که تابع درهمسازی مناسبی برای صد کلید تعریف کنیم‪ .‬صد کلیدِ داده شده‪ ،‬همگی از الگویِ ‪ Ki = i2+i‬برای‬
‫‪ i = 1,2,…,100‬پیروی میکنند‪ .‬برای درهمسازی از جدولی با اندازهی ‪ m=8‬استفاده میکنیم‪.‬‬
‫ن جستوجوی موفق چقدر خواهد بود؟ زمانِ حذف در‬
‫الف‪ -‬اگر از روش زنجیرهای استفاده کنیم‪ ،‬میانگین زما ِ‬
‫بدترین حالت چقدر میشود؟‬
‫ت ‪( h(k) = k mod m‬روش تقسیم) تعریف کنیم‪ ،‬برخوردها چگونه توزیع خواهد‬
‫ب ‪ -‬اگر تابع درهمسازی را به صور ِ‬
‫شد؟ با قسمت قبل مقایسه کنید‪.‬‬
‫ن برخوردها چه تابعِ درهمسازیِ دیگری پیشنهاد میکنید؟ پیشنهاد خود‬
‫ع مشکلِ پراکندگیِ نامتواز ِ‬
‫ج ‪ -‬برای رف ِ‬
‫را برای ‪ K8 = 72‬نشان دهید‪.‬‬
‫مسئله ‪-2‬‬
‫جدولِ درهمسازی‬
‫ی باز با وارسی خطی‪ ،‬تابع درهمسازی برای جدولی به اندازهی هشت به صورت زیر است‪:‬‬
‫در روش درهمساز ِ‬
‫‪A B C D E F G H‬‬
‫‪1‬‬
‫‪4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪4‬‬
‫‪2‬‬
‫‪6‬‬
‫‪2‬‬
‫‪Key‬‬
‫‪hash‬‬
‫اگر جدول درهمسازی در ابتدا تهی باشد‪ ،‬به چند حالت میتوان این عناصر را در جدول درج کرد تا در نهایت‪ ،‬جدول زیر‬
‫تولید شود‪:‬‬
‫‪0 1 2 3 4 5 6 7‬‬
‫‪G H A C D E B F‬‬
‫مسئله ‪-3‬‬
‫مرتبسازی خطی‬
‫الگوریتمی ارائه دهید که ‪ n‬عدد صحیح از صفر تا ‪ n2-1‬را در )‪ O(n‬مرتب کند‪.‬‬
‫‪i‬‬
‫)‪T(i‬‬
‫مسئله ‪-4‬‬
‫مرتبسازی پیچ و مهره‬
‫‪ n‬عدد پیچ و ‪ n‬عدد مهره‪ ،‬هرکدام با اندازههای متمایز داده شده است‪ .‬میدانیم که دقیقا یک عدد از پیچها به یک عدد از‬
‫مهرهها میخورد و بنابراین یک تناظر بینِ هر پیچ با مهرهی هماندازهاش وجود دارد‪ .‬تنها کار مجاز‪ ،‬انتخاب یک عدد پیچ‬
‫و یک عدد مهره و آزمون این دو با هم است تا مشخص شود که که آیا به هم میخورند و یا اینکه کدام یک از دیگری‬
‫کوچکتر است‪.‬‬
‫الگوریتمی ارائه دهید که در )‪ O(nlgn‬آزمون‪ ،‬پیچها و مهرههای متناظر را بیابد‪.‬‬
‫مسئله ‪-5‬‬
‫مرتبسازیِ کمینه‬
‫الف ‪ -‬الگوریتمی ارائه کنید که با دریافت یک دنبالهی ‪ n‬عضوی‪ ،‬بزرگترین زیردنبالهی صعودیِ پیوسته را در )‪O(n‬‬
‫پیدا کند‪.‬‬
‫ب ‪ -‬با استفاده از الگوریتمِ خود در قسمت قبل‪ ،‬یک دنباله از اعداد را با کمترین تعدا ِد حرکت مرتب کنید‪ .‬در هر‬
‫ی دیگر دنباله قرار دهید‪.‬‬
‫مرحله تنها میتوانید یک عدد را انتخاب و در جا ِ‬
‫مسئله ‪-6‬‬
‫مرتبسازی خاص‬
‫آرایهی ‪n‬تایی ‪ A‬با اعداد متمایز ‪ 1‬تا ‪ n‬پر شده است‪ .‬الگوریتم زیر برای مرتبکردن آرایه پیشنهاد شده است‪:‬‬
‫{)‪void Mysort(int A[], int n‬‬
‫; ‪int t, i‬‬
‫)‪for (i=1; i<=n; i++‬‬
‫{)‪while (A[i] != i‬‬
‫; ]‪t = A[i‬‬
‫; ]]‪A[i] = A[A[i‬‬
‫; ‪A[t] = t‬‬
‫}‬
‫}‬
‫الف‪ -‬برای اثباتِ درست بودن یک الگوریت ِم مرتبسازی‪ ،‬چه گزارههایی را باید اثبات کرد؟‬
‫ب‪ -‬نشان دهید این الگوریتم درست کار میکند‪.‬‬
‫ج‪ -‬زمان اجرای این الگوریتم را تحلیل کنید‪.‬‬