مقدمه مقاله ساختمان داده و الگوریتم
ساختمان داده یا Data Structure روشی برنامهریزیشده برای ذخیرهسازی دادههاست تا بتوانیم از دادهها بهطور موثر استفاده کنیم. تقریباً هر برنامهی کاربردی از انواع مختلفی از ساختماندادهها به روشی متنوع استفاده می کند و الگوریتم Algorithm فرآیند یا مجموعه ای از قوانین مورد نیاز برای انجام محاسبات یا برخی عملیات حل مسئله توسط کامپیوتر است.
در پایان این پست، میتوانید انواع مختلف ساختمان داده و الگوریتم را برای هر مسئلهای ارزیابی کنید و یک راهحل را بر اساس انتخابهای طراحی خود پیادهسازی کنید.
ساختمان داده چیست؟
ساختمان داده را میتوان به عنوان گروهی از عناصر داده تعریف کرد که روشی کارآمد برای ذخیره و سازماندهی دادهها در کامپیوتر فراهم میکند تا بتوان از آنها به طور مؤثر استفاده کرد. برخی از نمونههای ساختمان دادهها، آرایهها، لیست پیوندی، پشته، صف و غیره هستند. ساختمانهای داده تقریباً در هر جنبهای از علوم کامپیوتر مانند سیستمعامل، طراحی کامپایلر، هوش مصنوعی، گرافیک و بسیاری موارد دیگر به طور گسترده استفاده میشوند.
ساختمانهای داده بخش اصلی بسیاری از الگوریتمهای علوم کامپیوتر هستند زیرا برنامهنویسان را قادر میسازند تا دادهها را به روشی کارآمد مدیریت کنند که این امر نقشی حیاتی در افزایش عملکرد و کارایی یک نرم افزار یا یک برنامه ایفا میکند، زیرا وظیفهی اصلی نرم افزار ذخیره و بازیابی اطلاعات کاربر در سریعترین زمان ممکن است.
اصطلاحات پایه در ساختمان داده و الگوریتم
ساختمانهای داده بلوکهای سازنده هر برنامه یا نرم افزار هستند. انتخاب ساختمان دادهی مناسب برای یک برنامه سختترین کار برای یک برنامه نویس است. تا آنجا که به ساختمانداده مربوط میشود از اصطلاحات زیر استفاده میگردد:
- Data: دادهها را میتوان به عنوان یک مقدار ابتدایی یا مجموعهای از مقادیر تعریف کرد، به عنوان مثال، نام دانش آموز و شناسه آن دادههای مربوط به دانش آموز است.
- Groups Items: اقلام دادهای که دارای اقلام دادهی فرعی هستند، آیتم گروهی یا Groups Item نامیده میشوند، به عنوان مثال، نام دانش آموز می تواند دارای نام و نام خانوادگی باشد.
- Record: رکورد را میتوان به عنوان مجموعهای از آیتمهای مختلف داده تعریف کرد، به عنوان مثال، اگر در مورد موجودیت دانشجو صحبت کنیم، نام، آدرس، دوره و نمرات آن را میتوان با هم گروهبندی کرد تا رکوردی برای دانشآموز تشکیل شود.
- File: یک فایل شامل مجموعهای از رکوردهای مختلف از یک نوع موجودیت است، به عنوان مثال، اگر در کلاسی ۲۰ کارمند وجود داشته باشد، در فایل مربوط به کلاس ۲۰ رکورد وجود خواهد داشت که هر رکورد حاوی دادههای مربوط به هر کارمند است.
- Attribute and Entity: یک موجودیت نشان دهندهی کلاس اشیاء خاص است که شامل ویژگیهای مختلفی میباشد. هر ویژگی نشان دهندهی خصوصیت خاص آن موجودیت است.
- فیلد: فیلد یک واحد ابتدایی اطلاعات است که نشان دهندهی ویژگی یک موجودیت است.
چنانچه میخواهید در مورد اصطلاحات پایه ساختمان داده و الگوریتم بیشتر بدانید میتوانید به مقالات آموزشی فرادرس مراجعه کنید.
نیاز به ساختمان داده
از آنجایی که روز به روز برنامهها پیچیدهتر میشوند و حجم دادهها افزایش مییابد، ممکن است مشکلات زیر ایجاد شود:
- سرعت پردازشگر: برای رسیدگی به حجم بسیار زیاد دادهها، پردازشی با سرعت بالا مورد نیاز است، اما از آنجایی که دادهها روز به روز در حال افزایش بوده و به میلیاردها فایل در هر موجودیت میرسند، ممکن است پردازنده نتواند با این حجم از داده مقابله کند.
- جستجوی دادهها: اندازه موجودی ۱۰۰ مورد، در یک فروشگاه را در نظر بگیرید، اگر برنامهی ما نیاز به جستجوی یک کالای خاص داشته باشد، باید هر بار ۱۰۰ مورد را طی کند، در نتیجه روند جستجو را کند میکند.
- درخواستهای چندگانه: اگر هزاران کاربر به طور همزمان دادهها را در یک وب سرور جستجو کنند، این احتمال وجود دارد که یک سرور بسیار بزرگ در طول آن فرآیند از کار بیفتد.
برای حل مشکلات فوق از ساختمانهای داده استفاده میشود. دادهها به گونهای سازماندهی میشوند که یک ساختمان داده را تشکیل دهند به گونهای که همه موارد نیازی به جستجو ندارند و می توان دادههای مورد نیاز را بلافاصه جستجو کرد.
مزایای ساختمان داده
مزایای ساختمان داده به شرح زیر است:
- کارایی: کارایی یک برنامه به انتخاب نوع ساختمان داده بستگی دارد. به عنوان مثال: فرض کنید، ما مقداری داده داریم و باید جستجوی یک رکورد را به صورت عمودی انجام دهیم. در این صورت، اگر دادههای خود را در یک آرایه سازماندهی کنیم، باید عنصر به عنصر را به صورت متوالی جستجو کنیم. بنابراین، استفاده از آرایه ممکن است در اینجا خیلی کارآمد نباشد. ساختمانهای دادهی بهتری وجود دارد که میتوانند فرآیند جستجو را کارآمد کنند مانند آرایه مرتب، درخت جستجوی باینری یا جداول hash.
- قابلیت استفاده مجدد: ساختمانهای داده قابلیت استفادهی مجدد را دارند، یعنی زمانی که یک ساختمان دادهی خاص را پیادهسازی کردیم، می توانیم از آن در هر مکان دیگری هم استفاده کنیم. پیاده سازی ساختمانهای داده را میتوان در کتابخانههایی کامپایل کرد که توسط مشتریان مختلف قابل استفاده باشد.
- تجرید: ساختمانداده توسط ADT مشخص میشود که سطحی از انتزاع را ارائه می دهد. برنامه مشتری از ساختمانداده فقط از طریق رابط استفاده میکند، بدون اینکه وارد جزئیات پیاده سازی شود.
طبقه بندی ساختمان دادهها
در مبحث ساختمان داده و الگوریتم، ساختمان دادهها به دو دسته دادههای خطی و دادههای غیر خطی تقسیم بندی میشوند. این دسته بندی بر اساس سازماندهی عنصر دادهها انجام میپذیرد.
ساختمان دادههای خطی
ساختمان دادهای خطی نامیده میشود که تمام عناصر آن به ترتیب و به صورت خطی چیده شوند. در ساختمان دادههای خطی، عناصر به صورت غیر سلسله مراتبی ذخیره میشوند.
انواع ساختمان دادههای خطی در زیر آورده شده است:
- آرایهها: آرایه مجموعهای از دادههای مشابه است و هر آیتم داده را عنصری از آرایه مینامند. نوع دادههای آرایه می تواند هر نوع داده معتبری مانند char، int، float یا double باشد.
عناصر آرایه، نام متغیر یکسانی دارند اما هر یک دارای یک عدد شاخص متفاوت هستند که به عنوان زیرنویس شناخته میشود. آرایه می تواند یک بعدی، دو بعدی یا چند بعدی باشد.
- لیست پیوندی: لیست پیوندی یک ساختمان دادهی خطی است که برای نگهداری یک لیست در حافظه استفاده میشود. میتوان آن را به عنوان مجموعه ای از گرههای ذخیره شده به صورت غیرپیوسته در مکانهای حافظه مشاهده کرد. هر گره از لیست حاوی یک اشارهگر به گره مجاور خود است.
- پشته: پشته یک لیست خطی است که در آن درج و حذف فقط در یک انتها و از یک طرف مجاز است.
پشته یک نوع داده انتزاعی (ADT) است که می تواند در اکثر زبانهای برنامه نویسی پیادهسازی شود. به این علت با نام پشته نامگذاری شده است که مانند یک پشته در دنیای واقعی رفتار می کند، به عنوان مثال: انبوه بشقابها یا دسته کارتها و غیره.
- Queue: صف یک لیست خطی است که در آن عناصر را میتوان فقط در ابتدای صف به نام rear درج کرد و فقط در انتهای دیگر به نام front حذف کرد.
این یک ساختمان داده انتزاعی، شبیه به پشته است. صف در هر دو انتها باز می شود بنابراین از روش First-In-First-Out (FIFO) برای ذخیره اقلام داده پیروی می کند.
ساختمان دادههای غیر خطی
این ساختار داده یک توالی تشکیل نمی دهد، یعنی هر آیتم یا عنصر با دو یا چند آیتم دیگر در یک آرایش غیر خطی مرتبط است. عناصر داده در ساختار متوالی مرتب نشده اند. انواع ساختارهای داده غیر خطی در زیر آورده شده است:
- درخت: درختها ساختمان دادههای چندسطحی با یک رابطه سلسله مراتبی بین عناصر آن به نام گره میباشند. پایینترین گرهها در ارثبری گره برگ نامیده می شوند در حالی که بالاترین گره، گره ریشه نامیده میشود. هر گره حاوی اشارهگرهایی برای اشاره به گرههای مجاور است.
ساختمان دادهی درختی بر اساس رابطه والد-فرزند بین گرهها استوار است. هر گره در درخت به جز گرههای برگ، میتواند بیش از یک فرزند داشته باشد در حالی که هر گره می تواند حداکثر یک والد به جز گره ریشه داشته باشد. درختان را میتوان به دستههای زیادی طبقه بندی کرد.
- نمودارها: نمودارها را میتوان به عنوان نمایش تصویری مجموعهای از عناصر (که با رئوس نشان داده می شود) تعریف کرد که توسط پیوندهایی به نام یالها به هم متصل شدهاند. یک نمودار با درخت متفاوت است به این معنا که یک نمودار میتواند چرخه داشته باشد در حالی که درخت نمیتواند یک چرخه داشته باشد.
عملیات روی ساختمان دادهها
- پیمایش: پیمایش ساختمان داده به معنای بازدید از هر عنصر ساختمان داده، به منظور انجام عملیات خاصی مانند جستجو یا مرتبسازی است. مثال: اگر بخواهیم میانگین نمرات کسب شده توسط دانش آموز را در ۶ موضوع مختلف محاسبه کنیم، باید آرایه کامل نمرات را طی کنیم و مجموع کل را محاسبه کنیم، سپس آن مجموع را بر تعداد موضوعات تقسیم میکنیم.
- درج: درج را میتوان به عنوان فرآیند افزودن عناصر به ساختمانداده در هر مکانی تعریف کرد. اگر اندازه ساختمان داده n باشد، فقط میتوانیم n-1 عنصر داده را در آن وارد کنیم.
- حذف: به فرآیند حذف یک عنصر از ساختمان داده، حذف میگویند. ما میتوانیم یک عنصر را از هر مکان تصادفی در ساختمانداده حذف کنیم. اگر بخواهیم یک عنصر را از یک ساختمان داده خالی حذف کنیم، آنگاه underflow رخ میدهد.
- جستجو: فرآیند یافتن مکان یک عنصر در ساختمان داده را جستجو میگویند. دو نوع جستجو وجود دارد: جستجوی خطی و جستجوی باینری.
- ادغام: هنگامی که دو لیست A و B با اندازههای M و N به ترتیب از نوع عناصر مشابه، به صورت جدا یا وصل شده با هم متصل شوند تا لیست سوم، لیست C با اندازه (M+N) تولید شود، به این فرآیند ادغام میگویند.
- مرتب سازی: فرآیند چیدمان ساختمان دادهها با یک ترتیب خاص به مرتبسازی معروف است. الگوریتمهای زیادی وجود دارد که میتوان از آنها برای انجام مرتبسازی استفاده کرد.
الگوریتم چیست؟
در ادامه پست آموزشی ساختمان داده و الگوریتم به الگوریتم میرسیم. تعریف رسمی یک الگوریتم این است که شامل مجموعه محدودی از دستورالعملها است که با ترتیب خاصی و به صورت گام به گام برای انجام یک کار خاص نوشته میشود. الگوریتم یک برنامه یا کد کامل نیست. بلکه فقط یک راه حل (منطق) برای حل یک مسئله است که میتواند به عنوان یک توصیف غیررسمی با استفاده از یک نمودار، برای جریان یا شبه کد نشان داده شود.
ویژگیهای الگوریتم
- ورودی: یک الگوریتم مقداری ورودی دارد. میتوانیم ۰ یا مقداری، ورودی را به یک الگوریتم ارسال کنیم.
- خروجی: در پایان یک الگوریتم ۱ یا بیشتر خروجی دریافت خواهیم کرد.
- عدم ابهام: یک الگوریتم باید بدون ابهام باشد، به این معنی که دستورالعملهای یک الگوریتم باید واضح و ساده باشند.
- متناهی: یک الگوریتم باید محدود باشد. در اینجا، متناهی به این معنی است که الگوریتم باید شامل تعداد محدودی دستورالعمل باشد، یعنی دستورالعمل ها باید قابل شمارش باشند.
- اثربخشی: یک الگوریتم باید مؤثر باشد زیرا هر دستورالعمل در یک الگوریتم بر فرآیند کلی تأثیر میگذارد.
- مستقل از زبان: یک الگوریتم باید مستقل از زبان باشد تا بتوان دستورالعملهای یک الگوریتم را در هر یک از زبانها با خروجی یکسان پیادهسازی کرد.
جریان داده یک الگوریتم
- مسئله: یک مسئله میتواند یک مسئله در دنیای واقعی یا نمونهای از مسائل دنیای واقعی باشد که برای آن نیاز به ایجاد یک برنامه یا مجموعهی دستورالعملها داریم. مجموعه دستورالعملها به عنوان یک الگوریتم شناخته میشوند.
- الگوریتم: یک الگوریتم برای یک مسئله طراحی میشود که یک روش گام به گام است.
- ورودی: پس از طراحی یک الگوریتم، ورودیهای مورد نیاز و مورد نظر در اختیار الگوریتم قرار میگیرد.
- واحد پردازش: ورودی به واحد پردازش داده میشود و واحد پردازش خروجی مورد نظر را تولید میکند.
- خروجی: خروجی نتیجه یا به عبارتی نتیجه برنامه است.
چرا به الگوریتم نیاز داریم؟
به دلایل زیر به الگوریتم نیاز داریم:
- مقیاس پذیری: به ما در درک مقیاس پذیری کمک میکند. وقتی یک مسئله بزرگ در دنیای واقعی داریم، باید آن را به مراحل کوچک تقسیم کنیم تا به راحتی مسئله را تجزیه و تحلیل کنیم.
- عملکرد: اگر مسئله را بتوان به راحتی به مراحل کوچکتر تقسیم کرد، به این معنی است که حل مسئله امکان پذیر است.
اکنون نمونهای از الگوریتم در برنامهنویسی را بررسی میکنیم. الگوریتمی برای جمع کردن دو عدد وارد شده توسط کاربر مینویسیم. مراحل زیر برای اضافه کردن دو عدد وارد شده توسط کاربر مورد نیاز است:
مرحله ۱: شروع کنید.
مرحله ۲: سه متغیر a, b و sum را تعریف کنید.
مرحله ۳: مقادیر a و b را وارد کنید.
مرحله ۴: مقادیر a و b را جمع کنید و نتیجه را در متغیر sum ذخیره کنید، یعنی sum=a+b.
مرحله ۵: جمع را چاپ کنید.
مرحله ۶: پایان.
ما نمی توانیم مرحله ۳ را قبل از مرحله ۲ انجام دهیم، باید ترتیب خاصی را رعایت کنیم. یک الگوریتم همچنین میگوید که هر دستورالعمل باید با ترتیب خاصی برای انجام یک کار خاص دنبال شود. چنانچه به طراحی الگوریتم علاقه دارید میتوانید از آموزش طراحی الگوریتم فرادرس استفاده نمایید.
عوامل یک الگوریتم
فاکتورهایی که برای طراحی یک الگوریتم باید در نظر بگیریم به شرح زیر است:
- ماژولاریتی: یعنی هر مسئلهای داده شود بتوانیم آن مسئله را به ماژولهای کوچک یا گامهای کوچک تقسیم کنیم.
- درستی: درستی یک الگوریتم زمانی تعریف میشود که ورودیهای داده شده خروجی مورد نظر را تولید کنند، یا به عبارتی تجزیه و تحلیل یک الگوریتم به درستی انجام شده باشد.
- قابلیت نگهداری: در اینجا قابلیت نگهداری به این معناست که الگوریتم باید به شکل ساختاری بسیار ساده طراحی شود تا زمانی که الگوریتم را دوباره تعریف میکنیم، تغییر عمدهای در الگوریتم ایجاد نشود.
- کارکرد: مراحل منطقی مختلفی را برای حل مسائل دنیای واقعی در نظر میگیرد.
- استحکام: استحکام به این معنی است که چگونه یک الگوریتم میتواند مسئله ما را به وضوح تعریف کند.
- کاربر پسند: اگر الگوریتم کاربر پسند نباشد، طراح نمیتواند آن را برای برنامه نویس توضیح دهد.
- سادگی: اگر الگوریتم ساده باشد، درک آن آسان است.
- توسعه پذیری: اگر در آینده هر طراح یا برنامه نویس الگوریتم دیگری، بخواهد از الگوریتم شما استفاده کند، باید بتواند آن را توسعه دهد.
سخن آخر در مورد ساختمان داده و الگوریتم
اهمیت ساختمان داده و الگوریتم به عنوان دو مفهوم و مبحث اساسی در برنامه نویسی بر کسی پوشیده نیست. اگر قصد دارید به عنوان یک برنامه نویس وارد عرصه برنامه نویسی شوید یا به عنوان یک حرفهای در این زمینه فعالیت دارید، در هر صورت باید تمرکز خود را بیشتر معطوف به کارگیری مناسبترین الگوریتم و بهترین ساختمان داده کنید.
مطالبی که برای شما عزیزان شرح داده شد درواقع، مقدمهای بر یادگیری ساختمان داده و الگوریتم به حساب می آید تا نقطهی شروعی برای تلاش بیشتر و حرفهای تر در زمینهی برنامه نویسی باشد. امید آن میرود که مفید واقع شده باشد. منتظر نظرات و پیشنهادات شما هستیم.