جهانی که ما در آن زندگی میکنیم، جهانی مبتنی بر فناوریست ولی متاسفانه ما نحوه عملکرد بیشتر فناوریها را به درستی نمیدانیم، در این میان حوزه مهمی وجود دارد که با کمی تفکر، قادر به درک عملکرد آن هستیم. این شاخه مهم و کاربردی این روزهای دنیای فناوری، برنامهنویسی نام دارد.
پیشنهاد مقاله: زندگی روزمره یک برنامهنویس به چه صورتی است: خوب، بد، و زشت
برنامهنویسی تنها یک شغل نیست
بسیاری از مردم برنامهنویسی را یک دانش فنی میدانند، اما برنامهنویسی هنر تبدیل مفاهیم پیچیده ذهنی به موضوعات ملموس دنیای واقعی است. به بیان دقیقتر، برنامهنویسی، مشکلات دنیای واقعی را حل میکند. نرمافزارهایی مثل بسته آفیس که روزانه از آن استفاده میکنیم، یک مثال روشن در این زمینه هستند.
نرمافزاری مثل ورد، این روزها جای ماشینهای تایپ قدیمی را گرفته و ضمن صرفهجویی در هزینهها به همه مردم امکان میدهد که برای انجام فعالیتهای روزمره از آن استفاده کنند. بر مبنای این توصیف باید بگوییم که برنامهنویس کدی را برای کامپیوتر مینویسد و کامپیوتر با استفاده از دستورالعملهای تعریف شده، وظایفی را انجام میدهد. این وظایفی نیز قرار است مسئلهای را حل کنند.
حال اگر به یک مرحله قبلتر از برنامهنویسی برویم به مفهومی میرسیم که الگوریتم نام دارد. مجموعه دستورالعملهایی که به کامپیوتر اعلام میدارند مسائل را چگونه حل کند الگوریتم نام دارد. هنگامی که کامپیوتر خود را روشن میکنید، مجموعه دستورالعملهایی شیوه روشن شدن یا به اصطلاح بوت شدن را تعریف میکنند.
الگوریتم واژهای با کاربردهای چندگانه
واژه الگوریتم میتواند برای توصیف هر مجموعه دستورالعملی فراتر از دنیای برنامهنویسی یا فناوری مورد استفاده قرار گیرد. به طور مثال، شما برای پختن یک کیک بر مبنای مجموعه دستورالعملهای مرتب و گام به گام حرکت میکنید تا بتوانید کیکی را آماده کنید.
مبنای عملکرد تمامی نرمافزارها الگوریتم است.
بدون وجود الگوریتم هیچ کامپیوتر یا گوشی هوشمندی وجود نمیداشت و مجبور بودیم بازهم از روشهای سنتی کاغذ و قلم برای نوشتن مطالب خود استفاده کنیم.
پیشنهاد مقاله: آیا برای یادگیری برنامهنویسی شرط سنی خاصی وجود دارد؟
چرا دانستن الگوریتم مهم است؟
الگوریتم، عنوان مهمی در علوم کامپیوتر است، زیرا به توسعهدهندگان نرمافزار در ساخت برنامههای کارآمد و بدون خطا کمک میکند. مهمترین چیزی که در مورد الگوریتمها باید به خاطر بسپارید این است که الگوریتمهای مختلفی برای حل یک مشکل وجود دارد، اما برخی از آنها مؤثرتر از بقیه هستند.
الگوریتمی یا توانایی تعریف گامهای واضح برای حل یک مسئله، در بسیاری از صنایع نقش حیاتی دارد. حتی اگر از آن آگاه نباشیم، همیشه از الگوریتمها و تفکر الگوریتمی در انجام کارهای مختلف استفاده میکنیم.
تفکر الگوریتمی به دانشآموزان اجازه میدهد تا مسائل را تجزیه کرده و راهحلها را بر اساس مراحل مشخصی مفهومسازی کنند. توانایی درک و پیادهسازی یک الگوریتم مستلزم آن است که دانشآموزان تفکر ساختاریافته و تواناییهای استدلال را تمرین کنند.
در هنگام یادگیری برنامهنویسی، مفاهیم و اصول زیربنایی وجود دارد که اهمیت زیادی در دنیای برنامهنویسی دارند. به طوری که در صورت عدم آشنایی با این مفاهیم، ممکن است یادگیری برنامه نویسی به چالش بزرگی برای شما تبدیل شود.
الگوریتم در برنامه نویسی یکی از این اصول زیربنایی مهم است که میتواند فرآیند برنامه نویسی را تسهیل کند. به بیان سادهتر، الگوریتم در برنامه نویسی نوعی دستورالعمل است که کامپیوترها برای حل مسائل از آنها استفاده میکنند.
الگوریتم در برنامهنویسی دستورالعملی به مراحل و گامهای اجرایی اشاره دارد که جهت عملکرد درست برنامه و رسیدن به هدف اصلی مورد استفاده قرار میگیرند. در دنیای الگوریتمها یکسری مفاهیم کلیدی وجود دارد. بهطور مثال، رویه یا Procedure ، روال انجام کارها را مشخص میکند و ورودیها (Input) اطلاعاتی هستند که قرار است پردازش شوند.
الگوریتمها در هر بخشهای مختلف علوم کامپیوتر استفاده میشوند و ستون فقرات این علم را شکل میدهند. همانگونه که اشاره شد، در علم کامپیوتر، یک الگوریتم مجموعهای از دستورالعملها است که به کامپیوتر اجازه میدهد هر کاری را انجام دهد و هر برنامهای را اجرا کند.
همه برنامههای کامپیوتری بزرگ در هسته خود الگوریتمهایی دارند که ترتیب اجرای دستورات را شرح میدهد.
بد نیست بدانید که الگوریتمهای کامپیوتری نقش بزرگی در عملکرد مطلوب شبکههای اجتماعی دارند: به طوری که مشخص میکنند کدام پستها باید نمایش داده شوند، کدام تبلیغات به چه کاربرانی نمایش داده شوند و غیره.
این تصمیمات همه توسط الگوریتمها گرفته میشود. علاوه بر این، گوگل از الگوریتمهایی برای بهینه سازی جستوجوها، پیشبینی اینکه کاربران قرار است چه چیزی تایپ کنند و موارد دیگر استفاده میکند.
در حل یک مسئله، بخش بزرگی از برنامه نویسی کامپیوتر، دانستن نحوه فرمولبندی یک الگوریتم است.
برنامههای کامپیوتری برای انجام کاری که قرار است انجام دهند، وظایف را بر مبنای رویکردی که رویه (Procedure) نام دارد، انجام میدهند و سپس با استفاده از ورودیها، نتایجی تولید میکند که به آنها خروجی (Output) گفته میشود.
به طور کلی، الگوریتم در برنامه نویسی شرح میدهد که چگونه برنامهها باید اجرا شوند و کامپیوتر در هر بار اجرای برنامه، همان روند الگوریتم را انجام خواهد داد.
نکته مهمی که باید در مورد الگوریتمها به آن دقت کنید این است که الگوریتمها وابسته به ترکیب نحوی هیچ زبانی نیستند و هنگامی که نوشته میشوند باید به زبانی تبدیل شوند که برای کامپیوتر قابل فهم باشند.
همچنین به این نکته دقت کنید که الگوریتمها بر مبنای زبان محاورهای که خودمان صحبت میکنیم، نوشته میشوند.
الگوریتم در برنامه نویسی دارای پیچیدگی خاصی نیست. همه الگوریتمها چهار مولفه زیر را دارند.
- ورودی: همه الگوریتمها ورودیهایی دریافت میکنند و کاری روی آنها انجام میدهند.
- پردازش: در الگوریتمها پردازشی روی دادهها انجام میشود.
- خروجی: همه الگوریتمها خروجیهایی دارند، حتی اگر خروجی به شکل عینی و ملموس قابل مشاهده نباشد.
- قطعیت: الگوریتمها با هدف انجام وظیفه یا کار مشخصی نوشته میشوند.
به طور کلی، الگوریتم شامل بخشهای شروع، میانه و پایانی است.
به بیان دقیقتر، میتوان اولین مرحله مرحله الگوریتم را شروع یا Start و آخرین مرحله را پایان یا End نامگذاری کرد. این مراحل بستگی به عملیاتی دارند که برنامه قرار است انجام دهد. تمام مراحل الگوریتم در برنامهنویسی و وظایفی که باید انجام شوند، باید واضح و صریح باشند تا هر کسی با خواندن آن بتواند دستورالعمل عملکردی برنامه را متوجه شود.
استفاده از الگوریتم در برنامه نویسی همیشه منجر به خلق یک راهحل میشود و تا حد امکان سعی میشود کارآمدترین راهحل برای برنامه مورد استفاده قرار گیرد. برخی برنامهنویسان هنگام نوشتن الگوریتم از تکنیک شمارهگذاری استفاده میکنند، البته اجباری برای این کار وجود ندارد، اما خواندن الگوریتم را دقیقتر میکند.
برخی از افراد به جای شمارهگذاری مراحل الگوریتم در برنامه نویسی از تورفتگی و شبهکد (Pseudocode) استفاده میکنند. شبهکد یک زبان نیمه برنامهنویسی است که برای توصیف مراحل یک الگوریتم استفاده میشود. همچنین، برخی از افراد برای طراحی الگوریتم خود از نمودارهایی به نام فلوچارت (Flowchart) استفاده میکنند.
پیشنهاد مقاله: داستان فردی که توانست با حضور در بوتکمپ، برنامهنویس حرفهای شود
کاربرد الگوریتمها در محاسبات
بد نیست بدانید، قبل از آنکه کامپیوترها وجود داشته باشند، الگوریتمها پدید آمدند. با این حال، پس از ابداع کامپیوترها، الگوریتمها نقش پر رنگتری در دنیای ما بازی کردند و در قلب محاسبات قرار گرفتند.
الگوریتمها در ابتدا به طور جدی برای حل مسائل مرتبسازی توسعه داده شدند، اما امروزه در پروژههای مختلفی مثل ژنوم انسان گرفته، پردازش حجم عظیمی از دادههای وبسایتها و غیره از الگوریتمها استفاده میشود.
برخی پژوهشگران بر این باور هستند که آینده از آن الگوریتمهاست، زیرا در حقیقت، این الگوریتمها هستند که در قلب فناوریهای قدرتمندی مثل هوش مصنوعی و علم داده (Data Science) قرار دارند. الگوریتمها قلب تپنده فناوریهایی مثل یادگیری خودکار یا به تعبیری یادگیری ماشین (Machine Learning) هستند.
در پس فناوریهایی مانند دستیاران مجازی و اتومبیلهای خودران نیز الگوریتمها قرار دارند. موارد مذکور، تنها چند نمونه از کاربردهای الگوریتمها در دنیای واقعی است. به همین دلیل است که برخی پژوهشگران معتقد هستند آینده از آن الگوریتمها است.
الگوریتمها چه ویژگیهای شاخصی دارند؟
درست است که برای انجام برخی کارها از یک دستوالعمل واحد استفاده نمیشود، اما اصول یکسان و استانداردی برای آمادهسازی دستوالعملها وجود دارند. نکته مهمی که باید در مورد الگوریتمها به آن دقت کنید این است که در دنیای برنامهنویسی از یک الگوریتم واحد و یکسان در ارتباط با همه برنامهها استفاده نمیشود، اما اصول و رویکرد خاصی برای طراحی الگوریتمها وجود دارد که باید در هنگام نوشتن به آنها دقت کنید. این اصول به شرح زیر هستند:
- واضح و صریح بودن: وجود الگوریتم در تمامی پروژههای بزرگ ضروری است. به همین دلیل باید واضح و صریح باشد.
- تعریف مناسب ورودیها: اگر قرار است الگوریتم در برنامهنویسی ورودی دریافت کند، این ورودیها باید به خوبی تعریف شوند.
- تعریف مناسب خروجیها: الگوریتم باید به طور واضح مشخص کند چه چیزی قرار است در خروجی برنامه، ظاهر شود.
- متناهی بودن: الگوریتم یک باید به صورت متناهی باشد. برای ساخت الگوریتمها نمیتوان از حلقههای بینهایت استفاده کرد.
- قطعیت: الگوریتم در برنامهنویسی باید ساده، کلی و کاربردی باشد تا بتوان به راحتی و با استفاده از منابع موجود آن را پیادهسازی کرد. علاوه بر این، الگوریتم نباید اشاره به فناوریهایی داشته باشد که خاصمنظوره هستند.
مستقل از زبان: طراحی الگوریتم باید به صورت مستقل از زبان انجام شود، به این معنا که تنها شامل یک دستورالعمل ساده باشد که بتوان آن را با استفاده از هر زبان برنامه نویسی پیادهسازی کرد و خروجی که ارائه میکند در همه زبانهای برنامه نویسی یکسان باشد.
نوشتن الگوریتم در برنامهنویسی چه مزایایی به همراه دارد؟
هنگامی که پروژهای بر مبنای الگوریتمها نوشته میشود، مزایای شاخصی پیدا میکند که از مهمترین آنها به موارد زیر باید اشاره کرد:
- استفاده از الگوریتم روند ساخت برنامههای کاربردی را ساده میکند.
- الگوریتم در برنامهنویسی نمایش مراحل یک راهحل برای رسیدن به پاسخ را نشان میدهد.
- در الگوریتم، مسئله به بخشهای کوچکتر تقسیم میشود که باعث میشود تبدیل الگوریتم به یک برنامه واقعی به فرآیند سادهای تبدیل شود.
با اینحال، نوشتن الگوریتم دردسرهایی نیز دارد که از آن جمله به موارد زیر باید اشاره کرد:
- نوشتن و طراحی الگوریتم نیازمند صرف زمان زیادی است.
- نمایش عباراتی که حاوی حلقهها و انشعاب در برنامه هستند، در هنگام نوشتن الگوریتم کار سختی است.
مجتمع دانش و فناوری بامداد ارائه میکند: بوتکمپ برنامهنویسی سی شارپ
فرآیند تحلیل الگوریتم به چه صورتی انجام میشود؟
عملکرد و کارکرد الگوریتم در برنامهنویسی در قالب دو مرحله قبل و بعد از پیادهسازی محاسبه میشود. فرآیند انجام اینکار به شرح زیر است:
تجزیه و تحلیل پیشین (Priori Analysis): این مرحله به شکل تئوری عملکرد الگوریتم را تجزیه و تحلیل میکند. در این مرحله، عملکرد یک الگوریتم بر مبنای این تئوریها که سرعت پردازنده ثابت هستند و تاثیری روی پیادهسازی برنامه ندارند، محاسبه میشود.
تجزیه و تحلیل پسین (Posterior Analysis): در این مرحله تجزیه و تحلیلی تجربی روی الگوریتم انجام میشود. قبل از رسیدن به این مرحله، الگوریتم به شکل عملی پیادهسازی میشود و روی سامانه اجرا میشود. در این مرحله از تجزیه و تحلیل الگوریتم، آمار واقعی مانند زمان اجرا و فضای مورد نیاز جمعآوری میشوند.
یکی از مباحث مهمی که هنگام ارزیابی عملکرد یک الگوریتم باید به آن دقت کنید، این موضوع است که تجزیه و تحلیل الگوریتم در برنامهنویسی با زمان اجرای عملیات گوناگون ارتباط مستقیمی دارد. زمان اجرای یک عملیات را میتوان بر مبنای تعداد دستورالعملهای اجرا شده در هر عملیات تعریف کرد. از مباحث مهم دیگری که هنگام تجزیه و تحلیل الگوریتم باید به آن دقت کنید عامل زمان (زمان با استفاده از شمارش تعداد عملیات کلیدی مورد بررسی قرار میگیرد) و فضا (از طریق شمارش بیشترین فضای حافظه مورد نیاز در الگوریتم اندازهگیری میشود) است.
موضوع مهم دیگری که در این زمینه وجود دارد، پیچیدگی فضایی الگوریتم است که بیانگر فضای حافظه مورد نیازی است که یک الگوریتم در هرچرخه اجرا به آن نیاز دارد. فضای مورد نیاز یک الگوریتم به دو عامل زیر بستگی دارد:
بخش ثابت که فضای مورد نیاز برای ذخیره متغیرها و دادههای خاص را نشان میدهد. این بخش مستقل از اندازه مسئله است. به طور مثال، در این بخش متغیرهای ساده، مقادیر ثابت استفاده شده در برنامه، اندازه برنامه و موارد مورد بررسی قرار میگیرند.
بخش متغیر، فضای مورد نیاز متغیرها است که اندازه آن به اندازه مسئله بستگی دارد. به طور مثال، برای این بخش میتوان به مکانیزم تخصیص حافظه پویا، فضای پشته بازگشتی و موارد مشابه اشاره کرد.
پیچیدگی زمانی بیانگر مقدار زمان مورد نیاز الگوریتم از زمان ایجاد تا پیادهسازی است. زمان مورد نیاز را میتوان به عنوان تابع عددی و به صورت T(n) در نظر گرفت که n تعداد مراحل الگوریتم را نشان میدهد. شرط تابع فوق این است که هر مرحله زمان ثابتی را مصرف میکند. به طور مثال، جمع دو عدد صحیح n بیتی، دارای n مرحله است.
پیشنهاد مقاله: الگوریتم چیست و چرا مهمترین مولفه دنیای نرمافزار است؟
الگوریتمهای مرتبسازی (Sorting Algorithms)
یکی از پر کاربردترین الگوریتمهای حال حاضر، الگوریتمهای مرتبسازی هستند که عناصر یک لیست را در یک ترتیب معین، به طور معمول به ترتیب عددی یا واژگانی، مرتب میکنند. مرتبسازی اغلب اولین قدم در حل مسائل پیچیده است. امروزه، انواع مختلفی از الگوریتمهای مرتبسازی وجود دارد که هر کدام مزایا و هزینههای خاص خود را دارند. در پایان به چند مورد از معروفترین الگوریتمهای مرتبسازی اشاره خواهیم کرد.
مرتبسازی خطی: کوچکترین عنصر فهرست را برای مرتبسازی پیدا کنید، آن را به فهرست جدید اضافه کنید و از فهرست اصلی حذف کنید. این کار به دفعات انجام میشود تا لیست اصلی خالی شود.
مرتبسازی حبابی: دو عنصر اول فهرست را با هم مقایسه کنید و اگر اولی بزرگتر از دومی است، آنها را عوض کنید. این کار را با هر جفت عنصر مجاور در لیست تکرار کنید. سپس، این فرآیند را تکرار میکند تا لیست به طور کامل مرتب شود.
مرتب سازی درج: هر عنصر در لیست را با تمام عناصر قبلی مقایسه کنید تا زمانی که عنصر کوچکتری پیدا شود، این دو عنصر را تعویض میکند و این فرآیند را تا مرتب شدن کامل لیست تکرار میکند.
منابع:
https://www.howtogeek.com/411195/what-are-algorithms-and-why-do-they-make-people-uncomfortable/
https://werepstem.com/2021/04/27/what-are-algorithms-and-why-are-they-important/
https://www.mycodingplace.com/post/what-is-an-algorithm-and-why-are-they-important