آزمایشگاه آزاد؛ بدون نیاز به ورود
رشد الگوریتمها با بزرگ شدن ورودی
برای یک ورودی کوچک، چند الگوریتم ممکنه شبیه هم به نظر بیان. چیزی که فرقشون رو روشن میکنه اینه که با زیاد شدن داده، تعداد کارها چطور رشد میکنه.
آزمایش رو شروع کناندازهی ورودی n رو از ۱۰ شروع کن و اجرا رو بزن؛ بعد n رو بزرگتر کن. خروجیها تعداد مرحلهی فرضیاند، نه ثانیه. مقدار نمایی جدا از سه ستون نمودار نشون داده میشه.
آزمایشگاه در حال آماده شدنه…
حالا خودت امتحان کن
هر بار فقط یک چیز رو تغییر بده تا اثرش رو ببینی. قبل از اجرا، نتیجه رو حدس بزن.
یک نقطهی میانی
اندازهی ورودی رو روی ۱۰ بذار و چهار خروجی رو با هم بخون.
حدست چیه؟ حدس میزنی در n=۱۰ مقدار درجهدوم چند برابر مقدار خطی باشه؟
توضیح نتیجه رو ببین
برای n=۱۰، خطی ۱۰، خطی-لگاریتمی ۳۳، درجهدوم ۱۰۰ و نمایی ۱۰۲۴ میشه. اینها مقدار تابعهای مدلاند؛ زمان یا شمار واقعی دستورهای یک برنامه نیستند.
اندازه را دو برابر کن
اندازهی ورودی رو از ۱۰ به ۲۰ برسون و خروجیها رو با آزمایش قبل مقایسه کن.
حدست چیه؟ وقتی n دو برابر میشه، مقدار درجهدوم و نمایی هر کدوم چند برابر میشن؟
توضیح نتیجه رو ببین
در n=۲۰، درجهدوم ۴۰۰ میشه؛ چهار برابر ۱۰۰. نمایی به ۱٬۰۴۸٬۵۷۶ میرسه؛ ۱۰۲۴ برابر ۱۰۲۴. همین تفاوت نشون میده رشد نمایی با بزرگ شدن ورودی خیلی زود از بقیه فاصله میگیره.
وقتی ورودی خیلی کوچیکه
اندازهی ورودی رو روی کمترین مقدار، یعنی ۲، بذار.
حدست چیه؟ کدوم خروجیها در این اندازه با هم برابر میشن؟
توضیح نتیجه رو ببین
برای n=۲، خطی و خطی-لگاریتمی هر دو ۲ هستند و درجهدوم و نمایی هر دو ۴. در ورودی کوچک، رشدهای متفاوت ممکنه عدد یکسان بدهند؛ برای مقایسه فقط به یک نقطه تکیه نکن.
پشت این حرکت چه خبره؟
n اندازهی ورودی است
n یعنی تعداد چیزهایی که یک الگوریتم باید باهاشون کار کنه. این مدل برای هر n چند تابع رو حساب میکنه تا شکل رشدشان رو مقایسه کنی؛ الگوریتم واقعی یا زمان سپریشدهای اجرا نمیشه.
تابعها با سرعتهای متفاوت رشد میکنند
n, n*log_2(n), n^2, 2^n
خطی تقریباً همپای n بالا میره؛ خطی-لگاریتمی کمی تندتره؛ درجهدوم با n به توان دو رشد میکنه؛ و نمایی در اینجا ۲ به توان n است. برای n log₂ n در خروجی، مقدار به نزدیکترین عدد صحیح گرد میشه.
نماد رشد، ثانیهی اجرا نیست
O(n), O(n*log(n)), O(n^2), O(2^n)
در تحلیل الگوریتم، نمادهایی مثل O(n) معمولاً شکل رشد کار رو برای ورودیهای بزرگ توصیف میکنن؛ ثابتها و جملههای کوچکتر رو کنار میذارن. این صفحه فقط چند تابع نمونه رو نمایش میده و نمیگه هر الگوریتم واقعی دقیقاً همین تعداد مرحله رو دارد.
سؤالت رو بپرس، جوابش رو هم ببین
وقتی توی چت دربارهٔ یک مفهوم درس میخونی، دستیار هوش مصنوعی میتونه شبیهسازی مرتبط رو کنار توضیحش نشون بده. پارامترها رو تغییر میدی و با کمک توضیح بعدی، نتیجه رو بهتر میفهمی.
شروع یادگیری با چتبرای ادامه در چت، وارد مسیر شروع و ورود میشی. نتیجهٔ این آزمایش به چت منتقل نمیشه.
نمونهٔ نمایشی از آموزش در چت
چرا با دو برابر کردن n، مقدار نمایی اینقدر جهش کرد؟
چون در این مدل نمایی یعنی ۲ به توان n. هر بار که n یکی زیاد میشه، مقدار دو برابر میشه؛ از n=۱۰ تا n=۲۰ ده بار دو برابر میشه، برای همین ۱۰۲۴ برابر شده. این عدد هنوز زمان اجرای واقعی یک برنامه نیست.
سؤالهای رایج
O(n) یعنی الگوریتم دقیقاً n ثانیه طول میکشه؟
نه. O(n) دربارهی شکل رشد کار نسبت به اندازهی ورودی حرف میزنه، نه ثانیه. زمان واقعی به الگوریتم، دستگاه و جزئیات پیادهسازی بستگی دارد.
چرا مقدار نمایی با هر n دو برابر میشه؟
چون تابع این مدل ۲ به توان n است؛ با یک واحد افزایش n، توان یک واحد زیاد میشه و مقدار دو برابر میشه.
چرا مقدار خطی-لگاریتمی عدد صحیح است؟
مدل n log₂ n رو به نزدیکترین عدد صحیح گرد میکنه تا خروجی شبیه تعداد مرحله باشد. مقدار واقعی تابع ممکنه اعشاری باشد.
چرا رشد نمایی در نمودار میلهای نیست؟
چون در nهای بزرگ مقدار نمایی از سه تابع دیگر خیلی بزرگتره و ستونهای آنها رو کوتاه و ناخوانا میکرد. مقدار نمایی به صورت عدد جداگانه نمایش داده میشه؛ پس نمودار همهی چهار مقدار را در یک مقیاس مشترک نمیکشد.
اگر دو تابع در n کوچک برابر شدند یعنی همیشه برابرند؟
نه. مثلاً در n=۲، n و گردشدهی n log₂ n هر دو ۲ میشن، ولی با بزرگتر شدن n از هم فاصله میگیرند. یک نقطه برای نتیجهگیری دربارهی رشد کافی نیست.