به نظر می رسد تصور غلط زیادی از سوی بسیاری از توسعه دهندگان مشتاق وجود دارد که به خاطر سپردن الگوریتم های استاندارد مهم است. اکنون برای برخی از مصاحبه های شغلی که ممکن است چنین باشد، اما برای اینکه واقعاً یک توسعه دهنده موفق باشید، اهمیت خاصی ندارد.
پس آیا چیزهایی که در کلاس الگوریتم یاد می گیرید بی فایده هستند؟ قطعا نه. آنچه فوق العاده مهم است توانایی تفکر الگوریتمی است. نه فقط برای اینکه بتوانید الگوریتمهای استاندارد را بازتولید کنید، بلکه برای اینکه از کد برای حل مشکلاتی که بهعنوان یک توسعهدهنده با آن مواجه میشوید راحت باشید.
به همین دلیل است که من فهرستی از 10 الگوریتم را گردآوری کردهام که توسعهدهندگان مشتاق باید از طریق آنها کار کنند تا الگوریتمی فکر کنند.
1. جستجوی باینری
جستجوی باینری یکی از اولین چیزهایی است که در هر کلاس علوم کامپیوتر تدریس می شود. شاید این سادهترین مثال باشد که نشان میدهد چگونه اندکی نبوغ میتواند کارها را، به معنای واقعی کلمه، به طور تصاعدی کارآمدتر کند.
جستجوی دودویی شامل گرفتن یک آرایه مرتب شده، و تقسیم مکرر آرایه به دو قسمت و مقایسه عنصری است که به دنبال آن هستید با هر نیمه، تا زمانی که عنصر را پیدا کنید.
2. Selection، Bubble و Insertion Sort
الگوریتم های مرتب سازی یکی از اساسی ترین ابزارهایی هستند که یک توسعه دهنده باید در زرادخانه خود داشته باشد. انتخاب، حباب، و مرتب سازی درج از اولین مواردی هستند که توسعه دهندگان جدید باید از طریق آنها کار کنند. در هر سناریویی که سرعت اهمیت دارد، از این الگوریتمها استفاده نمیکنید، اما کار با آنها مقدمهای عالی برای پیمایش و دستکاری آرایه است.
3. Quicksort و Mergesort
مشابه شماره ۲، الگوریتمهای مرتبسازی برای راحتتر شدن با آرایهها عالی هستند، اما Quicksort و Mergesort به اندازهای کارآمد هستند که در برنامههای کاربردی جدی مورد استفاده قرار گیرند. راحت بودن در اجرای این الگوریتمهای مرتبسازی (توجه داشته باشید "راحت بودن" و "به خاطر سپردن") این الگوریتمها برای یک توسعهدهنده جدی ضروری هستند.
4. کدنویسی هافمن
کدنویسی هافمن اساس فشرده سازی متن مدرن است. این با در نظر گرفتن تعداد دفعات ظاهر شدن کاراکترهای مختلف در یک متن کار می کند و آنها را در یک درخت بر اساس این فرکانس سازماندهی می کند.
5. جستجوی اول سطح
دوباره، درختان در قلب بسیاری از الگوریتم ها و نرم افزارهایی هستند که توسعه دهندگان با آنها کار می کنند. به این ترتیب، درک پیمایش اولیه درخت برای یک توسعه دهنده مشتاق اولویت اصلی است.
جستجوی اول سطح با کاوش یک درخت در سطح به سطح کار می کند تا زمانی که گره هدف پیدا شود. از آنجایی که به معنای واقعی کلمه از هر سطحی عبور می کند، مطمئناً راه حلی پیدا می کند
6. Depth First Search
در ادامه پیمایش درخت، Depth-First Search روش اصلی دیگر برای یافتن یک عنصر در درخت است. به جای اینکه سطح درخت را پایین بیاورد، شاخه به شاخه درخت را بررسی می کند.
اکنون با فرض اینکه شاخه های بی نهایت گسترده ای نداشته باشد، DFS به طور مشابه همیشه کار خواهد کرد. پیادهسازی این دو الگوریتم جستجو چندان پیچیده نیست، اما آنچه بسیار مهم است، یادگیری زمان استفاده از یکی بر دیگری است. بسیاری از طراحیهای نرمافزاری قادر به درک ساختار اطلاعاتی هستند که با آن کار میکنید و الگوریتمهایی را انتخاب میکنند که برای آن ساختار بهینه میشوند.
7. گرادیان نزول
اکنون برای بسیاری از توسعه دهندگان، Gradient Descent لزوما مفید نخواهد بود. با این حال، اگر چیزی را با رگرسیون یا یادگیری ماشین لمس می کنید، Gradient Descent در قلب کار شما خواهد بود.
Gradient Descent روشی برای بهینهسازی توابع با استفاده از حساب دیفرانسیل و انتگرال است. در زمینه رگرسیون و یادگیری ماشینی، این به معنای یافتن مقادیر خاصی است که خطا را در الگوریتم پیشبینی شما به حداقل میرساند. در حالی که مطمئناً بسیاری از این الگوریتمهای دیگر از نظر ریاضی بیشتر درگیر هستند، اگر به طور قابل توجهی با دادهها و پیشبینیها کار میکنید، درک نحوه عملکرد نزول گرادیان بسیار مهم است.
8. الگوریتم دایجسترا
یکی دیگر از مسائل بسیار مهمی که توسعه دهندگان با آن کار می کنند، مسیریابی است. نمودارها راهی فوق العاده همه کاره برای توصیف انواع مشکلاتی هستند که شبکه هایی از اشیاء متمایز را در بر می گیرند.
الگوریتم Dijkstra راهی برای یافتن سریعترین مسیر بین دو گره در یک گراف است. این پایه و اساس اکثر کارهای انجام شده در مسیریابی است و خود را در هر چیزی از هوش مصنوعی گرفته تا طراحی بازی مورد استفاده قرار می دهد.
9. تبادل کلید Diffie-Hellman
تبادل کلید Diffie-Hellman مقدمه ای عالی برای چگونگی کارکرد رمزنگاری است. به طور خاص، تبادل کلید Diffie-Hellman با ترکیب کلیدهای عمومی و خصوصی (که در واقع اعداد طولانی هستند) برای رمزگذاری اطلاعات هنگام انتقال بین طرف های مختلف کار می کند.
حتی اگر در زمینه امنیت سایبری کار نمی کنید، داشتن درک درست از رمزگذاری و ارتباطات ایمن برای کار به عنوان یک توسعه دهنده بسیار مهم است. علاوه بر این، حتی اگر Diffie-Hellman از بهترین الگوریتم فاصله دارد، پیاده سازی آن فوق العاده آسان است و به اندازه کافی شبیه به سایر روش های ارتباطی رمزگذاری شده است.
10. انجام مسائل تمرینی
این نه الگوریتم اول همگی راه هایی را برای حل کهن الگوهای مشکلاتی که ممکن است به عنوان یک توسعه دهنده با آن مواجه شوید، به شما ارائه می دهند. با این حال، واقعیت این است که به عنوان یک توسعهدهنده اغلب با مشکلات الگوریتمی کاملاً جدید مواجه میشوید. به همین دلیل است که مهمتر از به خاطر سپردن هر الگوریتم، توسعه توانایی حل مسائل به صورت الگوریتمی است.
خوشبختانه، هیچ کمبودی در وب سایت برای تمرین وجود ندارد. برخی از موارد مورد علاقه ما عبارتند از:
اینها محیط های بسیار خوبی برای یافتن مشکلات الگوریتمی دشوار و در عین حال کامل هستند و مهارت های خود را تقویت می کنند.