طراحی الگوریتم و ساختمان دادهها
سلام دوستان
من حدود 3 سال سابقه برنامه نویسی اندروید دارم و رشته دانشگاهی و هنرستانم نرم افزار کامپیوتر هست. جدیدا دنبال این هستم که در یک شرکت خوب کار کنم که یکی از این شرکت ها گروه حصین هست. من مشکلی با تخصص های مورد نیاز برای کار در بخش برنامه نویسی اندروید این شرکت ندارم تنها مشکل من که واقعا موندم چیکار باید بکنم مهارت های عمومی ای هست که هر برنامه نویس باید داشته باشه تا بتونه وارد این شرکت بشه. یکی ازمهارت ها آشنایی کافی با مباحث طراحی الگوریتم و ساختمان دادهها هست. من با اینکه رشته دانشگاهیم کامپیوتر بوده هیچ وقت نفهمیدم دروس ساختمان داده ها و طراحی الگوریتم در ساخت برنامه های واقعی به چه دردی می خوره(دوستان من با مفهوم الگوریتم و ایجاد الگوریتم آشنا هستم فقط این دروس دانشگاه رو نمیدونم به چه دردی می خورد)
لطفا دوستان با سابقه من رو راهنمایی کنن که یادگیری طراحی الگوریتم و ساختمان داده ها چه تاثیری در کد نویسی و کیفیت برنامه نویسی داره؟ مثلا تسلط بر ساختارهای داده ای استاندارد مثل List و Queue و Map و Stack و همچنین الگوریتم هایی مانند Sort و Search چه سودی داره؟ اگر واقعا مفیده لطفا یه منبع خوب به من معرفی کنید.
این متنی هست که در وبلاگ این شرکت نوشته شده: آدرس وبلاگ
نقل قول:
محبوبیت صنعت نرم افزار، و در دسترس بودن منابع آموزش فراوان در دنیای وب، موجب شده است تعداد زیادی برنامه نویس وجود داشته باشد. اما متاسفانه بسیاری از برنامه نویسان (تاکید می کنم، بسیاری از برنامه نویسان)، دانش عمیق کافی ندارند.
اکثر برنامه نویسان تعداد کمی مفاهیم اولیه برنامه نویسی (مانند متغیر، آرایه، حلقه تکرار، شرط، و همچنین الگوریتم های اولیه) را یاد می گیرند و سپس شروع به نوشتن برنامه می کنند. این موجب می شود که چنین برنامه نویسی، در زبان شی گرای #C با امکانات زیاد، کد رویه ای C بزند و سعی کند با این کد مساله خود را حل کند.
کار کردن با دانش سطحی برنامه نویسی اگر چه غیر ممکن نیست، اما چنین برنامه نویسانی نمی توانند در تولید سیستم های بزرگ یا پیچیده نقش جدی داشته باشند.
نقل قول: طراحی الگوریتم و ساختمان دادهها
در جاوا یا هر زبان دیگه ای خیلی از کلاس ها از قبل نوشته شدن و در قالب Library هایی در اختیار شما گذاشتن که میتونید ازشون استفاده کنید بدون اینکه پیاده سازیش رو بدونید.
اما این داده ساختارهایی که گفتید خیلی ابتدایی هستند و به نظرم حتما باید بدونید. فرضا نخواید خودتون پیاده سازی کنید، ولی وقتی تفاوت Stack با Queue یا نمیدونم اینکه LinkedList چطور کار میکنه و... رو ندونید، یا نمیتونید از کلاس درست، در جایی که درسته استفاده کنید و یا اینکه ممکنه گزینه بهتر و سریعتری وجود داشته باشه ولی شما از راه کندتری استفاده کنید.
پس میشه دونستن ساختمان داده رو به چند سطح تقسیم کرد:
1- دونستن عملکرد بیرونی یک کلاس داده ساختار Queue، Stack و... - مثلا در این حد بدونید که صف (Queue) هر عنصری رو زودتر بهش اضافه کردید، در گرفتنش هم زودتر pop میشه. و یکسری تفاوت های بین pop و peek و... . یا مثلا Stack برخلاف صف هست.
2- دونستن عملکرد داخلی یک کلاس داده ساختار بدون دانستن جزئیات پیاده سازی - خیلی وقت ها در این سطح کافیه. خصوصا در مورد کلاس های پیچیده. شما بدونید چیکار میخواد بکنه ولی نیازی نیست حتما پیدا سازیش رو بدونید. وقتی تا حدودی این رو بدونید، میدونید تقریبا پیچیدگی زمانیش چقدره و... . به هر حال اکثر اوقات این سطح کفایت میکنه. هر چند باز هم در مورد کلاس های خیلی ساده لازمه پیاده سازیش رو بدونید
3- دونستن عملکرد داخلی یک کلاس داده ساختار با دانستن جزئیات پیاده سازی - در این مرحله شما الگوریتم لازم برای اون داده ساختار هم میدونید. درسته خیلی کلاس ها از قبل نوشته شدن، ولی با این سطح دانش علاوه بر اینکه میتونید خودتون بنویسید، میتونید بسته به نیازتون تغییرش بدید و یا کلا یک داده ساختار ابتکاری بنویسید.
اگر شما در سطح یک از یک کلاس استفاده کنید، نمیتونید اون رو تغییر بدید (که ممکنه خیلی وقتها به کارتون نیاد)
ولی در کل بستگی داره شما میخواید در چه سطحی برنامه بنویسید. اگر قراره برنامه های خیلی روتین بنویسید، بله شاید نیازی نباشه ساختمان داده و طراحی الگوریتم رو بدونید (هر چند در این سطح هم میگم شاید، چون خیلی بده ندونید). اما اگر برنامه نویسی باشید که قراره یه مسئله ای رو حل کنه، این مسائل ابتدایی که هیچی، خیلی بیشترش رو هم باید بدونید تا بتونید خودتون هم ابتکار به خرج بدید.
نقل قول: طراحی الگوریتم و ساختمان دادهها
در خصوص Search، اگر شما عملکرد Search های مختلف رو بدونید، ممکنه بنا به ساختار دادههاتون، از Search های مختلف استفاده کنید. بازم میگم شاید لازم نباشه در سطح سوم یعنی جزئیات پیاده سازیش رو بدونید ولی در سطح دوم به نظرم الزامیه.
مثلا فرض کنید شما داده هاتون مرتبط شده نیست و معمولا جستجوها در داده های اخیر صورت میگیره. با اینکه QuickSearch عملکرد خوبی داره، اما لازمه اون sort بودن داده است. در نتیجه ممکنه جستجو خطی (یعنی مثلا از آخرین داده به سمت اولین داده) از اینکه بیایید داده رو Sort کنید و بعد Search کنید مفیدتر باشه. یا مثلا چون سرچتون زیاده و اضافه کردن داده هاتون کمه، بهتر اینه همیشه لیستتون رو مرتب شده نگه دارید. کلا تا این حد که دیگه لازمه!