نحوه نوشتن الگوریتم برنامه نویسی به این صورت است که قبل از نوشتن کدهای برنامه‌ معمولا الگوریتم‌ها را – با رعایت اصول خاصی که در این مطلب توضیح داده‌ایم – قدم به قدم طراحی کرده و سپس به صورت شبهه کد پیاده می‌کنند. برای این کار از ترکیب زبان محاوره‌ای با یک یا چند زبان برنامه نویسی مختلف استفاده می‌شود. دو تعریف مهم برای واژه الگوریتم وجود دارد. اول، مجموعه‌ای از قوانین محدود یا دستورالعمل‌هایی که برای محاسبات یا سایر عملیات مربوط به حل مسئله دنبال می‌شوند و دوم، روندی برای حل کردن مسائل ریاضی با تعداد قدم‌های محدود که به صورت مکرری شامل عملیات بازگشتی می‌شود. با توجه به ماهیت عملکردی بسیار مهم الگوریتم مشخص می‌شود که نحوه نوشتن الگوریتم برنامه نویسی چقدر باید دقیق و صحیح باشد.

در نتیجه، به مجموعه‌ای از فرایندها که برای حل کردن نوع خاصی از مسائل استفاده می‌شوند، الگوریتم گفته می‌شود. پس در صورت طراحی و نوشتن غلط یا غیربهینه الگوریتم، برنامه‌های کامپیوتری، یا داده‌های خروجی بسیار نامعتبری تولید می‌کنند یا میزان مصرف منابع خیلی زیادی خواهند داشت که باعث کندی سیستم می‌شود. در این مطلب از مجله فرادرس درباره نحوه نوشتن الگوریتم برنامه نویسی برای حل مسائل در برنامه‌های خود صحبت کرده‌ایم.

نحوه نوشتن الگوریتم برنامه نویسی به چه صورت است؟

قبل از اینکه برنامه‌‌ای ساخته شود معمولا الگوریتم‌ها را به چند روش مختلف نزدیک به زبان محاوره‌ای روزمره پیاده می‌کنند. این کار باعث می‌شود که هر برنامه نویس با هر زبان برنامه‌نویسی بتواند الگوریتم طراحی شده را پیاده‌سازی کند. در ابتدا باید با رعایت اصول خاص و منظمی الگوریتم مورد نظر خود را طراحی کنیم، سپس به کمک این روش‌ها بهپیاده سازی الگوریتم بپردازیم.

در این بخش اول از همه، انواع روش‌های مورد استفاده برای نوشتن الگوریتم را تعریف کرده‌ایم. سپس مراحل مربوط به نحوه نوشتن الگوریتم برنامه نویسی را همراه با مثال ساده‌ای برای درک بهتر به صورت قدم به قدم توضیح دادیم.

نحوه نوشتن الگوریتم برنامه نویسی به زبان قابل درک برای انسان

نحوه نوشتن الگوریتم برنامه نویسی به این صورت است که قبل از به کد تبدیل کردن هر الگوریتمی به یک، دو یا هر سه روش زیر الگوریتم را پیاده و سازماندهی می‌کنند تا بلوک‌های شرطی، حلقه و بخش ورودی و خروجی الگوریتم به وضوح قابل تشخیص شوند.

  1. «زبان طبیعی» (Natural Language): در این روش، الگوریتم مورد نظر را باید به‌خوبی با استفاده از زبان محاوره روزانه بیان کنیم. درک کردن الگوریتم از روی این روش نیاز به کار و تمرکز بسیار زیادی دارد.
  2. «فلوچارت» (Flowchart): الگوریتم را در این روش به صورت گرافیکی و مصور نمایش می‌دهند. زبان طبیعی برای تعریف الگوریتم از این روش بسیار ساده‌تر است.
  3. «شبهه کد» (Pseudo Code): در این تکنیک، الگوریتم با استفاده از حاشیه‌نویسی ساده، به زبان محاوره‌ای و متن توضیحی توصیف می‌شود. حاشیه‌نویسی و متن توضیحی مورد اشاره در این روش، شبیه به کدهای واقعی هستند. اگرچه شبهه کد، قوانین مبوط به سینتکس هیچ زبان برنامه‌نویسی را به صورت دقیق دنبال نمی‌کند. در نتیجه کامپیوتر‌ها نمی‌توانند شبهه کد را درک کرده و اجرا کنند. این روش بهترین راه برای بیان روش کار الگوریتم است. زیرا هرکسی با کمترین دانش برنامه نویسی نیز می‌تواند شبهه کد را متوجه شود.
برنامه نویسی دریک مهمانی شلوغ نشسته و با لپتاپش کار می‌کند.- نحوه نوشتن الگوریتم برنامه نویسی

مراحل مربوط به نحوه نوشتن الگوریتم برنامه نویسی همراه با مثال

برای اینکه بهتر این مطلب را درک کنیم، از فرایند پیروی از دستور تهیه غذای جدید به عنوان مثال استفاده خواهیم کرد. وقتی که به دستور تهیه غذا نگاه می‌کنیم، باید همه مراحل را به صورت کامل، پشت سرهم و صحیح مطالعه کرده و انجام دهیم. در نتیجه هم غذای جدید به صورت بسیار خوبی تهیه می‌شود. به همین صورت، در زمان استفاده از تلفن، کامپیوتر، لپتاپ یا ماشین حساب نیز از الگوریتم‌ها استفاده می‌کنیم. استفاده برنامه‌نویسان از الگوریتم‌ها برای انجام عملیات مختلف و رسیدن به نتیجه مورد نظر هم به همین‌ صورت است.

توجه کنید: الگوریتم توسعه یافته، مستقل از زبان است و فقط شامل دستورالعمل‌های ساده‌ای است که برای نوشتن آن در هر زبان برنامه‌نویسی و بدست آوردن نتیجه مطلوب لازم است. الگوریتمی که به‌‌خوبی تعریف شده باشد را به‌سادگی می‌توان با هر زبان برنامه‌نویسی پیاده‌سازی کرد. در نتیجه نحوه نوشتن الگوریتم برنامه نویسی بسیار وابسته به نوشتن صحیح شبهه کد است.

مثالی درباره مراحل نوشتن الگوریتم

در این مثال نوشتن الگوریتم را به صورت مرحله به مرحله با کمک مثالی شرح داده‌ایم.

در مرحله اول باید نتیجه کد خود را در نظر بگیریم. یعنی به طور دقیق، باید بدانیم که چه نوع مشکلی را باید حل کنیم یا این الگوریتم چه‌کاری باید انجام دهد. بعد از شناختن هدف و پاسخ مورد نیاز خود به صورت واضح، به احتمال بیشتری می‌توانیم برای انتخاب اقدامات لازم به خوبی تصمیم بگیریم.

در مرحله دوم باید موقعیت شروع کار را انتخاب کنیم. برای شناسایی کردن فازهای مختلف پروسه حل مسئله، قبل از همه باید نقاط شروع و پایان کار الگوریتم را تعیین کنیم. برای مشخص کردن نقطه شروع خوبی کار الگوریتم لازم است که سوالات زیر را به صورت صحیح و کامل پاسخ دهیم.

  • چه داده‌ها یا اطلاعات ورودی در دسترس هستند؟
  • این داده‌ها در کجا نگهداری می‌شوند؟
  • از کدام فرمول‌ها می‌توان برای حل مسئله حاضر استفاده کرد؟
  • چه دستورالعمل‌هایی برای استفاده از داده‌های در دسترس وجود دارد؟
  • چه ارتباطاتی بین مقادیر داده‌ای قابل مشاهده هستند؟

در مرحله سوم باید موقعیت پایان عملیات الگوریتم را مشخص کنیم. همان‌طور که نقطه شروع کار الگوریتم را پیدا کردیم، با تمرکز بر حل مسائل زیر باید نقطه پایان اجرای عملیات الگوریتم را نیز مشخص کنیم.

  • چه اطلاعاتی را می‌توانیم از رویه حاضر جمع‌آوری کنیم؟
  • بین نقطه شروع و پایان کار الگوریتم چه تغییراتی اتفاق خواهد افتاد؟
  • چه چیزهایی تغییر خواهند کرد یا حذف می‌شوند؟

در مرحله چهارم هر قدم برای حل مسئله را باید از ابتدا تا به انتها فهرست کنیم. این کار را با انجام حرکات بزرگ شروع می‌کنیم. سناریویی را در نظر بگیرید که در آن هدف خوردن لازانیا برای شام است. پیدا کردن دستور پخت لازانیا را به عنوان بهترین نقطه شروع عملیات انتخاب کرده‌ایم. همچنین این عملیات باید حدود ساعت ۷ عصر به اتمام برسد. در واقع رأس ساعت ۷ باید لازانیای پخته شده‌ای داشته باشیم که آماده رفتن به سر میز شام است. فعالیت‌های مورد نظر در این الگوریتم می‌توانند شامل موارد زیر باشند.

  • در ابتدای کار از اینترنت کمک گرفته و برای پیدا کردن دستور پخت تحقیق می‌کنیم.
  • با بررسی آشپزخانه، مواد اولیه موجود را پیدا کرده و مواد اولیه ناموجود را شناسایی می‌کنیم.
  • لیستی از مواد اولیه‌ای که باید خریداری شوند تهیه می‌کنیم.
  • عناصر ناموجود را خریداری می‌کنیم.
  • به منزل برمی‌گردیم.
  • لازانیا را آماده می‌کنیم.
  • در نهایت باید لازانیای پخته شده را در محل مناسبی برای خنک شدن قرار دهیم.
مرد جوانی در زیر درختی پر از شکوفه و در کنار برکه بر روی زمین نشسته و با لپتاپش کار می‌کند. - نحوه نوشتن الگوریتم برنامه نویسی

در مرحله پنجم باید روش خود را برای تکمیل کردن هر قدم از حل مسئله انتخاب کنیم. بعد از اینکه نقشه اولیه‌ای را به صورت قدم به قدمی برای پخت لازانیا ایجاد کردیم، باید در نظر بگیریم که به صورت احتمالی کدنویسی هر قدم به چه میزان خواهد بود؟ از چه زبان برنامه‌نویسی استفاده خواهیم کرد؟ برای انجام عملیات چه ابزاری در دسترس هستند؟ در زبان برنامه‌نویسی منتخب، سریع‌ترین روش برای کامل کردن هر قدم چیست؟ بخشی از کد را برداشته و آن را در الگوریتم خود قرار دهیم. بعد از اینکه کل پروسه حل مسئله را توصیف کردیم، باید هر مرحله را به صورت جداگانه گسترش دهیم.

برای نمونه، اولین قدم در الگوریتم تهیه لازانیا، پیدا کردن دستور پخت آن به صورت آنلاین است. اما این مرحله جست‌وجو شامل چه مواردی می‌شود؟ در این بخش باید دقیق عمل کنیم. به عنوان مثال:

  • کامپیوتر را روشن کنیم.
  • اتصال اینترنت کامپیوتر را بررسی کنیم. در صورتی که از قبل اتصال اینترنت نداشتیم باید اتصال به شبکه را ایجاد کنیم.
  • مرورگر اینترنت خود را باز می‌کنیم.
  • معیارهای مورد نظر برای تحقیق خود را در موتور جست‌وجو وارد کنیم.
  • یکی از لینک‌های مربوط به دستور تهیه غذا را انتخاب کرده و باز می‌کنیم.
  • دستور تهیه غذا را بررسی می‌کنیم. آیای این دستور نیازمندی‌های سلیقه ما و امکانات موجود را برآورده می‌کند یا نه؟
  • هر نوع دستور تهیه غذای گیاه‌خوارانه‌ای را حذف می‌کنیم.
  • بررسی کنیم که دستور تهیه غذا حداقل برای ۵ پرس مواد مورد نیاز را در نظر گرفته باشد.
  • باید این مراحل را تا زمان پیدا کردن ترکیب صحیح همه موارد تکرار کنیم.
  • تمام منابعی که در دسترس داریم را در نظر بگیریم. منابعی از قبیل ویژگی‌های سیستمی که در حال آماده کردن برنامه برای آن هستیم. برای مثال در زمان پخت لازانیا، در نظر می‌گیریم که آشپز روش جست‌وجوی آنلاین در اینترنت و استفاده از فر یا سایر عملیات لازم را بلد است.

در مرحله ششم نحوه نوشتن الگوریتم برنامه نویسی، بعد از ایجاد الگوریتم مورد نظر خود باید آن را تحلیل و ارزیابی کنیم. الگوریتمی که تهیه‌ کرده‌ایم برای شروع توسعه برنامه مورد نظر لازم است. زیرا این الگوریتم، طراحی شده تا وظیفه خاصی را در برنامه اجرا کند.

برای ارزیابی الگوریتم می‌توانیم پرسش‌های زیر را در نظر گرفته و به هر کدام که ضروری بود پاسخ دهیم.

  • آیا این الگوریتم وظیفه خود را به صورت کامل انجام می‌دهد یا مسئله مورد نظر را حل می‌کند؟
  • آیا داده‌های ورودی و خروجی به خوبی تعریف شده‌اند؟
  • آیا هدف نهایی برای پوشش دادن مسائل بیشتر قابل گسترش است؟ آیا اطلاعات بیشتری هم برای اضافه کردن وجود دارد؟
  • آیا پروسه یا فعالیتی وجود دارد که بتوان به صورت ساده‌تری پیاده‌سازی کرد؟
  • آیا میزان دقت نتایج حاصل از الگوریتم تضمین شده است؟

آموزش نحوه نوشتن الگوریتم برنامه نویسی در فرادرس

بسیار خوب، تا به اینجای کار با قواعد و اصول نوشتن الگوریتم آشنا شدیم. الگوریتم‌ها همین‌طور که در بالا‌تر گفتیم و در ادامه مطلب به صورت بیشتری نیز توضیح خواهیم داد، در حال حاضر نقش بسیار کلیدی در اکثر پلتفرم‌ها و برنامه‌های بزرگ و مهم بازی ‌می‌کنند. هرچه برنامه‌ای بزرگ‌تر و کاربردی‌تر باشد، مدیریت مصرف منابع زمان و حافظه هم از اهمیت بیشتری برخوردار می‌شود.

مجموعه آموزش طراحی الگوریتم
«با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه آموزش طراحی الگوریتم هدایت شوید.»

فرادرس به عنوان یکی از بزرگترین تولید کنندگان محتوای آموزشی فارسی در دنیا، فیلم‌های آموزشی بسیار خوبی را درباره انواع الگوریتم‌ها و تکنیک‌های پیاده‌سازی و استفاده از آن‌ها را منتشر کرده است. فیلم‌های آموزشی فرادرس با توجه به دو حوزه برنامه‌نویسی عملی و فعالیت‌های تحصیلی تولید شده‌اند. همه افرادی که در حوزه توسعه برنامه‌های کامپیوتری کار می‌کنند با مشاهده این فیلم‌ها می‌توانند مهارت و دانش خود را برای حل مسائل الگوریتمی به طرز بسیار خوبی افزایش دهند. از طرف دیگر دانشجویان نیز با کمک این فیلم‌ها می‌توانند خود را برای آزمون‌های آکادمیک حتی کنکور ارشد و دکتری نیز آماده کنند.

در بخش پایین چند مورد از فیلم‌های آموزشی فرادرس درباره الگوریتم را معرفی کرده‌ایم. با توجه به نیاز خود می‌توانید هر کدام را انتخاب کرده یا با کلیک بر روی تصویر بالا به صفحه اصلی این مجموعه آموزشی هدایت شده و از سایر فیلم‌ها نیز دیدن کنید.

  • فیلم آموزش طراحی الگوریتم به صورت جامع و با مفاهیم کلیدی در فرادرس
  • فیلم آموزش طراحی الگوریتم درباره مرور و تست کنکور ارشد در فرادرس
  • فیلم آموزش طراحی الگوریتم همراه با حل مثال های عملی در فرادرس
  • فیلم آموزش حل سوالات آزمون های استخدامی طراحی الگوریتم در فرادرس

چرا به الگوریتم ها نیاز داریم؟

یکی از پاسخ‌های جزئی برای این سوال مربوط حل مسئله انتخاب ویژگی است. این مسئله در حوزه‌های مختلف یادگیری ماشینی و داده کاوی مطرح می‌شود. هدف از حل مسئله انتخاب ویژگی، انتخاب یک مجموعه کوچک و معنادار از ویژگی‌ها است که در تصمیم‌گیری و پیش‌بینی دقیق‌تر عمل کند. در حالت کلی مساله انتخاب ویژگی دارای راه‌حل قطعی نیست و تاکنون روشی دقیق برای حل آن پیشنهاد نشده است. رویکردهای مختلفی به صورت کلاسیک برای این مساله‌ها پیشنهاد شده‌اند که معمولا کیفیت پاسخ آن‌ها، به صورت عمومی چندان مناسب و مطلوب نیست. اما در مقابل، با استفاده از الگوریتم‌های بهینه‌سازی هوشمند می‌توان در حل این مسائل، راه‌حل‌های به مراتب بهتری را ارائه داد. از این رو، یکی از روش‌های موثر و سازنده برای حل مسئله انتخاب ویژگی و مسائل مرتبط با آن، استفاده از روش‌های بهینه‌سازی فراابتکاری و الگوریتم‌های تکاملی است.

برای آشنا شدن با این تکنیک مدرن و مناسب از جهت حل مسئله و آموزش آن می‌توانید فیلم آموزش انتخاب ویژگی با استفاده از الگوریتم های فراابتکاری و تکاملی از فرادرس را مشاهده کنید. برای راحتی بیشتر شما لینک مربوط به فیلم را در ادامه قرار داده‌ایم.

برای بررسی دلیل نیاز به الگوریتم‌ها می‌توانیم به چهار علت زیر اشاره کنیم.

  1. الگوریتم‌ها برای حل کردن مسائل پیچیده به صورت بهینه و کارآمد مورد نیاز هستند.
  2. الگوریتم‌ها برای کمک به خودکارسازی فرایند اجرای عملیات استفاده می‌شوند. این کار باعث می‌شود که قابلیت اتکاپذیری، استفاده و سرعت عملیات مختلف ارتقا پیدا کند.
  3. بعضی از فعالیت‌ها برای انجام به صورت دستی توسط انسان‌ها بسیار چالش برانگیز یا غیرممکن هستند. الگوریتم‌ها برای انجام این نوع از فعالیت‌ها به کامپیوترها کمک می‌کنند.
  4. الگوریتم‌ها برای ساده کردن رویه‌ها، تحلیل داده، انجام پیشبینی‌ها و حل مسائل مختلف در صنایع گوناگون شامل ریاضیات، علوم کامپیوتر، مهندسی، اقتصاد و موارد دیگر به‌کار برده می‌شوند.
برنامه‌نویسی در شب در سطح شهر توکیو با لپتاپش کار می‌کند. - نحوه نوشتن الگوریتم برنامه نویسی

کاربردهای الگوریتم چیست؟

در حوزه‌های مختلفی، استفاده از الگوریتم‌ها به امری ضروری تبدیل شده و کاربردهای متنوعی نیز دارند. امروزه الگوریتم‌ها به صورت گسترده در رشته‌های گوناگونی مانند موارد فهرست زیر کاربرد دارند.

  • برنامه‌نویسی: الگوریتم‌ها بلوک‌های سازنده‌ای از برنامه‌نویسی کامپیوتر هستند. همچنین برای برطرف کردن مسائل مختلفی از مسائل ساده مرتب سازی و جست‌و‌جو در میان داده‌ها گرفته تا مسائل بسیار پیچیده‌تری مانند هوش مصنوعی و یادگیری ماشین به‌کار برده می‌شوند.
  • مسائل پیچیده ریاضی: در ریاضیات هم از الگوریتم‌ها برای حل مسائل خاصی استفاده می‌شود. مسائلی مانند پیدا کردن کوتاه‌ترین مسیر در گراف یا بهترین جواب برای مجموعه‌ای از معادلات خطی را با کمک الگوریتم‌ها می‌توان حل کرد.
  • تحقیق عملیاتی: الگوریتم‌ها برای تصمیم‌گیری و بهینه‌سازی در زمینه‌هایی مانند تخصیص منابع، لجستیک و حمل و نقل استفاده می‌شوند.
  • «هوش مصنوعی» (Artificial Intelligence): هوش مصنوعی و یادگیری ماشین بر اساس الگوریتم‌ها ساخته شده‌اند. این الگوریتم‌ها برای ساخت سیستم‌های هوشمند به‌کار برده می‌شوند. چنین سیستم‌های باید توانایی انجام مسائلی از قبیل «بازشناسی تصویر» (Image Recognition)، «پردازش زبان طبیعی» (Natural Language Processing) و «تصمیم گیری» (Decision-Making) را داشته باشند.
  • «علم داده» (Data science): در صنایعی مانند بازاریابی، بانکداری و بهداشت و درمان نیز از الگوریتم‌ استفاده می‌شود. از وظایف اصلی الگوریتم‌ها در این نوع از صنایع می‌توان به تحلیل و پردازش و گردآوری اطلاعات مهم از حجم عظیمی از داده‌های مختص به هر صنعت اشاره کرد.

این‌ها فقط دسته‌ای چند از کاربردهای بسیار گسترده الگوریتم‌ها هستند که بیان کردیم. الگوریتم‌ها به طور فزاینده‌ای به بخش مهمی از زندگی مدرن تبدیل شده‌اند. حوزه‌ها و تکنولوژی‌های جدیدی که توسعه داده‌ می‌شوند همه از الگوریتم‌ها استفاده می‌کنند.

الگوریتم‌ها بسته به کاری که می‌خواهیم انجام دهیم از ساده‌ترین شکل ممکن تا پیچیده‌ترینشان، داده‌هایی را به عنوان ورودی دریافت می‌کنند، مجموعه عملیات قاعده‌مندی را بر روی این داده‌ها اجرا کرده و در نهایت خروجی را به عنوان جواب به بیرون برمی‌گردانند.

اصول مربوط به نحوه نوشتن الگوریتم برنامه نویسی

به‌جای استفاده کردن هرروزه از دستورالعمل‌های خاص برای انجام کارها، می‌توانیم تصمیم بگیریم که از آن‌ها پیروی نکنیم. در همین راستا باید اشاره کنیم که همه دستورالعمل‌های کامپیوتری که نوشته می‌شوند هم الگوریتم نیستند. همه دستورالعمل‌ها برای اینکه صلاحیت تبدیل شدن به الگوریتم را پیدا کنند باید، نیازمندی‌های فهرست شده در ادامه را براورده کنند.

  • باید بدون ابهام و شفاف باشد: هر مرحله در الگوریتم از ابتدا تا به انتها باید معنی واضح و مستقلی داشته و به‌سادگی قابل فهم باشد.
  • داده‌های ورودی باید واضح و صریح باشند: وقتی که الگوریتمی برای کار نیاز به گرفتن داده‌ از خارج دارد، داده‌های ورودی باید دارای معیارهای خاص و مشخصی باشند. با توجه به این معیارها الگوریتم تصمیم می‌گیرد که داده‌ها را بپذیرد یا نه.
  • داده‌های خروجی باید واضح و صریح باشند: الگوریتم باید با دقت بسیاری داده‌های خروجی‌ خود را تعریف کند. هر الگوریتم لازم است که حداقل یک خروجی تولید کند.
  • دارای محدودیت باشد: الگوریتم‌ها باید بعد از طی کردن تعداد محدودی مرحله به پایان برسند. حتما باید مطمئن شویم که الگوریتم طراحی شده، به صورت بی‌نهایت اجرا نشود.
  • باید شدنی باشد: هر الگوریتمی که طراحی شده، با توجه به منابع در دسترس، باید عملی و قابل پیاده‌سازی باشد. از اتکا صرف به تکنولوژی بسیار مدرن وجدید برای اجرای عملیات باید صرف نظر کرد.
  • باید مستقل از زبان باشد: مستقل از زبان بودن یکی از ویژگی‌های مهم هر الگوریتمی است. به این معنا که الگوریتم‌ها باید شامل دستورالعمل‌های ساده‌ای شوند. این دستورالعمل‌ها در هر زبان برنامه‌نویسی قابل پیاده‌سازی هستند، با اینکه هنوز نتیجه مطلوب را تولید می‌کنند.
  • داده‌ ورودی بپذیرد: هر الگوریتم می‌تواند یک یا چند داده ورودی بپذیرد. هر عبارتی که شامل عملگر اصلی است باید بتواند حداقل از یک تا چند داده ورودی بپذیرد.
  • داده خروجی تولید کند: در حالت کمینه، هر الگوریتم یک داده خروجی تولید می‌کند. الگوریتم‌ها با دستورالعمل‌هایی که شامل عملگر اصلی است، بر اساس ورودی‌های داده شده باید در کمترین حالت یک نتیجه تولید کنند.
  • باید واضح و شفاف باشد: دستورالعمل‌های موجود در الگوریتم باید به صورت شفاف، مشخص و با قابلیت درک ساده تعریف شده باشند. هر دستورالعمل الگوریتم، برای درک کاری که می‌کند باید به تنهایی قابل مراجعه باشد. در هیچ کدام از دستورات عملیاتی اصلی الگوریتم، هیچ نوع ابهامی نباید وجود داشته باشد.
  • محدودیت در سناریو‌های آزمایشی: در هر نوع سناریو آزمایشی، بعد از تعداد محدودی اجرای عملیات الگوریتم باید متوقف شود. هر دستورالعملی که از عملگرهای اصلی استفاده می‌کند باید در دوره زمانی خاصی به پایان برسد. حلقه‌های بی‌نهایت یا توابع بازگشتی بدون در نظر گرفتن شرایط خاص، دارای محدودیت نمی‌شوند.
  • باید اثر بخش باشد: الگوریتم‌ها باید با استفاده از چنان فرایند‌های ساده، عملیاتی و اساسی ساخته شده باشند که به‌سادگی و فقط با یک ورق کاغذ و مداد بررسی عملکرد و نتیجه حاصل شده از اجرای آن را بررسی کرد.
پسر جوان سیاه پوست در پارک نشسته و با لپتاپ کار می‌کند.

با رعایت اصول بالا، الگوریتم مورد نظر دارای ساختار خوب و قابلیت پیاده‌سازی آسان خواهد بود. همچنین این الگوریتم برای تولید داده‌های خروجی مطلوب قابل اعتماد و پایدار است.

تکنیک صحیح برای نوشتن الگوریتم، بر اثر تمرین و جمع‌آوری اطلاعات از منابع معتبر و افزایش تجربه است که در درون ذهن ما به عنوان برنامه‌نویس ملکه می‌شود. یکی دیگر از منابع بسیار خوب همراه با مثال‌ برای نوشتن الگوریتم، مطلب آموزش کامل نحوه نوشتن الگوریتم به زبان ساده از مجله فرادرس است. پیشنهاد می‌کنیم که به صورت کامل و دقیق این مطلب را نیز همراه با مثال‌ها مطالعه کرده و سپس شروع به ساخت الگوریتم خود برای حل مسئله کنید.

ویژگی های الگوریتم

هر الگوریتم ویژگی‌های خاصی دارد. اما یک سری از ویژگی‌ها بین همه الگوریتم‌ها مشترک هستند. عدم رعایت این ویژگی‌ها باعث خارج شدن دستورالعمل حل مسئله از تعریف الگوریتم می‌شود.

  • بعد از مقدار مشخصی از واحد زمان، اجرای عملیات باید به پایان برسد.
  • حداقل یک خروجی باید تولید شود.
  • باید قطعی باشد. یعنی اینکه نتیجه تولید شده باید به صورت دقیق با سناریو وارد شده به مسئله همخوانی داشته باشد.
  • هر مرحله در اجرای کار الگوریتم باید کارآمد و بهینه باشد. هر مرحله باید نتیجه خاصی را تولید کند.

انواع الگوریتم ها

چندین نوع مختلف از الگوریتم‌ها وجود دارند. در فهرست زیر چند نوع از الگوریتم‌های قدرتمند را معرفی کرده‌ایم.

  1. «الگوریتم‌های پرقدرت» (Brute Force Algorithms): اولین رویکری که برای حل هر مسئله‌ای به ذهن برنامه‌نویسان می‌رسد استفاده از الگوریتم‌های پرقدرت است.
  2. «الگوریتم بازگشتی» (Recursive Algorithm): فعالیت‌های بازگشتی اساس و بنیاد الگوریتم‌های بازگشتی را تشکیل می‌دهند. در این نمونه الگوریتم، مسئله به اجزای کوچکتری تقسیم می‌شود. سپس این مسائل کوچک – غیرقابل تقسیم به مسائل کوچک‌تر – با استفاده از تابع یکسانی به صورت تکراری فراخوانده و حل می‌شوند.
  3. «الگوریتم عقب گرد» (Backtracking Algorithm): در این رویکرد راه حل مسئله به صورت قدم به قدم ایجاد شده و همه گزینه‌های ممکن بررسی می‌شوند. در این رویکرد پاسخ را با در نظر گرفتن معیارهای خاصی توسعه می‌دهیم. هربار که راه حلی شکست خورد، به مسئله اصلی بازگشته و راه حل جدیدی را ایجاد می‌کنیم. به همین ترتیب، این فرایند را دائما تکرار می‌کنیم، تا وقتی که مسئله حل شود یا همه راه حل‌های ممکن آزموده شوند.
  4. «الگوریتم جست وجو» (Searching Algorithm): الگوریتم‌های جست‌وجو عناصر یا مجموعه‌ای از عناصر را به صورت مجزا در درون ساختارهای داده ارسال شده به الگوریتم پیدا می‌کنند. با توجه به اینکه چگونه با داده‌ها رفتار کنند یا عناصر در داخل چه نوع ساختار داده‌ای قرار دارند، می‌توانند چندین شکل مختلف را شامل شوند.
  5. «الگوریتم‌ مرتب‌سازی» (Sorting Algorithm): مرتب‌سازی، پروسه‌ای است که برای سازماندهی مجموعه‌ای از اشیا با توجه به نیاز برنامه به‌کار برده می‌شود. برای حل کردن این نوع از مسائل از الگوریتم‌های مرتب‌سازی استفاده می‌شود. دسته‌بندی داده‌ها معمولا با استفاده از الگوریتم‌های مرتب‌سازی در حالت صعودی یا نزولی انجام می‌شود.
  6. «الگوریتم هشینگ» (Hashing Algorithm): این الگوریتم شبیه به الگوریتم جست‌وجو عمل می‌کند اما با این وجود از ID خاصی به عنوان کلید برای ایندکس گذاری داده‌ها استفاده می‌کند. در زمان هش کردن داده‌ها به هر بخش خاص از اطلاعات، کلیدی اختصاص داده می‌شود.
  7. «الگوریتم تقسیم و حل» (Divide and Conquer Algorithm): این روش، مسئله را به تعدادی مسئله کوچکتر تقسیم می‌کند. هر قسمت را به صورت جداگانه حل کرده و سپس نتایج را برای بدست آوردن راه حل نهایی با یکدیگر ترکیب می‌کند. این نوع از الگوریتم‌ها شامل سه مرحله اصلی به نام‌های تقسیم، حل و ترکیب هستند.
  8. «الگوریتم حریصانه» (Greedy Algorithm): این الگوریتم مسئله را به صورت قطعه قطعه حل می‌کند. به این صورت که در طی حل مسئله، قطعه‌ای را انتخاب می‌کند که بیشتری سود سریع را می‌دهد، یا در مرحله بعد بیشترین امتیاز را کسب خواهد کرد.
  9. «الگوریتم برنامه‌نویسی پویا» (Dynamic Programming Algorithm): در این تکنیک از آخرین جواب کشف شده استفاده می‌کنیم تا از محاسبه تکراری قطعات یکسان مسئله جلوگیری شود. در این تکنیک مسئله اصلی به زیرمسائل قابل مدیریتی تقسیم می‌شوند که با یکدیگر همپوشانی دارند. سپس هر زیر مسئله را با توجه به راه حل‌های کشف شده حل می‌کنیم. در نتیجه از انجام محاسبات تکراری اجتناب می‌شود.
  10. «الگوریتم تصادفی» (Randomized Algorithm): برای رسیدن به مزیت سرعت در الگوریتم تصادفی، از عدد تصادفی استفاده می‌کنیم. نتایج پیش‌بینی شده تا حدی به عدد تصادفی مورد استفاده بستگی دارند.
برنامه نویس کد نویسی می‌کند. سگش به او خیره شده است.

مزایای استفاده از الگوریتم

استفاده از الگوریتم‌ها شامل مزایایی می‌شود که در فهرست زیر بیان کرده‌ایم.

  • درک الگوریتم‌ها ساده است.
  • الگوریتم‌ها در هر مشکلی نمایش قدم به قدم راه حل برای رسیدن به جواب هستند.
  • تبدیل الگوریتم به برنامه‌ای که کار می‌کند، برای برنامه‌نویسان بسیار ساده‌تر است. زیرا مسئله به تعدادی قطعه کوچکتر تقسیم شده و هر قطعه به صورت واضحی تعریف شده است.

معایب استفاده از الگوریتم

استفاده از الگوریتم‌ها می‌تواند شامل مشکلات و معایب خاصی نیز باشد. چند مورد از مهم‌ترین مشکلات استفاده از الگوریتم‌ها را در ادامه فهرست کرده‌ایم.

  • زمان مورد نیاز برای طراحی الگوریتم‌ باعث می‌شود که بعضی وقت‌ها استفاده از الگوریتم بیش از حد زمان‌بر باشد.
  • بعضی وقت‌ها درک استدلال‌های پیچیده با استفاده از الگوریتم‌ها می‌تواند به فرایندی کاملا چالشی تبدیل شود.
  • الگوریتم‌ها می‌توانند عملیات مربوط به تقسیم کردن راه حل را با استفاده از عبارات شرطی انجام دهند. به همین دلیل گاهی از اوقات، ایجاد دور در راه حل‌ها با استفاده از حلقه‌ به چالش‌های بسیار سخت تبدیل می‌شود.

دو مثال ساده درباره طراحی الگوریتم

در این بخش دو مثال ساده درباره طراحی و پیاده‌سازی الگوریتم‌ها را نمایش می‌دهیم.

  1. حذف و اضافه از لیست پیوندی
  2. معکوس کردن ترتیب کلمات در جمله داده شده

نمایش فرایند حل مسئله‌های بیان شده را از مثال اول شروع می‌کنیم.

حذف و اضافه از لیست پیوندی

در این مسئله فرض می‌کنیم که لیست پیوندی داده شده و باید الگوریتمی طراحی کنیم که به کمک آن به این لیست مقادیری را وارد یا از آن خارج کنیم.

لیست‌های پیوندی یکی از ساختارهای داده بنیادین در علوم کامپیوتر است. بیشترین علت استفاده از این لیست‌ها زمان ثابت حذف و اضافه کردن عنصر به لیست است. با استفاده گره‌ و نشان‌گر، می‌توانیم بعضی از پردازش‌ها را نسبت به آرایه‌ها با سرعت بیشتری انجام دهیم. در تصویر زیر شکلی از روش حذف عنصر را از لیست پیوندی نمایش داده‌ایم.

هر لیست پیوندی از گره‌های درست شده که خود شامل چند قسمت هستند. قسمتی را برای نگهداری داده‌ها و قسمتی را برای نگهداری آدرس گره بعدی استفاده می‌کنند.

الگوریتم لازم برای پیاده‌سازی عملیات حذف و اضافه از لیست پیوندی را در زبان Ruby کدنویسی می‌کنیم. مراحل کار این الگوریتم را می‌توان به صورت شبه کد زیر بیان کرد.

  • گره‌ها را با نام [fdboutput]{“content”:”Node”,”type”:”inline”}[/fdboutput] و دو بخش [fdboutput]{“content”:”%3Adata”,”type”:”inline”}[/fdboutput]  و  [fdboutput]{“content”:”%3Anext_node”,”type”:”inline”}[/fdboutput]  ایجاد می‌کنیم.
  • اول دو متد مختلف [fdboutput]{“content”:”insert_node”,”type”:”inline”}[/fdboutput]  و [fdboutput]{“content”:”delete_node”,”type”:”inline”}[/fdboutput]  را تعریف می‌کنیم. این متدها باید دو پارامتر بپذیرند، یکی به نام [fdboutput]{“content”:”head”,”type”:”inline”}[/fdboutput]  و دیگری به نام [fdboutput]{“content”:”location%20″,”type”:”inline”}[/fdboutput] .
  • پارامتر[fdboutput]{“content”:”head”,”type”:”inline”}[/fdboutput] گره سر لیست پیوندی را نمایش می‌دهد و پارامتر [fdboutput]{“content”:”location%20″,”type”:”inline”}[/fdboutput] محل مورد نظر برای حذف یا اضافه را مشخص می‌کند.
  • متد [fdboutput]{“content”:”insert_node”,”type”:”inline”}[/fdboutput] دارای پارامتر اضافی به نام [fdboutput]{“content”:”node”,”type”:”inline”}[/fdboutput]  است. این پارامتر مقدار یا گره‌ای را نشان می‌دهد که باید به لیست اضافه شود.
  • سپس تا زمان پیدا کردن محل مورد نظر اجرای عملیات با کمک حلقه‌ای بر روی لیست، پیمایش می‌کنیم.
  • وقتی که به مکان مورد نظر خود رسیدیم، نشان‌گرها را دوباره از نو برای اجرای عملیات حذف یا اضافه بازنویسی می‌کنیم.

تمام مراحل مربوط به الگوریتم بالا در کادر زیر کدنویسی شده‌اند. توجه کنید که هر برنامه‌نویسی می‌تواند شبه‌کد را بنابر سلیقه خود و به خواناترین شکل برای خود بنویسد.

Node = Struct.new(:data, :next_node)

def insert_node(head, node, location)
  current_node = head
  current_location = 0

  until current_location == location
    previous_node = current_node
    current_node = current_node.next_node
    current_location += 1
  end

  if previous_node
    previous_node.next_node = node
    node.next_node = current_node
  else
    node.next_node = current_node
  end

  head

end

def delete_node(head, location)
  current_node = head
  current_location = 0

  until current_location == location
    previous_node = current_node
    current_node = current_node.next_node
    current_location += 1
  end

  if previous_node
    previous_node.next_node = current_node.next_node
  else
    head = current_node.next_node
  end

  head
end

معکوس کردن ترتیب کلمات در جمله داده شده

در این مسئله فرض می‌کنیم زنجیره طولانی متشکل از کلمات یا جمله دلخواهی داده شده است. سوال: برنامه‌ای بنویسید که کلمات جمله داده شده را به‌ صورت معکوس کنار هم قرار دهد.

برای مثال، اگر رشته «students quiz practice code» به برنامه داده شود، خروجی برنامه باید به شکل رشته «code practice quiz students» باشد و اگر به عنوان ورودی برنامه رشته «My name is Mostafa» را دریافت کرده باشیم، برنامه تولید شده باید خروجی به شکل « Mostafa is name My» را برگرداند.

در ادامه این بخش کدهای مربوط به این الگوریتم را به زبان پایتون طراحی و پیاده‌سازی کردیم. مراحل پیاده‌سازی این الگورتیم را می‌توانید در چند قدم زیر طراحی ببینید. متن نوشته شده در پایین، شبه کد مربوط به الگوریتم است. با مطالعه شبه‌کد روند کار الگوریتم را هم متوجه می‌شوید.

  1. متد split()یکی از متدهای رشته در پایتون است. با استفاده از این متد کلمات درون جمله داده شده را از یکدیگر جدا می‌کنیم.
  2. سپس کلمات از هم جدا شده را در لیستی با نام داخواه words جمع‌آوری می‌کنیم.
  3. با کمک تکه کد r.reversed(words)  لیست words را معکوس می‌کنیم.
  4. بعدا تمام کلمات درون لیست را با استفاده از متد join() در پایتون به یکدیگر متصل می‌کنیم.
  5. در نهایت هم رشته جدید ساخته شده را در خروجی نمایش می‌دهیم.
def rev_sentence(sentence): 

	words = sentence.split(' ') 

	reverse_sentence = ' '.join(reversed(words)) 

	return reverse_sentence 

if __name__ == "__main__": 
	input = 'students quiz practice code'
	print (rev_sentence(input)) 

خروجی برنامه بالا با جمله فرضی داده شده در کد به صورت زیر است.

[fdboutput]{“content”:”code%20practice%20quiz%20students%E2%80%8A”,”type”:”block”}[/fdboutput]

روش تحلیل الگوریتم

برای اثر بخشی صحیح، لازم است که الگوریتم استاندارد، به صورت بهینه‌ کار کند. در نتیجه، کارآمدی الگوریتم را باید تحت نظارت قرار دهیم. برای نظارت کردن بر الگوریتم دو فاز اصلی وجود دارند که در فهرست زیر مورد اشاره قرار گرفته‌اند.

  1. تحلیل Priori: کلمه «Priori» به زبان لاتین و به معنای «قبلی» است. در نتیجه «تحلیل Priori» اشاره به اعتبار سنجی متد قبل از استفاده از آن دارد. وقتی که مراحل الگوریتمی به صورت نظری بر روی کاغذ پیاده‌سازی شده، در واقع به همین صورت هم آزموده شده است. با فرض این مطلب که تمام سایر متغیرها مانند سرعت پردازنده به صورت ثابت باقی‌مانده و بر روی نحوه نوشتن الگوریتم برنامه نویسی تاثیری نداشته باشند، در این حالت عملکرد الگوریتم ارزیابی شده است. به طور معمول، خود طراح الگوریتم، این تحلیل را انجام می‌دهد. نوع سخت‌افزار و کامپایلر زبان برنامه‌نویسی بر روی تحقیقات طراح الگوریتم تاثیری ندارد. بلکه این تحقیقات از پیچیدگی برنامه، تخمین‌های تقریبی را ارائه می‌دهند.
  2. تحلیل Posterior: پیش‌وند Posterior به زمان بعد از انجام کار اشاره دارد. در نتیجه بررسی الگوریتم بعد از اینکه به روی سیستم پیاده‌سازی شده را به عنوان تحلیل Posterior می‌شناسند. الگوریتم مورد نظر به وسیله قرار گرفتن در فضای عملی کار و پیاده‌سازی شدن در هر زبان برنامه‌نویسی آزموده می‌شود. این تکنیک بررسی به بدست آوردن گزارش تحلیلی دقیق و واقعی درباره صحت عملکرد الگوریتم، زمان مورد استفاده و فضای اشغال شده توسط الگوریتم کمک می‌کند. در واقع با این تحلیل الگوریتم را از بابت هر داده ورودی احتمالی و نتایجی که برگشت داده می‌شوند یا بر روی مانیتور چاپ می‌شوند، بررسی می‌کنیم. به عبارت دیگر نتیجه تحلیل Posterior وابسته به سخت‌افزار مورد استفاده و زبان برنامه‌نویسی کامپایلر برنامه است.

روش تشخیص پیچیدگی های الگوریتم

الگوریتم‌ها بر اساس مقدار زمان و فضایی که برای اجرا استفاده می‌کنند به عنوان پیچیده دسته‌بندی می‌شوند. بنابراین، میزان پیچیدگی الگوریتم اندازه‌ای از زمان و فضایی است که برای کار، ذخیره‌سازی داده‌های مورد استفاده در الگوریتم و تولید نتایج مطلوب نیاز دارد. متعاقبا، این دو عنصر مهم نیز میزان اثرگذاری الگوریتم را تعیین می‌کنند.

پسر جوانی در هوای آفتابی در سطح شهر با لپتاپ کار می‌کند.

دو عنصری که پیچیدگی‌های الگوریتم را مشخص می‌کنند به صورت واضح‌تری در زیر توضیح داده‌ایم.

  • عامل زمان: برای اندازه‌گیری میزان مصرف عامل زمان، باید مقدار زمان مورد نیاز برای پردازش‌های ضروری الگوریتم، مانند هر عملیات مقایسه در الگوریتم‌های مرتب‌سازی محاسبه شود.
  • عامل فضا: با جمع کردن همه فضای حافظه‌ کامپیوتر که الگوریتم برای اجرای عملیات نیاز دارد، مقدار کل مصرف عامل فضا محاسبه می‌شود.

در نتیجه پیچیدگی الگوریتم را در دو دسته بندی کلی می‌توان محاسبه و نمایش داد.

پیچیدگی فضایی

«پیچیدگی فضایی» (Space Complexity) به میزان حافظه‌ای می‌گویند که الگوریتم برای ذخیره‌سازی متغیرهای ورودی، داده‌های موقتی تولید شده در زمان اجرا و داده‌های خروجی مصرف می‌کند.

برای اینکه میزان پیچیدگی فضایی الگوریتم‌ها را مشخص کنیم باید دو عنصر زیر محاسبه شوند.

  • بخش ثابت: این بخش به میزان حافظه‌ای می‌گویند که الگوریتم به صورت قطعی و در همه اجراها نیاز خواهد داشت. برای نمونه، اندازه برنامه، متغیرهای خروجی و متغیرهای ورودی همیشه ثابت هستند.
  • بخش متغیر: این بخش به میزان حافظه‌ای می‌گویند که بسته به روش استفاده از الگوریتم قابل تغییر است. برای نمونه می‌توان به تخصیص حافظه پویا، «فضای پشته بازگشتی» (Recursion Stack Space)، متغیرهای موقتی و غیره می‌توان اشاره کرد.

پس، پیچیدگی فضایی هر الگوریتم «P» را به صورت «S(P)» نمایش می‌دهیم. در اینجا نماد «S(P)» به صورت «S(P) = C + SP(I)» تعریف می‌شود. در فرمول مورد اشاره، حرف «C» نشانگر بخش ثابت الگوریتم و «S(I)» نشانگر بخش متغیر آن است. «S(I)» خود وابسته به مشخصات نمونه داده شده به الگوریتم با نماد «I» است.

مثال

در این بخش، برای نمونه از روش جست‌وجو خطی استفاده می‌کنیم.

  • مرحله اول: شروع کار الگوریتم
  • مرحله دوم: آرایه‌ای با [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]  عنصر و عدد [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]  را در ورودی تحویل می‌گیریم. عدد [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]همان عددی است که الگوریتم در آرایه باید به دنبال آن بگردد.
  • مرحله سوم: عملیات را از چپ‌ترین عنصر آرایه شروع می‌کنیم. هر عنصر درون آرایه [fdboutput]{“content”:”arr%5B%5D”,”type”:”inline”}[/fdboutput]  را با عدد [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]به صورت یک به یک مقایسه می‌کنیم.
  • مرحله چهارم: اگر عدد [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]با هر کدام از عناصر مورد بررسی همسان بود در خروجی مقدار True را چاپ می‌کنیم.
  • مرحله پنجم: اگر عدد [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]با هیچ عنصری از عناصر آرایه [fdboutput]{“content”:”arr%5B%5D”,”type”:”inline”}[/fdboutput] همسان نبود در خروجی مقدار False را چاپ می‌کنیم.
  • مرحله ششم: پایان کار الگوریتم

در این مورد دو متغیر [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]و [fdboutput]{“content”:”arr%5B%5D”,”type”:”inline”}[/fdboutput] وجود دارند. در این مثال [fdboutput]{“content”:”x”,”type”:”inline”}[/fdboutput]عنصر ثابت و آرایه [fdboutput]{“content”:”arr%5B%5D”,”type”:”inline”}[/fdboutput] دارای بخش متغیری با [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]عنصر مختلف است. در نتیجه، فرمول مورد اشاره به شکل «S(P) = 1 + n» در می‌آید. بنابراین، اندازه [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]- تعداد عناصر آرایه – تعیین می‌کند که میزان فضای مورد استفاده الگوریتم چقدر پیچیده‌ است. الان میزان فضای مصرفی، مضربی از نوع داده متغیرهای مشخص شده و نوع عدد ثابت است.

یک ربات کوچک چرخ دارد با چشمانی قرمز در مقابل مانیتوری که کدنویسی را نشان می‌دهد قرار دارد. - نحوه نوشتن الگوریتم برنامه نویسی

پیچیدگی زمانی

زمانی که الگوریتم برای اجرا و تولید نتیجه از داده‌های ورودی نیاز دارد به عنوان «پیچیدگی زمانی» (Complexity Of Time) الگوریتم شناخته می‌شود. این مسئله را می‌توان به فرایند‌های منظم و عادی، عبارت‌های if-else همراه با شرایطشان و حلقه‌ها و غیره تعمیم داد.

دو عنصری که در فهرست زیر توضیح داده‌ایم، برای محاسبه پیچیدگی زمانی الگوریتم‌ها به‌کار برده می‌شوند.

  • عنصر زمانی ثابت: این بخش شامل همه دستورالعمل‌هایی می‌شود که فقط یکبار اجرا می‌شوند. به عنوان مثال می‌توان به گرفتن ورودی، ارسال داده‌ها به خروجی، اجرای عبارت‌های If-Else و Switch کردن، محاسبات ریاضی و غیره اشاره کرد.
  • بخش زمانی متغیر: این بخش شامل همه دستورالعمل‌هایی می‌شود که به اندازه [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]بار یا بیشتر اجرا می‌شوند. تکرار اجرای این دستورالعمل‌ها معمولا با استفاده از حلقه‌ها، فرایند‌های بازگشتی و غیره انجام می‌شود.

در نتیجه، برای هر الگوریتم «P» میزان پیچیدگی زمانی توسط فرمول «T(P) = C + TP(I)» محاسبه می‌شود. متغیر «C»، در فرمول نمایش داده شده نمایانگر عنصر زمان ثابت در الگوریتم است. همچنین، «TP(I)» نشان دهنده عنصر متغیر است. خود این عنصر، وابسته به مشخصات نمونه داده شده به الگوریتم «I» است.

مثال

در این بخش، برای نمایش محاسبه پیچیدگی زمانی از روش جست‌وجو خطی به عنوان نمونه استفاده می‌کنیم.

  • مرحله اول: زمان ثابت
  • مرحله دوم: در این مرحله زمان متغیر را بسته به تعداد داده ورودی [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]محاسبه می‌کنیم.
  • مرحله سوم: زمان متغیر را در این مرحله بر اساس تعداد [fdboutput]{“content”:”n”,”type”:”inline”}[/fdboutput]بار مقایسه‌ای محاسبه می‌کنند که تا زمان پیدا شدن عنصر مورد جست‌وجو انجام می‌شود.
  • مرحله چهارم: زمان ثابت
  • مرحله پنجم: زمان ثابت
  • مرحله ششم: زمان ثابت

سرانجام پیچیدگی فضایی را به صورت «T(P) = 5 + n» نمایش می‌دهند. البته شاید به صورت ساده «T(n)» هم بنویسند.

آشنایی با چند مورد از الگوریتم های مدرن

تا به اینجای مطلب با الگوریتم‌ها آشنا شده و نحوه طراحی و تعریف الگوریتم‌ها را به صورت کلی آموختیم. اما برای درک بیشتر تکنیک‌های تعریف و بهینه‌سازی الگوریتم‌ها، لازم است که با چند مورد از الگوریتم‌های مدرن و پیش‌رفته‌ای آشنا شویم که بر روی سیستم‌های حال حاضر جهان در حال استفاده هستند. فهم روش تعریف و پیاده‌سازی این الگوریتم‌ها کمک بسیار زیادی در پیاده‌سازی الگوریتم‌های شخصی خودمان در مسائل منحصر به فردی می‌کند که هر برنامه‌نویسی ممکن است در طول زمان کار با آن‌ها روبه‌رو شود.

مجموعه آموزش الگوریتم های بهینه سازی هوشمند
«با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه آموزش الگوریتم های بهینه سازی هوشمند هدایت شوید.»

فرادرس به عنوان پلتفرم آموزشی آنلاین، تلاش می‌کند که تمام جنبه‌های ممکن از هر صنعت و علم و هنری را با فیلم‌های خود پوشش دهد. الگوریتم‌های کامپیوتری هم یکی از مهم‌ترین اهداف فرادرس برای آموزش و در نتیجه انتشار علم مربوط به آن در کشور هستند. به همین منظور فیلم‌های بسیار خوبی در زمینه آشنایی و کار با انواع الگوریتم‌های پیشرفته در فرادرس تهیه شده که در ادامه چند مورد از آن‌ها را مشاهده می‌کنید.

  • فیلم آموزش الگوریتم ژنتیک در متلب با فرادرس
  • فیلم آموزش الگوریتم PSO در متلب با فرادرس
  • فیلم آموزش بهینه سازی چند هدفه در متلب با فرادرس
  • فیلم آموزش الگوریتم بهینه سازی گرگ خاکستری GWO و پیاده سازی در متلب با فرادرس
  • فیلم رایگان آموزش الگوریتم بهینه سازی سیاه چاله BH در فرادرس

جمع بندی

نحوه نوشتن الگوریتم برنامه نویسی به صورت صحیح یکی از مهم‌ترین اصول برای ساخت برنامه‌های کارآمد و پایدار است. الگوریتم‌ها را بر اساس اصول مدون و منظمی طراحی می‌کنیم. سپس برای بدست آوردن تحلیل اولیه و تخمین واقعی از میزان پیچیدگی آن الگوریتم را با کمک ابزاری مانند شبهه کد به روی کاغذ پیاده می‌کنیم. در نهایت هم به زبان برنامه‌نویسی مورد نظر خود کدهای مربوط الگوریتم را می‌نویسیم.

در این مطلب از مجله فرادرس، درباره نحوه نوشتن الگوریتم برنامه نویسی صحبت کرده‌ایم. مراحل شش‌گانه این عملیات را همراه با مثال قابل درکی بیان کرده و روش تبدیل این مراحل را به شبهه کد نشان دادیم. درباره نیاز به الگوریتم‌ها، اصول مربوط به نوشتن الگوریتم و انواع الگوریتم‌ها به صورت مفصل توضیحاتی را ارائه کردیم. در آخر هم دانستیم که چگونه باید الگوریتم را تحلیل کرد و پیچیدگی‌های مربوط به الگوریتم را به چه دلیل و با چه روشی باید محاسبه کنیم.

نوشته نحوه نوشتن الگوریتم برنامه نویسی – از صفر تا صد اولین بار در فرادرس – مجله‌. پدیدار شد.

source

توسط expressjs.ir