صفحه‌ی اصلی

صفحه‌ی شخصی مسعود اقدسی‌فام
الگوریتمستان - برنامه‌نویسی و طراحی الگوریتم
RSS Feed
● وب‌گاه مجموعه سوالات منطقه‌ای و جهانی مسابقات برنامه‌نویسی ACM-ICPC، با امکان ارسال پاسخ و بررسی جواب.
● علاقه‌مندان به شرکت در مسابقات برنامه‌نویسی و حل سوالات الگوریتمی می‌توانند از این وب‌گاه معتبر به همراه کتاب‌های معرفی شده جهت تمرین و آمادگی بیشتر استفاده کنند.
امروز: پنجشنبه، 14 اسفند ماه 1393 ، کاربران حاضر در وب‌گاه: 2 نفر
جستجو در نوشته‌های وب‌گاه:   
برنامه‌نویسی ++C
برنامه‌نویسی ++C
مباحث آموزشی زبان برنامه‌نویسی ++C
طراحی الگوریتم‌ها
طراحی الگوریتم‌ها
روش‌های طراحی الگوریتم‌ها و حل مساله
ساختمان داده‌ها
ساختمان داده‌ها
مفاهیم ساختمان داده‌ها و کاربردهای آنها
مسابقات برنامه‌نویسی
مسابقات برنامه‌نویسی
حل مساله و آمادگی مسابقات برنامه‌نویسی
کتاب الکترونیکی
کتاب الکترونیکی
معرفی کتاب‌های الکترونیکی
محاسبات ریاضی
محاسبات ریاضی
معرفی و بررسی الگوریتم‌های محاسباتی
LinkedIn      Cloob

FriendFeed      Twitter

Facebook      Google Plus


الگوریتمستان
معرفی کتاب Programming Challenges برای علاقه‌مندان حل سوالات الگوریتمی و شرکت‌کنندگان مسابقات برنامه‌نویسی با قابلیت دانلود
الگوریتمستان
بررسی مسأله‌ی Simple Addition از سوالات آمادگی مسابقات برنامه‌نویسی
الگوریتمستان
معرفی متغیرهای مرجع در زبان برنامه‌نویسی ++C و آشنایی با مهمترین کاربردهای آنها
الگوریتمستان
آشنایی با روش حریصانه و کاربردهای آن مانند مسأله‌ی خرد کردن پول
الگوریتمستان
آشنایی با درخت جستجوی دودویی (Binary Search Tree) و عملیات جستجو و درج و حذف گره
الگوریتمستان
بحث در مورد مسأله‌ی کاشی‌کاری یا فرش کردن زمین با موزاییک به روش تقسیم و حل
الگوریتمستان
معرفی کتاب Art of Programming Contest برای علاقه‌مندان حل سوالات الگوریتمی و شرکت‌کنندگان مسابقات برنامه‌نویسی با قابلیت دانلود
الگوریتمستان
بررسی روش‌های مختلف محاسبه‌ی ضرایب دوجمله‌ای نیوتن یا ترکیب دو عدد با قطعه کد به زبان برنامه‌نویسی ++C
الگوریتمستان
بررسی مسأله‌ی دوست خوب، از سوالات مسابقات برنامه‌نویسی ACM
الگوریتمستان
بررسی مسأله‌ی مربی ناامید، از سوالات مسابقات برنامه‌نویسی ACM
الگوریتمستان
آشنایی با درخت Heap (هیپ، هرم یا کپه) به عنوان یکی از ساختمان های داده پرکاربرد و بررسی روش ساخت، درج گره و حذف گره و ارائه‌ی کد نمونه به زبان برنامه‌نویسی ++C
الگوریتمستان
بررسی روش‌های بسط لاپلاس، گاوس، فرمول تحویل و ساروس، برای محاسبه‌ی دترمینان ماتریس مربعی، و پیچیده‌گی زمانی آنها
الگوریتمستان
آشنایی با روش مرتب‌سازی درجی، همراه با قطعه کد به زبان برنامه‌نویسی ++C
الگوریتمستان
آشنایی با روش مرتب‌سازی ادغامی با قطعه کدهایی به زبان برنامه‌نویسی ++C


کتاب Programming Challenges از انتشارات معتبر Springer کتاب مفیدی برای آمادگی شرکت در مسابقات برنامه‌نویسی است که نویسندگان آن به صورت گام به گام، خلاصه و مفید، به مفاهیم و نکات مهم برنامه‌نویسی، ساختمان داده‌ها، محاسبات ریاضی و طراحی الگوریتم‌ها اشاره داشته و با طرح مسائل متفاوت از هر موضوع، خواننده را به چالش حل مسأله کشیده‌اند.

    در این کتاب برای هر موضوع مورد بحث تعدادی سوال از وب‌سایت UVA انتخاب و مطرح شده است. به این ترتیب خواننده علاوه بر آشنایی با مفاهیم مختلف، با نحوه‌ی طراحی سوال از آن موضوع نیز مواجه می‌شود. نویسندگان کتاب در مقدمه به این نکته اشاره داشته‌اند که در انتخاب سوال‌ها علاوه بر مرتبط بودن موضوع، جنبه‌ی سرگرمی و جذابیت نیز تا حد ممکن رعایت شده است: «گاهی موضوعات جذاب علم کامپیوتر و ریاضیات در قالب داستان‌های سرگرم کننده بیان شده است. این مسأله مطالعه‌ی موارد جذاب دیگری را پیش می‌آورد.»

ادامه ...

یکی از سوالات رایج علاقه‌مندان شرکت در مسابقات برنامه‌نویسی معتبر همچون ACM این است که چگونه خود را برای این مسابقات آماده کنیم؟ تا چه حد تسلط به یک زبان برنامه‌نویسی یا مفاهیم مختلف طراحی الگوریتم و شاخه‌های وابسته مورد نیاز است؟

    کتاب Art of Programming Contest به عنوان یک کتاب اختصاصی آمادگی مسابقات برنامه‌نویسی با بررسی مباحث بسیار مفید در مورد مفاهیم و اصول مورد نیاز برای شرکت موفق در چنین مسابقاتی، به چنین سوالاتی پاسخ داده است. این کتاب با بحث در مورد شیوه‌های برنامه‌نویسی مطلوب با زبان برنامه‌نویسی C و استفاده‌ی موثر از مفاهیم مختلف طراحی الگوریتم‌ها و ساختمان داده‌ها، نه تنها برای شرکت‌کنندگان مسابقات، که برای هر علاقه‌مند به حل مسائل چالش‌برانگیز الگوریتمی مناسب و مفید است.

ادامه ...

روش حریصانه (Greedy) یکی از روش‌های مشهور و پرکاربرد طراحی الگوریتم‌ها است که با ساختاری ساده در حل بسیاری از مسائل استفاده می‌شود. این روش اغلب در حل مسائل بهینه‌سازی استفاده شده و در پاره‌ای مواقع جایگزین مناسبی برای روش‌هایی مانند برنامه‌ریزی پویا است. در حالت کلی این روش سرعت و مرتبه‌ی اجرایی بهتری نسبت به روش‌های مشابه خود دارد؛ اما متناسب با مسأله ممکن است به یک جواب بهینه‌ی سراسری ختم نشود.

    در روش حریصانه رسیدن به هدف در هر گام مستقل از گام قبلی و بعدی است. یعنی در هر مرحله برای رسیدن به هدف نهایی، مستقل از این که در مراحل قبلی چه انتخاب‌هایی صورت گرفته و انتخاب فعلی ممکن است چه انتخاب‌هایی در پی داشته باشد، انتخابی که در ظاهر بهترین انتخاب ممکن است صورت می‌پذیرد. به همین دلیل است که به این روش، روش حریصانه گفته می‌شود. زمانی که یک دزد عجول و حریص وارد خانه‌ای می‌شود، در مسیر حرکت خود هر وسیله و کالای با ارزشی را داخل کیسه می‌اندازد. وی در این حالت چندان توجهی نمی‌کند که چه اشیائی را قبلا برداشته و ممکن است در آینده چه اشیاء گرانبهاتری به دست آورد. او در هر گام تنها از بین اشیاء دم دست خود با ارزش‌ترین آن را انتخاب کرده و به وسایل قبلی اضافه می‌کند.

ادامه ...

یکی از روش‌های مرتب‌سازی، روش مرتب‌سازی حبابی (Bubble Sort) است که به آن روش تعویض استاندارد (Standard Exchange) نیز می‌گویند. این روش شامل چند مرحله است که در هر مرحله یک عنصر از لیست به طور قطع در محل مناسب خود قرار می‌گیرد.

    لیست زیر را در نظر بگیرید که می‌خواهیم به صورت صعودی (از کوچک به بزرگ) مرتب کنیم:

      

4  3  8  1  6  2

      

    عنصر اول را با دومی مقایسه کرده و در صورتی که اولی بزرگتر باشد، جای آنها را تعویض می‌کنیم:

      

1 - 1)    4  3  8  1  6  2    ->    3  4  8  1  6  2

ادامه ...

روش مرتب‌سازی سریع (Quick Sort) یکی از الگوریتم‌های مشهور مرتب‌سازی داده‌ها است. این الگوریتم طی مراحل بازگشتی زیر یک روش تقسیم و غلبه برای مرتب کردن داده‌ها ارائه می‌نماید:

    1- انتخاب عنصر محوری: یکی از عناصر آرایه به عنوان عنصر محوری (pivot) - به عنوان مثال عنصر اول - انتخاب می‌شود.

    2- تقسیم آرایه: چینش عناصر آرایه به قسمی تغییر داده می‌شود که تمامی عناصر کوچکتر یا مساوی محور در سمت چپ آن و تمامی عناصر بزرگتر در سمت راست آن قرار بگیرند. این دو قسمت زیر آرایه‌های چپ و راست نامیده می‌شوند.

    3- مرتب‌سازی بازگشتی: زیرآرایه‌های چپ و راست به روش مرتب‌سازی سریع مرتب می‌شوند.

      

ادامه ...

علاقه‌مندان به مباحث مختلف طراحی الگوریتم و همینطور شرکت‌کنندگان مسابقات برنامه‌نویسی به خوبی می‌دانند که یکی از مهمترین پارامترهای طراحی موفقیت‌آمیز یک الگوریتم، شیوه‌ی صحیح فکر کردن روی حل مسأله است. حل انواع سوالات الگوریتمی به ما کمک می‌کند ذهن خودمان را برای حل مسائل پیچیده‌تر آماده کنیم.

    مسأله‌ی برج هانوی (Tower of Hanoi) یکی از مسائل تاریخی مشهور است که در مباحث طراحی الگوریتم نیز به آن پرداخته می‌شود.

    به شکل زیر توجه کنید:

      

برج هانوی

      

ادامه ...

دترمینان ماتریس مربعی - که به صورت |A| یا ( det( A نمایش داده می‌شود - یکی از مفاهیم مشهور جبر خطی است که کاربردهای بسیاری در علوم مختلف دارد. امکان محاسبه‌ی سریع دترمینان یک ماتریس با ابعاد بزرگ، بحث مهمی است که در ادامه سه روش محاسباتی رایج و پیچیده‌گی زمانی آنها مرور خواهند شد.

    طبق تعریف دترمینان، اگر اندازه‌ی ابعاد ماتریس مربعی یک باشد (n = 1)، دترمینان همان مقدار تک‌عضو آن است. یعنی:

      

\[ det( \begin{bmatrix} a \end{bmatrix} ) = \vert \begin{bmatrix} a \end{bmatrix} \vert = a \]

      

    اما اگر مرتبه‌ی ماتریس بزرگتر از یک باشد (n > 1)، دترمینان را به یکی از روش‌های زیر می‌توان محاسبه کرد.

ادامه ...