الگوریتم های برنامه نویسی به زبان ساده
برای یک برنامهنویس حرفهای فراگیری جامع برخی از مفاهیم و اصول اولیه حائز اهمیت است. آشنایی کافی با این مفاهیم چالشها و پیچیدگیهای برنامهنویسی در سطوح حرفهای را آسانتر و قابل فهمتر میکند. در این روزها با پیشرفت تکنولوژی و زبانهای مختلف برنامهنویسی الگوریتم های برنامه نویسی بسیاری به وجود آمده است.
بنابراین آشنایی با انواع الگوریتم در دنیای برنامهنویسی به منظور توسعه و بهبود نرم افزارها و پیشرفت مهندسی آن هم به صورت اصولی ضروری میباشد. اگر از برنامه نویسی چیزی نمیدانید برنامه نویسی چیست را بخوانید و سپس با شناخت اقسام الگوریتم های برنامه نویسی، توسعه دهندگان و مهندسان بهترین و کارآمدترین گزینهها را برای حل مسائل در زمانهای مختلف را پیدا خواهند کرد. آنها با انتخاب الگوریتم مناسب برای نرم افزارها، شاهد افزایش سرعت، کاهش اشغال حافظه و بهطور کلی مدیریت بهینه سخت افزار و منابع موجود میباشند. در ادامه به معرفی چیستی الگوریتم و شناخت برخی از آنها در برنامهنویسی میپردازد.
الگوریتم چیست؟
در صورتیکه به تازگی پا به عرصه برنامهنویسی گذاشتهاید لازم است با مفهوم الگوریتم آشنا شده و درک مناسبی از نقش و جایگاه الگوریتم های برنامه نویسی بهدست آورید.
به بیان ساده، الگوریتم به دستورالعملهای مشخص و پیدرپی گفته میشود که برای حل مسئله و یا تکمیل فرآیند موردنظر فراخوان و اجرا میگردد. الگوریتم در زندگی روزمره و دنیای واقعی نیز کاربردهای زیادی دارد. به عنوان مثال میتوان به وجود الگوریتمها در برنامهریزی برای انجام کارهای شخصی یا اداری، دستور پخت انواع غذا و کیک و شیرینی و به طور کلی برای انتخابهای روزانه اشاره کرد. بدین صورت که هر مسئله به قسمتهای قابل مدیریت تقسیم شده و انجام هر بخش بر اساس یک نظم مشخص و بطور متوالی صورت میپذیرد. یک الگوریتم عبارت است از:
- تعریف مسئله
- ورود و جمعآوری اطلاعات
- پردازش اطلاعات
- منطقی کردن اطلاعات
- یافتن راه حل مسئله بر اساس اطلاعات
الگوریتم برنامهنویسی
برای تشریح دقیق تمام مراحل و گامهای اجرایی در برنامههای رایانهای، از دستورالعملهایی برای رسیدن به اهداف اصلی برنامه استفاده میگردد که به آن الگوریتم برنامهنویسی میگویند.
در حوزه برنامهنویسی و رایانه، به منظور تسریع و ارتقا کیفیت کارها، اغلب فرآیندهای سخت افزاری و نرم افزاری بر اساس الگوریتم های برنامه نویسی انجام میشوند. اهمیت الگوریتمها زمانی به چشم میآید که با کمک آنها خطاها سریعتر کشف شده و از سردرگمی احتمالی در عدم اجرا و کارآمدی صحیح نرم افزارها جلوگیری میشود.
الگوریتم در برنامهنویسی شامل قسمتهای شروع، بدنه یا میانه و پایان است. در واقع میتوان اولین مرحله از آن را شروع یا «Start» و آخرین مرحله را پایان یا «End» نامگذاری نمود. بدنه یا مراحل میانی بسته به هدف برنامه نوشته خواهند شد. مراحل و وظایف موجود در الگوریتم برنامهنویسی به طور کاملا واضح و مشخص هستند و دستورالعمل عملکردی نرمافزار برای برنامهنویس قابل فهم و درک است. الگوریتم های برنامه نویسی همواره کارآمدترین راه حل برای اجرای صحیح برنامه را ارائه میدهند.
از موارد استفادهی الگوریتم های برنامه نویسی در دنیای امروزی میتوان به روند جستجوی سایتها، پیشنهادات مختلف شبکههای اجتماعی برای کاربران، سایتهای خرید، پلتفرمهای پخش فیلم و سریال اشاره کرد. این موارد از کاربردیترین الگوریتمهایی هستند که در نرمافزارهای معروف مانند گوگل، اینستاگرام، یوتیوب، آمازون و غیره به طور مداوم با آنها سروکار داریم.
انواع الگوریتم های برنامه نویسی
مجموعهای از الگوریتم های برنامه نویسی شده و توسعه یافته توسط برنامهنویسان در طی زمان، موجب حل مسائل گوناگونی در حوزه برنامهنویسی سختافزار و نرمافزار شده است. این الگوریتمها میتوانند به شیوههای مختلفی دستهبندی شوند. در این مقاله تنها برخی از انواع الگوریتم های برنامه نویسی نام برده شدهاند و باید بدانید که هنوز تعداد زیادی از الگوریتمها وجود دارند که از آنها برای حل مسائل اختصاصی و خاص استفاده میشود. همچنین، امکان ترکیب کردن دو یا چند مورد از الگوریتمها برای اهداف و نتایج بهخصوصی توسط برنامهنویسان وجود دارد. در اکثر مواقع، این امر منجر به ایجاد و معرفی یک الگوریتم جدید نیز میگردد. در ادامه این مقاله میخواهیم چند الگوریتم را که بنابر نظر کارشناسان جونیورا کاربردی و مورد استفاده میباشد، توصیف کنیم.
برخی از الگوریتم های برنامه نویسی رایج و متداول
- الگوریتمهای جستجو: این الگوریتمها برای جستجو و یافتن اطلاعات در مجموعهای از دادههای کوچک و یا بزرگ، انواع پایگاههای داده داخلی (بر روی رایانههای شخصی یا یک شرکت و سازمان) و در دیتابیس یا پایگاههای داده خارجی (در فضاهای مجازی اینترنت و یا بین کاربران چند سازمان و یا کشور)، برای کاوش و کندوکاو اطلاعات کاربرد دارند. مثالهایی از این الگوریتمها عبارتند از جستجوی خطی (Liner Search)، جستجوی دودویی (Binary Search).
- الگوریتمهای مرتبسازی: این الگوریتمها وظیفه مرتبسازی مجموعهای از اطلاعات و دادههای الفبایی، عددی و غیره را بر اساس نزولی یا صعودی و یا برعکس را برعهده دارند. انواع رایج الگوریتمهای مرتبسازی عبارتند از: مرتبسازی حبابی (Bubble Sort)، مرتبسازی انتخابی (Selection Sort)، مرتبسازی درجی (Insertion Sort)، مرتبسازی ادغامی (Merg Sort) و مرتبسازی سریع (Quick Sort).
- الگوریتمهای ساختار داده و گراف: این الگوریتمها برای حل مسائل مرتبط با ساختار داده و گرافها مورد استفاده قرار میگیرند. مثالهایی از این الگوریتمها شامل جستجوی عمق اول (Depth First Search)، جستجوی سطح اول (Breadth First Search)، کوتاهترین مسیرها (Shortest Paths)، درخت تصمیم (Decision Tree) و غیره میباشند.
- الگوریتمهای بازگشتی: این الگوریتمها بر اساس فراخوانی مجدد خود در برنامه و تقسیمبندی مسئله به قسمتهای کوچکتر، موجب رسیدن به جواب مسئله اصلی با تحلیل خروجیها میگردد. برخی از الگوریتمهای بازگشتی عبارتند از: جستجوی عمق اول بازگشتی و مرتبسازی بازگشتی و غیره.
- الگوریتمهای تصادفی: این الگوریتمها بر اساس تصادف و شانس نتایجی را تولید میکنند. ازجمله این الگوریتمها میتوان الگوریتم ژنتیک، الگوریتم شبکه عصبی و غیره را نام برد.
الگوریتمهای مرتبسازی، از الگوریتم های برنامه نویسی
منظور از مرتبسازی اطلاعات در برنامهنویسی، چینش و مرتب کردن دادهها در قالبی مورد نظر است. استفاده از الگوریتمهای مرتبسازی شیوهای رایج برای چیدمان دادههای عددی یا الفبایی است. با این کار یافتن دادهها میتواند تا سطح بالایی بهینهسازی گردد؛ جستجو، دسترسی و تجزیه و تحلیل آسانتر شود. همچنین برای نشان دادن اطلاعات به شکلهای خواناتر و قابل درکتری برای کاربران استفاده میشود و تأثیر قابل توجهی بر عملکرد سیستمها دارد. برخی از کاربردهای مرتبسازی در زندگی روزانه به قرار ذیل میباشد.
- دفترچه تلفن فیزیکی: این دفترچه شامل شماره تلفنهایی است که بتوانیم آنها را سادهتر و سریعتر پیدا کنیم و معمولا بر اساس حروف الفبا و اسامی افراد منظم شدهاند.
- فرهنگ لغت فیزیکی: فرهنگ لغت زبان انگلیسی یا فارسی که حاوی واژگان و کلماتی است که بر پایه حروف الفبایی ترتیب یافتهاند تا یافتن هر کلمه آسانتر باشد.
- پایگاههای داده: مرتب سازی برای بازیابی و یافتن رکوردها بر مبنای صعودی یا نزولی بودن عناصری همچون تاریخ، ترتیب حروف الفبا برای نام کالا یا محصول، ترتیب عددی برای قیمتها یا سن دانشجویان و غیره استفاده میشود. بنابراین به کاربران امکان میدهد تا به سرعت دادههای مورد نیاز خود را پیدا کنند.
- موتورهای جستجو: از جمله این موتورهای جستجو گوگل را میتوان نام برد که برای رتبهبندی نتایج جستجو به ترتیب از تاریخ ایجاد، نوع محتوا و غیره استفاده میکند.
- کاربردهای علمی و مهندسی: محققان و مهندسان میتوانند با این الگوریتم در تجزیه و تحلیل دادهها، شبیه سازی محیط و ابزارهای واقعی و کاربردی، بینش و پیشبینی دقیقتری درباره نتایج عملکرد سیستمهای پیچیده و رفتارهای آینده کاربران و محصولات بهدست آورند. برای مثال میتوان تحلیل و تجزیه اطلاعات مشتریان شرکتهای بزرگ و یا شبیه سازی محیط خلبانی، فضایی و حتی عملکرد ویروسها را عنوان نمود.
الگوریتم مرتبسازی حبابی (Bubble sort)
از این الگوریتم در برنامهنویسی زمانی استفاده میشود که اطلاعی از مرتب بودن یا نبودن دادهها نداشته باشیم. الگوریتم مرتبسازی حبابی از سادهترین، قدیمیترین و معروفترین انواع الگوریتمهای مرتبسازی است. مرتبسازی حبابی بر اساس تعویض دو مقدار کنار هم و با تکرار زیاد کار میکند.
روش کار این الگوریتم به این صورت است که ابتدا تمام مقادیر یا عناصر درون مجموعه یا فهرست را کاوش کرده و اگر نامرتب باشند، آنها را دستهبندی و منظم میکند. این روند تا زمانی که تمام مقادیر یا عناصر درون مجموعه مرتب شوند، ادامه مییابد. مشابه حباب آب که تا سطح آب پیش میرود و این دلیل نام گذاری حبابی این الگوریتم میباشد.
به عنوان مثال اگر بخواهید یک آرایه عددی تصادفی را به ترتیب صعودی مرتب کنید، الگوریتم مرتبسازی حبابی چندین بار آرایه را بررسی میکند تا دنباله عددی به ترتیب دلخواه برسد. این فرآیند برای دادههای حجیم نیز به کار میرود اما به دلیل بسیار زمانبر بودن تا نظم کامل دادهها، این موضوع توصیه نمیشود و بهتر است از الگوریتمهای بهینه شده دیگر برای مرتبسازی استفاده کنید.
الگوریتم جستجوی دودویی (Binary Search)
مفهوم جستجو در الگوریتم های برنامه نویسی این است که مکان اسناد، فایلها، محتوای رسانهای، متنی، صوتی و تصویری یا هر نوع دادهای که در پایگاه اطلاعات (Database) وجود دارد را یافته و در اختیار کاربر قرار میدهیم.
جست و جوی دودویی نوع پیشرفته و معروفی از الگوریتم جستجو است که دادهها را از درون فهرست موارد موجود پیدا میکند. این مورد از الگوریتم های برنامه نویسی، ساختار دادهها را بر اساس فواصل کوتاه جستجو (half-interval search) میکند، یعنی جستجوی متوالی انجام نمیدهد. الگوریتم جستجوی دودویی یا در اصطلاح باینری برای ساختارها یا پایگاههای اطلاعات مرتب و منظم شده کارایی بیشتری دارد. چراکه دیگر نیازی به اسکن و بررسی تمام پایگاه یا مجموعه داده را نخواهد داشت.
این الگوریتم به خوبی روی دادههای مرتب شده با هر حجم و اندازهای قابل پیاده سازی و اجرا است. به طور تصادفی دادهها را بررسی کرده و با این کار چرخههای جستجو کوتاهتر و دقیقتر ایجاد مینماید. در نهایت سریعتر مقدار مورد نظر را یافت میکند. اساس کار الگوریتم جستجوی دودویی مقایسه دادهها با اصل رتبهبندی بوده و با این روش، مقایسه مقادیر تک به تک بررسی نمیشوند و زمان پاسخگویی کندتر نیست.
روش کار الگوریتم جستجوی دودویی یا باینری
عملکرد اصلی این الگوریتم، دو قسمت کردن دادههای یک مجموعه یا یک لیست است و این عمل تا زمان یافتن محتوای مورد نظر ادامه پیدا خواهد کرد. برای درک بهتر در زیر روند ترتیبی کار این الگوریتم را با یک مثال شرح میدهیم. (فرض کنید یک آرایه مرتب شده از اعداد داریم و الگوریتم جستجوی دودویی را روی آن اجرا میکنیم.)
در هر مرحله از جستجو، محدودهی آرایه را به نصف تقسیم میکند. روش کار به این صورت است که ابتدا مقدار مدنظر در آرایه را با مقدار موجود در میانهی آن مقایسه میکند. بهترین حالت نتیجه الگوریتم این است که دو مقدار با هم برابر باشند و جستجو تمام خواهد شد. حال اگر مقدار مورد نظر از مقدار وسط بزرگتر بود، بخش بالایی آرایه به دو قسمت تقسیم شده و جستجو در بخش بالایی آرایه ادامه مییابد. اما اگر مقدارش از مقدار میانه آرایه کوچکتر بود، بخش پایینی به دو قسمت تقسیم شده و جستجو در بخش پایینی آرایه ادامه پیدا خواهد کرد. عملیات بررسی تا پیدا شدن عنصر یا مقدار مورد نظر ادامه مییابد.
در ادامه مقاله قصد داریم سناریوی دو بازی که با استفاده از برخی الگوریتم های برنامه نویسی کار میکنند را تشریح کنیم.
سناریوی بازی حدس زدن عدد
بازی حدس اعداد یکی از بازیهای ساده و رایج برای برنامهنویسان مبتدی است. پروژه بازی حدس اعداد بر پایه این مفهوم است که بازیکن باید عددی را بین محدوده داده شده حدس بزند. اگر بازیکن عدد مورد انتظار را در تعداد بار مشخص شده در بازی، حدس بزند، او به عنوان برنده نمایش داده میشود. ولی اگر بازیکن در تعداد بار مشخص شده حدس اشتباه بزند، بازی را خواهد باخت.
لازم به ذکر است این بازی برای درک بهتر انجام عمل الگوریتم جستجوی دودویی یا باینری میباشد. همچنین از الگوریتم تصادفی برای انتخاب عنصر یا عددی تصادفی و از الگوریتم بازگشتی نیز استفاده می شود.
قوانین پروژه بازی حدس عدد
این بازی شامل قوانینی است که با اعمال و رعایت آنها توسط برنامهنویس علاوه بر جذابیت بیشتر بازی، کاربر شانس برنده شده بیشتری خواهد داشت.
- بازیکن فقط عدد صحیح معتبر را در بازه تعیین شده وارد مینماید.
- تعداد دفعات محدودی برای حدس زدن مشخص و اعلام شود.
- اگر کاربر پس از شروع بازی آن را ترک کند یعنی در زمان معینی ورودی ندهد بازنده بهشمار میآید.
- اگر عدد وارد شده برابر با عدد مورد نظر باشد، یعنی بازیکن درست حدس زده و برنده میشود.
- اگر عدد وارد شده کمتر یا بیشتر از عدد مشخص شده باشد، بازیکن پیغام مناسبی را دریافت میکند.
- اگر تعداد حدسهای زده شده بازیکن به تعداد محدود مشخص شده برسد و عدد درست را حدس نزند، او بازنده اعلام میشود.
الگوریتم این بازی ساده بر تولید اعداد تصادفی و جملات شرطی تاکید دارد و با متنی مشابه این آغاز میگردد:
” عددی بین a و b را داریم و تو میتوانی در x بار شانس خود، حدس بزنی و با جوابهای بالاتر، کمتر و یا درست است، راهنمایی میشوی ”
توضیحات بازی حدس زدن عدد در قالب مثال عملی
فرض کنید محدوده ورودیهای کاربر، از اعداد ۱ تا ۱۰۰ باشد، و رایانه به صورت تصادفی عدد ۴۱ را به عنوان عدد مورد نظر برگزیده است. اکنون بازی حدس زدن عدد شروع میشود.
فرض کنید کاربر برای اولین حدسش عدد ۵۰ را وارد میکند. برنامه پیغام “بالاتر حدس زدی” را نمایش میدهد و منتظر میماند بازیکن شانس دوم خود را امتحان کند. برای کاربر پیغام به این معناست که عدد تعیین شده ۴۲ در محدوده ۵۰ تا ۱۰۰ قرار نگرفته است. تکنیک مهم در این بازی حدس زدن نیمی از محدوده باقی مانده است.
پس برای بار دوم کاربر نیمی از ۵۰ یعنی عدد ۲۵ را حدس زده و وارد می کند. دراین زمان برنامه پیغام “کمتر حدس زدی” را نمایش میدهد. برای بازیکن معنای آن این است که اعداد صحیح کمتر از ۲۵ (از ۱ تا ۲۵) نیز دراین بازی درست نیستند. اکنون محدوده حدس زدن کاربر کوتاهتر شده و از ۲۵ تا ۵۰ میباشد.
بازیکن به عنوان حدس سوم خود نیمی از این محدوده را حدس میزند و عدد ۳۷ را وارد میکند. این بار دوباره برنامه پیغام خروجی را اینگونه نمایش خواهد داد: “کمتر حدس زدی” و با این موضوع اکنون بازه حدس برای کاربر از عدد ۳۷ تا ۵۰ است.
حال فرض کنیم که کاربر ۴۳ را برای حدس چهارم خود وارد کند. این بار برنامه پیغام “بالاتر حدس زدی” را نمایش میدهد و بنابراین بازه حدس جدید برای بازیکن از ۳۷ تا ۴۳ خواهد بود. تکرار این فرآیند به قدری خواهد بود که یا کاربر رقم درست را حدس بزند (که پیغام برنده شدی را به او نشان میدهد) و یا تعداد حدسهای بازیکن برابر با عدد ۷ شود. این بار برنامه به او “تعداد بار شانس حدس زدن شما تمام شد و عدد مورد نظر x بود” را نمایش میدهد. درنهایت بازی تمام میشود.
کارت بازی و الگوریتم های برنامه نویسی
این یک بازی بسیار سرگرمکننده و هیجانانگیز است و میتوان با آن ساعتها مشغول شد. کارت بازی انواع مختلفی دارد که با الگوریتم های برنامه نویسی مختلفی از جمله مرتبسازی، تصادفی و بازگشتی در آن استفاده میشود. در این مقاله قصد داریم تنها سناریوی کلی کارت بازی را برای درک بهتر از آن شرح دهیم.
سناریوی کارت بازی
در ابتدای بازی همه کارتها توسط الگوریتم تصادفی بر میخورند و با هم مخلوط میشوند. به هر نفر تعدادی کارت تعلق میگیرد. الباقی کارتها به صورت دست نخورده در مرکز صفحه بازی طوری قرار داده میشود که تصویر آنها معلوم نباشد.
شروع بازی به این صورت است که یکی از کارتهای موجود در گوشه صفحه بازی برگردانده شده و بازیکنان آن را میبینند. بازی طبق قوانین از پیش تعیین شده آغاز میگردد.
شخصی که نوبت بازی در اختیار اوست باید از کارتهای خود، کارتی را وسط قرار دهد که عدد، رنگ یا سمبل و مقدار روی آن با کارت وسط برگردانده شده یکی یا هماهنگ باشد. (در بازی های کارتی مختلف، قوانین و مقررات هر کارت نسبت به دیگری متفاوت است و عملکرد خاصی را ایجاد میکند)
مثلا اگر در کارت وسط عدد ۸ با رنگ زرد باشد، کاربر میتواند هر کارتی با عدد ۸ یا هر کارتی به رنگ زرد را بر روی آن قرار دهد. اعداد برابر یا رنگ و نماد مساوی از نقاط قوت کارتهای توزیع شده در این کارت بازی است.
اگر بازیکن در نوبت خود نتواند کارتی را هماهنگ با کارت وسط گذاشته شده، ارایه کند، باید یکی از کارتهای موجود در گوشه صفحه بازی را بر دارد و به کارتهای موجود خود اضافه کند. حال اگر کارت برداشته شده شرایط قابل ارایه کردن را داشته باشد، میتواند آن را در وسط قرار دهد. درغیر این صورت نوبت به نفر بعدی میرسد.
در نهایت این بازی تا جایی ادامه پیدا میکند که یک بازیکن امتیاز بالاتری کسب کرده و یا مجموع کارتهای بیشتری را بهدست آورده باشد. بر اساس قوانین اغلب بازیهای کارتی برنده او خواهد بود و اگر کارت بازیکنی زودتر تمام شود او بازنده کارت بازی خواهد بود.
سخن پایانی
هر وسیله یا هر کاری دستورالعمل ویژهی خود را دارد. برای ایجاد و اجرای صحیح هر برنامه در زبانهای برنامهنویسی نیز باید از الگوریتم مخصوص به آن استفاده کرد. برای ساخت و بهکارگیری الگوریتم های برنامه نویسی باید از اصول یکسان و استاندارد خاصی پیروی نمود.
درک فرآیند ساخت و نحوه اجرای یک الگوریتم به کودکان و نوجوانان و برنامهنویسان مبتدی کمک میکند تا تفکر منطقی قوی و توانایی حل مسئله بالایی داشته باشند. تفکر الگوریتمی در برنامهنویسان باعث توسعه مهارتهای آنها بهمنظور بهرهمندی از راهحلهای خلاقانه و مبتکرانه برای مشکلات و مسائل گسترده در حوزههای علوم ریاضیات، فناوری اطلاعات و ارتباطات خواهد شد. الگوریتم در ابعاد مختلف زندگی انسان کاربرد دارد و با بهکارگیری آن قدم به قدم تا ساده کردن و حل مسئله پیش میرویم.
سلام من دانشجوی رشته کامپیوترم. واقعا هرچی استاد می گفت رو نمیفهمیدم ولی این متن شما رو که خوندم واقعا تازه فهمیدم الگوریتم چیه و به چه دردی می خوره. ازتون ممنونم
سلام هانیه جان. خوشحالیم از اینکه محتواهای کاربردی به زبان ساده برای مخاطبینمون تولید میکنیم.
ممنون بابت به اشتراک گذاشتن نظرت 😊🌱