nafise sadeghi
14th November 2008, 10:24 PM
بهینه سازی
مباحث بهینه سازی مباحث پیچیده ای بوده و ختم کلام در این مباحث اصولاً ممکن نیست. در این تعادل تنها چند نکته که از لحاظ دستور زبانی به کمک بهبود سرعت اجرای برنامه می آید بیان می کنیم. مابقی بهینه سازی شامل تحلیلهای مرتبه زمان اجراhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/23175924df5332e1464c12b636eb8dc0.png به بخش طراحی الگوریتم واگذار می شود.
اولین اصل حذر از هر گونه عبارت شرطی است. به این معنا که حتی المقدور از شرط ها استفاده نکنید مثلاً در مورد محاسبه ماکزیمم و مینیمم دو عدد. فرض کنید که تابع قدر مطلق به روشی پیاده سازی شده:
http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/bf454c6c170c951b777fa69bab23a8f8.png
برای اینکه ایده ای از پیاده سازی قدر مطلق بدون استفاده از عبارات شرطی داشته باشید، روش زیر را در مورد اعداد صحیح و نمایش " مکمل دو" برای اعداد منفی در نظر بگیرید.
sb:=n and $ 80000000
;sb:=sb shr 31
hn:=sb*$ FFFFFFFF
;n:=(n-sb)* or hn
فرض کنید کهhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/ffa27e4ac6f325ba68a67856106e88dd.png همه اعداد 32 بیتی صحیح هستند. کل عملیات بالا باعث می شود محتویاتhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/f120302f595acc3d7b0e4b5b7c4320d5.pngدر انتهای کار قدر مطلقhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/f120302f595acc3d7b0e4b5b7c4320d5.pngدر ابتدای کار باشند.
یک نکته در این گونه صرفه جوئیها در پیچیدگی نتیجه شده از این روش است نکته دوم این است که ممکن است چیزی که جای شرط جایگزین می کنید آنقدر طولانی شود که خود شرط سریعتر اجرا شود.
به هر حال در مورد بالا می توان بدون بکار بردن شرط http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a538e5b82934d950c67a0aba1cd93ae7.png را محاسبه کرد.
نکته دوم عبارات منطقی است. نتیجه عبارت منطقیhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/42c5fa63bdf63e9e5a677753a254b2ef.png اگرhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.png ناصحیح باشد کلا ناصحیح است مستقل از اینکه http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a039f91bc9ab539dc76f71c9795aecb5.png چه باشد. http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/45b409228e5c859aa6123ef4a0a21a80.pngدر محاسبه مقادیر منطقی از این نکته استفاده کرده و اگر اولین عنصر در http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/1e37a00f44519241346ce0e921eb10b7.png صفر و یا اولین عنصر http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a262fe2945e30dc226b9d8a295c6fa8c.png یک باشد باقی عبارت بررسی نمی شود یعنی در محاسبه
http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/101630f2b562dfeb31ef0e01aec6d189.png
اگرhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.pngغلط باشد دیگر http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/45b409228e5c859aa6123ef4a0a21a80.png بقیه عبارت را محاسبه نمی کند. بنابراین در هنگام نوشتن اینگونه شرط ها دقت کنید ساده ترین بخش محاسبه در ابتدای عملhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/1e37a00f44519241346ce0e921eb10b7.pngقرار گیرد. یک مثال خوب عبارت گفته شده است محاسبه درستی یا غلطی بسیار ساده تر از عبارت سمت راست است لذا http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.pngدر سمت چپ نوشته شده.
در نهایت استفاده از متغیرهای تابعی در جای خود بسیار مفید است. مثلاً در نظر بگیرید که یک تابع دو متغیره دارید:
http://daneshnameh.roshd.ir/mavara/img/daneshnameh_up/7/72/mco0133a.gif
که بصورت بالا تعریف می شود. حال اگر تابع فوق در زیر برنامه ای بصورت زیر بکار رفته باشد.
مباحث بهینه سازی مباحث پیچیده ای بوده و ختم کلام در این مباحث اصولاً ممکن نیست. در این تعادل تنها چند نکته که از لحاظ دستور زبانی به کمک بهبود سرعت اجرای برنامه می آید بیان می کنیم. مابقی بهینه سازی شامل تحلیلهای مرتبه زمان اجراhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/23175924df5332e1464c12b636eb8dc0.png به بخش طراحی الگوریتم واگذار می شود.
اولین اصل حذر از هر گونه عبارت شرطی است. به این معنا که حتی المقدور از شرط ها استفاده نکنید مثلاً در مورد محاسبه ماکزیمم و مینیمم دو عدد. فرض کنید که تابع قدر مطلق به روشی پیاده سازی شده:
http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/bf454c6c170c951b777fa69bab23a8f8.png
برای اینکه ایده ای از پیاده سازی قدر مطلق بدون استفاده از عبارات شرطی داشته باشید، روش زیر را در مورد اعداد صحیح و نمایش " مکمل دو" برای اعداد منفی در نظر بگیرید.
sb:=n and $ 80000000
;sb:=sb shr 31
hn:=sb*$ FFFFFFFF
;n:=(n-sb)* or hn
فرض کنید کهhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/ffa27e4ac6f325ba68a67856106e88dd.png همه اعداد 32 بیتی صحیح هستند. کل عملیات بالا باعث می شود محتویاتhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/f120302f595acc3d7b0e4b5b7c4320d5.pngدر انتهای کار قدر مطلقhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/f120302f595acc3d7b0e4b5b7c4320d5.pngدر ابتدای کار باشند.
یک نکته در این گونه صرفه جوئیها در پیچیدگی نتیجه شده از این روش است نکته دوم این است که ممکن است چیزی که جای شرط جایگزین می کنید آنقدر طولانی شود که خود شرط سریعتر اجرا شود.
به هر حال در مورد بالا می توان بدون بکار بردن شرط http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a538e5b82934d950c67a0aba1cd93ae7.png را محاسبه کرد.
نکته دوم عبارات منطقی است. نتیجه عبارت منطقیhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/42c5fa63bdf63e9e5a677753a254b2ef.png اگرhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.png ناصحیح باشد کلا ناصحیح است مستقل از اینکه http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a039f91bc9ab539dc76f71c9795aecb5.png چه باشد. http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/45b409228e5c859aa6123ef4a0a21a80.pngدر محاسبه مقادیر منطقی از این نکته استفاده کرده و اگر اولین عنصر در http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/1e37a00f44519241346ce0e921eb10b7.png صفر و یا اولین عنصر http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/a262fe2945e30dc226b9d8a295c6fa8c.png یک باشد باقی عبارت بررسی نمی شود یعنی در محاسبه
http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/101630f2b562dfeb31ef0e01aec6d189.png
اگرhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.pngغلط باشد دیگر http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/45b409228e5c859aa6123ef4a0a21a80.png بقیه عبارت را محاسبه نمی کند. بنابراین در هنگام نوشتن اینگونه شرط ها دقت کنید ساده ترین بخش محاسبه در ابتدای عملhttp://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/1e37a00f44519241346ce0e921eb10b7.pngقرار گیرد. یک مثال خوب عبارت گفته شده است محاسبه درستی یا غلطی بسیار ساده تر از عبارت سمت راست است لذا http://daneshnameh.roshd.ir/mavara/img/daneshnameh/math/228e3eeba15cdb0d41b35645991ca153.pngدر سمت چپ نوشته شده.
در نهایت استفاده از متغیرهای تابعی در جای خود بسیار مفید است. مثلاً در نظر بگیرید که یک تابع دو متغیره دارید:
http://daneshnameh.roshd.ir/mavara/img/daneshnameh_up/7/72/mco0133a.gif
که بصورت بالا تعریف می شود. حال اگر تابع فوق در زیر برنامه ای بصورت زیر بکار رفته باشد.