
بسیاری از کتابهای ساختمان دادهها و الگوریتمها با هدف آماده سازی دانشجو برای درسهای دانشگاهی یا موفقیت در آزمونهای استخدامی نوشته شدهاند. این کتاب مسیر متفاوتی را انتخاب میکند.
هدف اصلی کتاب، آموزش مجموعهای از ساختمان دادهها و الگوریتمهای کمتر معمول اما کاربردی است؛ مفاهیمی که ممکن است در برنامه درسی مقدماتی دانشگاه به آنها پرداخته نشود، اما هنگام ساخت ابزارهای حرفهای نرم افزاری و حل مسائل واقعی برنامه نویسی میتوانند بسیار ارزشمند باشند.
نویسنده تلاش میکند الگوریتمها را نه به عنوان مجموعهای از فرمولها و اثباتهای پیچیده، بلکه به عنوان ابزارهایی برای قرار گرفتن در جعبه ابزار یک برنامه نویس حرفهای معرفی کند.
این نگاه باعث شده کتاب بیشتر از آنکه یک کتاب دانشگاهی سنتی باشد، رویکردی کاربردی و مهندسی داشته باشد.
در این کتاب خبری از اثباتهای رسمی دشوار، معادلات پیچیده یا مجموعه تمرینهای پایان فصل به سبک کتابهای دانشگاهی نیست. تمرکز اصلی روی ایدههایی است که میتوان آنها را در برنامههای واقعی به کار گرفت.
یکی از ویژگیهای اصلی کتاب، انتخاب موضوعات آن است.
ساختمان دادههایی مانند پشته، صف و فهرست پیوندی برای بسیاری از برنامه نویسان آشنا هستند؛ اما کتاب نسخههای خاص و کمتر شناخته شدهای از این ساختارها را بررسی میکند.
برای مثال، خواننده با پشتهها و صفهای تغییرناپذیر، ساختارهای ویژه برای بازگردانی و اجرای دوباره عملیات، فهرستهای سریع برای اتصال و ساختارهای درختی پیشرفته آشنا میشود.
در بخش الگوریتمها نیز موضوعاتی مانند جستجوی عقبگرد، رنگ آمیزی نقشه، تخصیص ثبات، زمان بندی، چاپ زیبای کد، استنتاج نوع، تعمیم معکوس، احتمال، استدلال بیزی و فرایندهای مارکوف بررسی میشوند.
هدف این نیست که صرفاً الگوریتمهای بیشتری حفظ کنید؛ هدف این است که روشهای بیشتری برای فکر کردن درباره مسائل برنامه نویسی در اختیار داشته باشید.
اگر به صورت حرفهای نرم افزار تولید میکنید و میخواهید دانش خود را در زمینه ساختمان دادهها و الگوریتمهای پیشرفتهتر گسترش دهید، این کتاب میتواند انتخاب مناسبی باشد.
تمرکز بر مسائل واقعی توسعه ابزارهای نرم افزاری باعث شده مثالها ارتباط نزدیکی با نیازهای مهندسی نرم افزار داشته باشند.
این کتاب به برنامه نویس کمک میکند فراتر از ساختمان دادهها و الگوریتمهای متداول فکر کند.
مطالعه ساختمان دادهها و الگوریتمها لزوماً نباید فقط برای دانشگاه یا استخدام باشد.
برخی الگوریتمها به دلیل ایدههای جالب و غیرمعمول خود جذاب هستند. کتاب نیز بخشی از مطالب را به همین دلیل انتخاب کرده است.
اگر از ساختن برنامه و مشاهده اینکه یک ایده به یک نرم افزار واقعی تبدیل میشود لذت میبرید، رویکرد این کتاب میتواند برای شما جذاب باشد.
کلمات کلیدی:دانشجویانی که مبانی ساختمان دادهها و الگوریتمها را پشت سر گذاشتهاند، میتوانند با مطالعه این کتاب دید گستردهتری نسبت به کاربرد این مفاهیم پیدا کنند.
کتاب میتواند فاصله میان مباحث مقدماتی دانشگاه و مسائل پیچیدهتر مهندسی نرم افزار را کاهش دهد.
آشنایی با زبان سیشارپ برای مطالعه کتاب ایدهآل است، اما تنها راه ورود به مطالب نیست.
نمونههای برنامه نویسی با سیشارپ نوشته شدهاند، اما الگوریتمهای ارائه شده به گونهای هستند که برنامه نویسان آشنا با زبانهای جاوا، سیپلاسپلاس یا پایتون نیز بتوانند بخش زیادی از مطالب را دنبال کنند.
همچنین آشنایی مقدماتی با ساختمان دادهها و الگوریتمهای پایه میتواند درک فصلهای پیشرفتهتر را آسانتر کند.
یکی از موضوعات مهم بخش نخست کتاب، بررسی نسخههای خاصی از ساختمان دادههای آشنا است.
در ساختمان دادههای تغییرناپذیر، پس از ایجاد ساختار، تغییر مستقیم آن انجام نمیشود؛ بلکه برای ایجاد وضعیت جدید، ساختار مناسب دیگری تولید میشود.
این روش میتواند در طراحی برخی نرم افزارها مزایای مهمی داشته باشد و به ویژه در شرایطی که مدیریت تغییرات داده اهمیت دارد، رویکرد متفاوتی در اختیار برنامه نویس قرار دهد.
کتاب به نسخههای مختلف پشته و صف میپردازد و نشان میدهد چگونه میتوان این ساختمان دادههای ساده را برای کاربردهای تخصصیتر طراحی کرد.
یکی از موضوعات مورد بررسی، ساختارهایی است که برای بازگردانی و اجرای دوباره عملیات مناسب هستند.
این مفهوم در بسیاری از ابزارهای نرم افزاری کاربرد دارد؛ زیرا نرم افزارها گاهی باید بتوانند تغییرات انجام شده را معکوس کنند یا دوباره اجرا کنند.
یکی از ساختمان دادههای غیرمعمول معرفی شده در کتاب، فهرست هیوز است.
این ساختار برای اتصال سریع بخشهای مختلف فهرست طراحی شده است، اما در مقابل، عملیات حذف از آن هزینه بیشتری دارد.
این مثال به خوبی نشان میدهد که در طراحی ساختمان دادهها معمولاً نمیتوان همه عملیات را همزمان بهینه کرد.
انتخاب ساختمان داده مناسب به نوع عملیاتی بستگی دارد که برنامه بیشتر انجام میدهد.
در یکی از فصلهای بخش نخست، ساخت یک صف دو سر با استفاده از درخت انگشتی بررسی میشود.
صف دو سر ساختاری است که امکان افزودن و حذف داده از هر دو طرف را فراهم میکند.
استفاده از یک ساختار درختی پیشرفته برای پیاده سازی چنین قابلیتی، نمونهای مناسب از این موضوع است که چگونه میتوان ساختمان دادههای مختلف را با یکدیگر ترکیب کرد تا ویژگیهای مطلوبی به دست آید.
کتاب در ادامه به استفاده از درختهای چهاربخشی همراه با ذخیره سازی نتایج محاسبات میپردازد.
این روش برای پیاده سازی یک خودکار سلولی بسیار سریع مورد استفاده قرار میگیرد.
این بخش نمونهای جالب از ترکیب ساختمان داده مناسب، بهینه سازی محاسبات و ذخیره نتایج قبلی است.
چنین ایدههایی در بسیاری از مسائل محاسباتی قابل استفاده هستند؛ مخصوصاً زمانی که یک مسئله شامل محاسبات تکراری باشد.
در بخش دیگری از کتاب، ساخت فهرستهای فشرده واژهها با استفاده از گراف واژهای جهت دار بدون دور بررسی میشود.
این ساختار میتواند برای نمایش تعداد زیادی واژه با مصرف حافظه کمتر مفید باشد.
همچنین کتاب نحوه بهینه سازی یک خودکار متناهی را بررسی میکند.
این فصل نشان میدهد که چگونه انتخاب دقیق ساختار داده میتواند روی مصرف حافظه و سرعت اجرای یک برنامه تأثیر بگذارد.
یکی از مباحث مهم دیگر کتاب، الگوریتمهای مربوط به شمارش و تولید ترکیبها و جایگشتها است.
این موضوع علاوه بر کاربردهای مستقیم در برنامه نویسی، ارتباط جالبی با علم ترکیبیات دارد.
در این بخش خواننده با روشهای مختلف نگاه کردن به ساختار اعداد صحیح از دیدگاه ترکیبیاتی آشنا میشود.
بخش دوم کتاب وارد الگوریتمهایی میشود که نویسنده آنها را هنگام ساخت ابزارهای پیشرفته توسعه نرم افزار آموخته است.
یکی از این الگوریتمها، جستجوی عقبگرد است.
این روش برای حل مسائل مختلفی کاربرد دارد که باید مجموعهای از انتخابها را بررسی کرده و در صورت رسیدن به مسیر نامناسب، به مرحله قبلی بازگردد.
کتاب از مسئله رنگ آمیزی نقشه برای توضیح این مفهوم استفاده میکند.
اما کاربرد این الگوریتم به مسائل سرگرم کننده محدود نیست.
نویسنده نشان میدهد همین ایده میتواند برای مسائل متفاوتی مانند تخصیص ثبات در برنامهها و زمان بندی پروازهای فرودگاه نیز مورد استفاده قرار گیرد.
یکی دیگر از موضوعات کاربردی کتاب، الگوریتم مربوط به قالب بندی مناسب کد منبع است.
نمایش خوانا و منظم کد برای توسعه دهندگان اهمیت زیادی دارد و ابزارهای توسعه نرم افزار معمولاً باید بتوانند کد را بر اساس قواعد مشخص قالب بندی کنند.
این فصل به بررسی الگوریتمی میپردازد که برای چنین کاری استفاده میشود و نشان میدهد یک مسئله ظاهراً ساده چگونه میتواند به یک مسئله الگوریتمی جالب تبدیل شود.
در فصل دیگری، مفهوم یکسان سازی برای حل مسائل منطقی عمومی بررسی میشود.
یکی از کاربردهای مهم این مفهوم، استنتاج نوع است؛ یعنی سامانه بتواند بر اساس نحوه استفاده از یک مقدار یا عبارت، نوع مناسب آن را تشخیص دهد.
این موضوع ارتباط مستقیمی با طراحی زبانهای برنامه نویسی و سامانههای نوع دارد.
کتاب علاوه بر یکسان سازی، مفهوم تعمیم معکوس را نیز بررسی میکند.
در این روش، هدف میتواند پیدا کردن الگوهای مشترک میان نمونههای مختلف باشد.
این مفهوم دیدگاه متفاوتی نسبت به دادهها و روابط میان آنها ارائه میدهد و میتواند برای استنتاج الگو از نمونهها مفید باشد.
بخش سوم کتاب مسیر متفاوتی را دنبال میکند و وارد دنیای احتمال و استدلال در شرایط عدم قطعیت میشود.
نویسنده معتقد است نرم افزارهای مدرن بیش از گذشته مجبور هستند در شرایطی تصمیم گیری کنند که اطلاعات کامل و قطعی در اختیار آنها نیست.
در چنین شرایطی، داشتن ابزارهای اصولی برای کار با مقادیر تصادفی و احتمال میتواند کیفیت تصمیم گیری را بهبود دهد.
هدف اصلی این بخش تنها آموزش احتمال نیست؛ بلکه وارد کردن استدلال بیزی به جعبه ابزار برنامه نویس است.
کار با مقادیر تصادفی در برنامههایی مانند بازیها، شبیه سازیها و سامانههایی که باید رفتارهای غیرقطعی داشته باشند اهمیت زیادی دارد.
کتاب تلاش میکند روش قدرتمندتری برای نمایش و کار با چنین مقادیری ارائه دهد.
این موضوع به برنامه نویس کمک میکند به جای تکیه بر روشهای محدود و ساده، ابزارهای دقیقتری برای مدل سازی عدم قطعیت داشته باشد.
یکی از مثالهای عملی این بخش، طراحی الگوریتمهایی برای شبیه سازی پرتاب تاسهای نامنصفانه است.
در یک تاس معمولی، احتمال رخ دادن هر وجه برابر است؛ اما در یک مدل نامنصفانه، احتمال رخ دادن نتایج مختلف میتواند متفاوت باشد.
کتاب با استفاده از چنین مسئلهای، مفاهیم مربوط به توزیع احتمال و شبیه سازی را به شکل عملی بررسی میکند.
یکی از مهمترین مباحث کتاب، استفاده از قضیه بیز برای استدلال درباره علتهای احتمالی بر اساس نتایج مشاهده شده است.
در بسیاری از مسائل واقعی، برنامه به جای اینکه مستقیماً علت یک اتفاق را بداند، تنها اثر یا نتیجه آن را مشاهده میکند.
استدلال بیزی روشی اصولی برای حرکت از نتیجه مشاهده شده به سمت علتهای محتمل در اختیار برنامه نویس قرار میدهد.
این مفهوم میتواند در طراحی سامانههای تصمیم گیر، تحلیل داده و برنامههایی که با اطلاعات ناقص سروکار دارند کاربرد داشته باشد.
کتاب در ادامه به الگوریتمهای نمونه برداری از انواع مختلف توزیعهای پیوسته میپردازد.
این موضوع برای برنامههایی که با پدیدههای تصادفی و مقادیر پیوسته سروکار دارند اهمیت زیادی دارد.
نمونه برداری مناسب از توزیعهای احتمال میتواند در شبیه سازی، مدل سازی آماری و سامانههای تصمیم گیر مورد استفاده قرار گیرد.
در فصل پایانی، ارتباط میان تولید متن مبتنی بر فرایندهای مارکوف و استدلال بیزی برای مدلهای پیوسته بررسی میشود.
این موضوع نمونهای از ارتباط میان مفاهیم ظاهراً متفاوت در علوم کامپیوتر و ریاضیات است.
خواننده در طول کتاب با چنین ارتباطهایی بارها مواجه میشود و درمییابد که ساختمان دادهها، الگوریتمها، احتمال و مفاهیم ریاضی میتوانند در یک مسئله واقعی به یکدیگر متصل شوند.
در بخشهای مختلف کتاب، نویسنده به ارتباط میان انواع عمومی، دنبالهها، توزیعهای احتمال و نظریه ردهها اشاره میکند.
این قسمتها مانند فصلهای مستقل میان بخشهای اصلی قرار گرفتهاند و هدف آنها نشان دادن ارتباطهای عمیقتر میان مفاهیم مختلف است.
این مباحث برای خوانندهای که به مبانی نظری علوم کامپیوتر علاقه دارد میتواند دیدگاه متفاوتی ایجاد کند.
کتاب در سه بخش اصلی سازمان یافته است.
این بخش از مبانی آغاز میشود و سپس به ساختمان دادههای پیشرفتهتر میرسد.
موضوعات اصلی آن شامل موارد زیر است:
پشتهها و صفهای تغییرناپذیر
پشتههای بازگردانی و اجرای دوباره عملیات
فهرست هیوز
صف دو سر
درخت انگشتی
درختهای چهاربخشی
خودکارهای سلولی
فهرستهای فشرده واژهها
گراف واژهای جهت دار بدون دور
خودکارهای متناهی
ترکیبها و جایگشتها
این بخش روی الگوریتمهایی تمرکز دارد که در ساخت ابزارهای پیشرفته برنامه نویسی کاربرد دارند.
موضوعات آن شامل:
جستجوی عقبگرد
رنگ آمیزی نقشه
تخصیص ثبات
زمان بندی
قالب بندی کد منبع
یکسان سازی
استنتاج نوع
تعمیم معکوس
بخش سوم به تصمیم گیری در شرایط عدم قطعیت اختصاص دارد و شامل موضوعاتی مانند:
مقادیر تصادفی
شبیه سازی تاسهای نامنصفانه
توزیعهای احتمال
قضیه بیز
استدلال احتمالاتی
توزیعهای پیوسته
نمونه برداری
فرایندهای مارکوف
تولید متن
تمام نمونههای برنامه نویسی کتاب با زبان سیشارپ مدرن نوشته شدهاند.
با این حال، ایدههای الگوریتمی ارائه شده وابستگی شدیدی به یک زبان خاص ندارند.
به همین دلیل، برنامه نویسانی که با زبانهایی مانند جاوا، سیپلاسپلاس یا پایتون کار کردهاند نیز میتوانند بخش زیادی از مطالب را دنبال کنند و الگوریتمها را در زبان مورد استفاده خود پیاده سازی کنند.
تمرکز اصلی کتاب بر ایده و الگوریتم است، نه وابستگی به یک زبان برنامه نویسی خاص.
فصلهای هر بخش بر اساس مطالب قبلی ساخته شدهاند و بهتر است بخشها به ترتیب مطالعه شوند.
با این حال، سه بخش اصلی کتاب میتوانند تا حد زیادی مستقل از یکدیگر نیز مطالعه شوند.
خوانندهای که به ساختمان دادههای پیشرفته علاقه دارد میتواند روی بخش نخست تمرکز کند، در حالی که برنامه نویسان علاقهمند به ابزارهای توسعه نرم افزار میتوانند بخش دوم را دنبال کنند.
افرادی که به احتمال و تصمیم گیری علاقه دارند نیز میتوانند بخش سوم را مطالعه کنند.
یکی از مهمترین مهارتهای یک برنامه نویس حرفهای، داشتن مجموعهای متنوع از روشهای حل مسئله است.
گاهی یک مسئله با ساختمان دادههای معمول به سادگی حل نمیشود. در چنین شرایطی، شناخت ساختارهای کمتر شناخته شده میتواند راه حل کاملاً متفاوتی ایجاد کند.
این کتاب به شما یاد میدهد که هنگام مواجهه با یک مسئله، تنها به ابزارهای آشنای خود محدود نباشید.
از سوی دیگر، مثالهای کتاب نشان میدهند که مفاهیم علوم کامپیوتر زمانی ارزش واقعی خود را نشان میدهند که در حل مسئله به کار گرفته شوند.
ساختمان دادهها، الگوریتمها، احتمال و مفاهیم نظری در این کتاب از حالت کاملاً دانشگاهی خارج شده و در قالب مسائل قابل لمس برنامه نویسی بررسی میشوند.
«ساختمان دادهها و الگوریتمهای غیرمتعارف» کتابی برای برنامه نویسانی است که میخواهند از مجموعه الگوریتمها و ساختمان دادههای متداول فراتر بروند.
کتاب به جای تمرکز بر مسائل معمول آزمونهای استخدامی یا ارائه یک متن دانشگاهی سنتی، مجموعهای از ساختمان دادههای غیرمعمول، الگوریتمهای کاربردی و ایدههای ریاضی مرتبط با برنامه نویسی را ارائه میکند.
از پشتهها و صفهای تغییرناپذیر گرفته تا درختهای انگشتی، گرافهای واژهای، جستجوی عقبگرد، استنتاج نوع و استدلال بیزی، هر بخش تلاش میکند یک ابزار فکری جدید به برنامه نویس اضافه کند.
ارزش اصلی کتاب در گسترش جعبه ابزار ذهنی برنامه نویس برای حل مسائل واقعی است.
اگر به ساختمان دادهها، الگوریتمها، طراحی زبانهای برنامه نویسی، ابزارهای توسعه نرم افزار، احتمال یا روشهای پیشرفته حل مسئله علاقه دارید، این کتاب میتواند دانش شما را فراتر از مباحث استاندارد و تکراری ببرد.
نمونه چاپ کتاب موجود نیست.
نظرات کاربران (0)