الگوریتم برنامه نویسی چیست؟
توضیح کوتاهی درباره الگوریتم برنامه نویسی
امروزه همهی دنیا دیجیتالی شده است. یک حس هوشمندی وجود دارد، یک احساس ارتباط در هر وسیله سنتی وجود دارد که زندگی ما را خیلی آسان، خیلی سریع میکند. همه این پیشرفتهای فناوری توسط نرم افزاری انجام میشود که مجموعهای از برنامهها برای حل یک مشکل است. و هر برنامه براساس یک منطق / راهحل ساخته شده است که به عنوان الگوریتم (الگوریتم برنامه نویسی) خوانده میشود.
اولین فردی که الگوریتم برنامه نویسی را به جهان معرفی کرد، دانشمند ایرانی به نام محمد بن موسی خوارزمی بود که در دورهی عباسیان زندگی میکرد. در ادامه همراه ما باشید.
الگوریتم برنامه نویسی چیست؟
الگوریتم برنامه نویسی روشی یا فرمولی است که برای حل مسئله استفاده میشود. برای مثال شما با یک مسئله در ریاضی روبرو شدهاید که باید با استفاده از یک فرمول و راه حل مشکل آن مسئله را حل کنید تنها کاری که میکنید این است که با استفاده از سادهترین راه ممکن برای حل آن مسئله تلاش میکنید که در نتیجه میتوانید آن مسئله ریاضی را حل کنید.
کار الگوریتم برنامه نویسی هم به همین صورت است هنگامی که رایانه با مشکلی برخورد کند، الگوریتم مانند همان راهحل عمل میکند و از سادهترین راهها برای حل مشکل استفاده میکند. یک الگوریتم با پیروی از روال متشکل از ورودیها کار میکند. هنگامی که الگوریتم همهی ورودیها را دنبال کرد، نتیجهای را مشاهده میکند که به آن خروجی نیز گفته میشود.
نکته: الگوریتمها با دریافت سلسله ورودیهای مختلفی، اقداماتی مطابق خواسته ما انجام میدهد.
الگوریتم در برنامه نویسی چگونه کار میکند؟
میبینید که کامپیوتر اساساً ریاضیات زیادی را انجام میدهد، به این معنی که مشکلات زیادی برای حل کردن وجود دارد. دقیقاً به همین دلیل است که الگوریتمها قلب علم کامپیوتر را تشکیل میدهند. الگوریتم رایانه روشی محاسباتی است که مجموعهای از ورودی را میگیرد و با استفاده از برخی ریاضیات و منطق آن را به خروجی تبدیل میکند.
چندین الگوریتم در برنامه نویسی وجود دارد که عبارتند از:
- تعریف کردن مسئله
- جمعآوری اطلاعات (داده)
- پردازش اطلاعات (داده)
- استفاده از رویکرد منطقی
- حل مسئله (راهحل)
یکی از جنبههای مهمی که باید در مورد الگوریتمهای برنامهنویسی بدانید این است که الگوریتمها در برنامهنویسی به هیچ عنوان محدود نیستند و راهحلهای مختلفی را برای خروجی بهتر ارائه میدهند. حوزه الگوریتم برنامهنویسی به قدری گسترده و عمیق شده است که میتواند در هر مورد و نظریه محاسباتی به ما کمک کند و راهحلهای بسیار کارآمدی را به ما ارائه دهد.
ساختار الگوریتم برنامه نویسی چیست؟
ساختار الگوریتمهای برنامهنویسی براساس منطق به سه دسته تقسیم میشود که شامل:
الگوریتم شاخهای (Branching)
این الگوریتم با توجه به قانون جالب اگر-آنگاه در ریاضیات کار میکند. به این صورت که ما شرط را تعیین کردیم، پاسخ و نتیجه مسئله با توجه به شرط ما محاسبه و تعیین میشود.
الگوریتم دنبالهای (Sequence)
در این الگوریتم ساختار به شکل مرحله به مرحله جلو میرود و راهحلی برای حل مسئله تعیین میکند.
الگوریتم حلقهای (Loop)
به الگوریتمهای حلقهای، الگوریتمهای تکراری نیز میگویند. ساختار این الگوریتم به این شکل است که در یک پروژه از دفعات مشخصی استفاده میکند تا یک مسئله را حل کند و در آخر با تموم شدن مراحل پروژه، کار این الگوریتم نیز پایان مییابد.
به طور کلی الگوریتم ها نقش بسیار مهم و اساسی را در برنامهنویسی و حل مسائل مختلف رایانهای ایفا میکنند. الگوریتم ها با توجه به نوع مسئله تغییر میکنند و هر مسئلهای با الگوریتم و قواعد خاص خود موجب حل مسئله میشود.
مشخصات الگوریتم برنامه نویسی چیست؟
الگوریتم در برنامه نویسی مشخصات و ساختار منطقی دارد که براساس همان ساختار شروع به حل مسائل میکند این مشخصات عبارتند از:
- دقت: مراحل و توضیحات در الگوریتم با دقت بیان شده است
- منحصر به فرد: نتایج هر مرحله بصورت منحصر به فرد تعریف میشود که فقط به ورودی و نتیجه مراحل قبل بستگی دارد.
- پایانپذیری: الگوریتم پس از اجرای تعداد محدود دستورالعمل متوقف میشود.
- ورودی: دریافت ورودی
- خروجی: تولید خروجی متناسب با ورودی مورد نظر
- Generality: ساخت الگوریتمی متناسب با ورودی
مشخصاتی که در موارد بالا ذکر کردیم، مشخصات یک الگوریتم برنامه نویسی است.
چگونگی چرخه زندگی الگوریتم برنامه نویسی
بیایید کمی با چرخه عمر یک الگوریتم برنامه نویسی آشنا شویم که به شرح زیر است:
- طراحی: با استفاده از روشهای مختلف میتوان انواع طراحیها را به وجود آورد.
- اثبات درستی: در این حالت باید مشخص کنیم که آیا الگوریتم به درستی کار میکند یا خیر؛ به این معنی که با دادن ورودی مناسب، خروجی مناسب را نیز دریافت کنیم.
- تحلیل کردن: مشخص کردن پیچیدگی و حالت فضایی الگوریتم
- پیادهسازی مسائل: با استفاده از یک زبان برنامهنویس، مسئله خود را پیادهسازی کنید.
- تست کردن برنامه: برای درستی برنامه، برنامه را تست کنید به دو روش: اشکالزدایی و اندازهگیری نرم افزار
آشنایی با انواع الگوریتم برنامه نویسی با توجه به نوع مسئله
همانطور که گفتیم الگوریتمها انواع مختلفی دارند که با یکدیگر به بررسی آنان میپردازیم. مثال های الگوریتم برنامه نویسی عبارتند از:
الگوریتم بازگشتی
به الگوریتمهای بازگشتی اصطلاح حالت پایه نیز بکار میرود. در این الگوریتم base case مسئله حل میشود و در ادامه به حل مسائل تودرتو پرداخته میشود. در اصل میتوانیم بگوییم که این الگوریتم مسائل را به قطعات کوچکتر تقسیم میکند و با حل کردن هر کدام به سراغ مسئله بعدی میرود.
یکی از معروفترین مسائل الگوریتم بازگشتی، مسئله فاکتوریل (factorial) میباشد. در کدی که در زیر شرح میدهیم If x is 0 به عنوان حالت پایه قرار میگیرند:
Fact(x) If x is 0 return 1 return (x*Fact(x-1))
الگوریتم دینامیک
از الگوریتمهای دینامیک و پویا برای محاسبههای مسائل پیشرفته که در آینده اتفاق میافتد، استفاده میکنند. به این معنی که از حل مسائل مختلف و بدست آوردن پاسخ آنان میتوان مسائل دیگر را حل کرد. دنباله فیبوناچی یکی از این موارد است که از الگوریتم دینامیک استفاده میکند:
Fib(n) if n=0 return 0 else prev_Fib=0,curr_Fib=1 repeat n-1 times /*if n=0 it will skip*/ next_Fib=prev_Fib+curr_Fib prev_Fib=curr_Fib curr_Fib=new_Fib return curr_Fib
الگوریتم برگشت به عقب
الگوریتم عقبگرد یا بازگشت به عقب، به الگوریتمی گفته میشود که به دنبال پیامهای مختلف امیدبخشی که به بهبود حل یک مسئله کمک میکرد، میگردد. الگوریتمهای عقبگرد از انواع مختلفی نماد استفاده میکنند که نشان میدهند مسئله مورد نظر قابل حل است یا خیر.
برای مثال برای ساخت درخت فضای حالت یک سوال، اگر جوابی برای یکی از شاخههای درخت وجود نداشته باشد یا نتوان آن را به صورت بهینه پاسخ داد توسط الگوریتم عقبگرد علامتگذاری میشود تا در عمق زیاد بررسی نشود و وقت بر روی سوالات دیگر که قابل حل شدن هستند گذاشته شود.
البته آن شاخه کنار گذاشتهایم کاملا هرس یا از بین نمیرود بلکه زمانی که پاسخی مناسب برای آن سوال پیدا شود این الگوریتم به سراغ حل آن میرود.
الگوریتم تقسیم و حل
الگوریتم حل و تقسیم اول به نوع مسئله دقت میکنند بعد آن را به قطعات کوچکتر تبدیل میکنند تا بتوانند راحتتر آن (مسئله) را حل کنند از جوابهای آن قطعات مسئله جواب اصلی تعیین میشود. روشهای مرتبسازی مانند: مرتبسازی ادغامی (Merge Sort) و مرتبسازی سریع (Quick Sort) در این نوع الگوریتم گنجانده میشوند.
الگوریتم حریصانه
این نوع الگوریتم همانطور که از نامش پیداست همیشه به دنبال بهترین و سریعترین راه برای حل مسائل میگردد. کار این الگوریتم تا زمانی ادامه مییابد تا به بهینهترین جواب ممکن برای حل مسئله دست پیدا کند. البته که برخی مسائل هستند هیچگاه برای آنان پاسخی بهینه یافت نمیشود که به این مسائل NP complete میگویند.
مثالی که میتوانیم برای الگوریتم حریصانه بکار ببریم مسئله خرد کردن سکه و پول است. این مسئله به این صورت است که به شما مقداری پول میدهند و شما باید آن را به خردترین حالت ممکن تبدیل کنید. هر بار که شما برای حل یک مسئله از الگوریتم حریصانه استفاده کنید تابع selection cheek اتفاق میافتد.
الگوریتم بروت فورس
این الگوریتم همانند دیگر الگوریتمها به دنبال بهترین پاسخ و بهینهترین جواب میگردد. از این الگوریتم بیشتر برای حل مسائل کوچک استفاده میکنند. در این نوع الگوریتم تمامی کلیدها مورد بررسی قرار میگیرد که این کار بیشتر در عمل رمزگشایی بکار میرود. در داده کاوی از الگوریتم بروت فورس استفاده میکنند.
الگوریتمهای برنامهنویسی پرکاربرد کداماند؟
الگوریتمهایی که بسیار مورد استفاده قرار میگیرند عبارتند از:
الگوریتم جست و جوی دودویی
این الگوریتم در دسته الگوریتم تقسیم و حل قرار میگیرد. که به دو روش کار خود را انجام میدهد.
الگوریتم مرتبسازی ادغامی
در این نوع الگوریتم نیز مسائل به دو صورت حل میشوند. یا بصورت جداگانه هر مسئله حل میشود یا اینکه هر مسئله با ترکیب با دیگر مسئله، جواب مورد نظر را کشف میکند.
الگوریتم مرتبسازی سریع
در این الگوریتم از الگوریتم عقب گرد نیز استفاده میکند. این الگوریتم مسائل را به دو صورت:
- عناصر کوچکتر از عنصر اصلی
- عناصر بزرگتر از عنصر اصلی
کروسکال
این الگوریتم در دسته الگوریتم حریصانه قرار میگیرد.
چگونه با گوشی برنامه نویسی کنیم
کلام آخر
در کل الگوریتم برنامه نویسی بسیاری هستند که در علم کامپیوتر و ریاضی مورد استفاده قرار میگیرند که در این مقاله به صورت مختصر به آنان اشاره کردیم. اهمیت الگوریتمها بیشتر برای برنامهنویسان بک-اند (back end) بسیار است زیرا آنان ملزم به دانستن و تسلط کامل بر روی این الگوریتمها هستند تا بتوانند برنامههای متناسب با آنان را ایجاد کنند.
از پیش نیازهای یادگیری برنامهنویسی میتوان به فلوچارتها و الگوریتمها اشاره کرد. این نکته را نیز به یاد داشته باشید که حتما برای استفاده و نوشتن از الگوریتمها به مراحل آن دقت کافی را داشته باشید و مراحل را پشت سرهم انجام دهید تا به مشکلی برخورد نکنید.