اگر زندگی خودمان را در نظر بگیریم، برای چیدن وسایل، یا نظم دادن اطلاعاتمون، از روشهای متفاوتی استفاده میکنیم تا بتوانیم به طور کارآمد از آنها استفاده کنیم، و یا زمانی که نیازشان داریم، راحت پیدایشان کنیم.
چه حسی خواهید داشت اگر دفتر تلفنی (کاغذی) داشته باشید که شماره های آن بصورت تصادفی (random) نوشته شده باشند؟?
تا وقتی که این لیست ترتیب مشخصی نداشته باشد، مجبوریم هر بار برای پیدا کردن یک شماره، تک تک لیست را نگاه کنیم.?
دو تصویر زیر را در نظر بگیرید:
پیدا کردن یک کتاب از بین کتابهای بِهمریخته، زمان و حوصله زیادی می خواد. با مرتب کردن کتابها، نه تنها استفاده هوشمندانه تری از فضا میکنیم، جستجوی کتاب، خیلی آسانتر خواهد شد.
بیایید مثال دیگری را در نظر بگیریم. فرض کنید برای خرید (حضوری) بلیط یک مسابقه مهم به ورزشگاه میروید. در محل، هزاران نفر منتظر هستند تا بلیط بگیرند.
اگر دو تصویر زیر را در نظر بگیریم، کدام روش برای مدیریتِ این موضوع (فروش بلیط) بهتر خواهد بود؟
یکی وضعیتی است که جمعیت انبوه بدون ترتیب، جمع شدهاند و نمیتوانیم بفهمیم چه کسی زودتر رسیده تا به او بلیط بدهیم. اما اگر افراد در یک صف بصورت ساختاریافته منتظر باشند، در اینصورت مدیریت جمعیت آسان خواهد بود و بلیطها را به ترتیب به کسانی که زودتر رسیدهاند میدهیم. این، اشاره به اصطلاح Queue دارد که در دنیای برنامه نویسی کاربرد فراوانی دارد. مفاهیم برنامه نویسی از مریخ نیامدهاند!
بسیاری از "ساختار داده" ها (data structures) از زندگی حقیقی الهام گرفته شده و بیشتر اوقات اصطلاحات مشابهی را به کار میبرند.
فرقی نمیکنه که لیست کارها، فهرست دوستان، قفسه کتابها، برنامه رژیم لاغری، شجرهنامه خانوادگی و یا چارتِ سازمانی و.. تهیه میکنید؛ در اصل دارید تکنیکهای متفاوتی از چینش (arrangement) را استفاده میکنید که در دنیای کامپیوتر "ساختمان داده" صداشون می کنیم.
تا اینجا کمی از ساختمان داده گفتیم؛ اما حالا ببینیم الگوریتم (algorithm) یعنی چه؟
آیا در زندگی روزمره از الگوریتم ها استفاده میکنیم؟ البته که میکنیم. هر بار که از دفتر تلفن قدیمی مان، شماره تلفنی جستجو میکنیم، قطعا برای جستجو از اول دفتر شروع نمی کنیم.
اگر دنبال اسم مثلا حسن باشیم، در صفحاتی که حروف "الف" یا "ب" هستند نگاه نمی کنیم. مستقیم میرویم به صفحه "ح" و دنبال حسن میگردیم.
یا اگر داخل یک کتابچه راهنمای تلفن، دنبال پزشک باشیم، قطعا بخش رستوران ها را نگاه نمی کنیم. اگر دفتر تلفن یا کتابچه راهنمای تلفن را ساختمان داده در نظر بگیریم، در اینصورت روشِ جستجوی اطلاعات خاص الگوریتم نام دارد.
✅ در حالی که ساختمان داده، به ما کمک میکند از داده ها بصورت کارآمد استفاده کنیم، الگوریتم ها کمک مان می کنند اقدامات متفاوتِ کارآیی روی آن داده ها انجام دهیم.
اگر 100هزار شماره تلفن داخل کتابچه راهنما باشند، برای جستجوی یک مورد خاص، اگر از ابتدا شروع کنیم به نگاه کردن، احتمالا زمان زیادی هدر خواهیم داد. اما اگر بدانیم که تلفن پزشک ها در صفحات 200 الی 220 هستند، با جستجوی فقط همین بخش کوچک، بجای کل راهنما، زمان زیادی صرفه جویی میشود.
با اینکه روش فوق، زمان زیادی برایمان صرفهجویی کرد، می توانیم "روش" دیگری برای جستجوی این دکترِ خاص، استفاده کنیم. میتوانیم بصورت الفبایی جستجو کنیم؛ مثل زمانی که کلمات را از دیکشنری پیدا میکنیم. این روش تعداد شمارههای دیده شده و زمان استفاده شده برای جستجو را کاهش میدهد.
رویکردهای متفاوت زیادی برای پیدا کردن راه حلِ یک مشکل می تواند وجود داشته باشد و هر کدام از این رویکردها الگوریتم نام دارند.
برای یک مساله یا وظیفه خاص، می توانیم چندین روش یا الگوریتم بکار بگیریم.
ترجمه ای آزاد از مقدمه ی فصلِ اول کتابِ PHP7 data structures and algorithms را خواندید. سایر مقالات من را در وبسایتم می توانید ببینید.