Table of Contents
عدم قطعیت بزرگ چیست؟
در این میان، یک چارچوب ریاضی است که در علم کامپیوتر به کار می رود و به اندازه کافی از آن استفاده می کند.(۰)
در مصاحبه های کدنویسی، Big-O رایج ترین ابزار برای بحث در مورد کارایی است. مصاحبه کنندگان انتظار دارند که شما عملکرد راه حل خود را توجیه کنید و در صورت امکان، گزینه های کارآمدتری را پیشنهاد دهید.یک درک محکم از Big-O به شما می دهد تا واژگان را برای بیان معاملات بین زمان و فضا، و سیگنال هایی که شما به طور انتقادی در مورد مقیاس پذیری فکر می کنید - یک مهارت حیاتی برای مدیریت داده های واقعی.
چرا بزرگ-O در مصاحبه های شرکت کننده اهمیت دارد
مصاحبه کنندگان مشکلات الگوریتمی را نه تنها برای دیدن اینکه آیا می توانید یک راه حل کار ایجاد کنید، بلکه برای ارزیابی روند حل مسئله شما، بیگ-O نقش مهمی در ارزیابی ایفا می کند.هنگامی که پیچیدگی زمان رویکرد خود را توصیف می کنید، آگاهی از محدودیت های عملکردی را نشان می دهید – حتی برای مشکلاتی که به نظر می رسد بسیار ناچیز است، بسیاری از سوالات مصاحبه طوری طراحی شده اند که راه حل های ساده برای ورودی های بزرگ بسیار کند؛ اغلب نیاز به درک پیچیدگی (O2) دارند.
علاوه بر این، بحث در مورد Big-O نشان می دهد که شما می توانید در مورد معاملات بین استراتژی های مختلف استدلال کنید، به عنوان مثال، استفاده از حافظه اضافی (فضای) برای سرعت بخشیدن به زمان اجرا (زمان) یک الگوی مصاحبه کلاسیک است که قادر به توضیح اینکه چرا یک جدول هش O (1) به دست می آورد، در حالی که یک لیست نیاز به O(n) می تواند شما را از کاندیداهایی که تنها مشکل مکانیکی را حل می کنند جدا کند.
پیچیدگی های زمان مشترک با نمونه ها توضیح داده شده است
O (1) - زمان ثابت
الگوریتم در زمان ثابت اجرا می شود، زمانی که زمان اجرای آن به اندازه ورودی بستگی ندارد. :Example: دسترسی به یک عنصر با شاخص در آرایه.بدون توجه به اینکه آرایه دارای 10 یا 10 میلیون عنصر است، این نگاه همان تعداد مراحل ماشین را می گیرد.
def get_first(arr):
return arr[0] # O(1)
O(log n) – زمان Logarithmic
پیچیدگی Logarithmic زمانی رخ می دهد که الگوریتم به طور مکرر اندازه ورودی را نصف می کند. Example: جستجوی باینری بر روی یک آرایه مرتب شده است.هر کدام از آن ها نیمی از عناصر باقی مانده را دور می گذارد، بنابراین تعداد عملیات متناسب با log2 (n) است.
def binary_search(arr, target):
left, right = 0, len(arr)-1
while left <= right:
mid = (left+right)//2
if arr[mid] == target: return mid
elif arr[mid] < target: left = mid+1
else: right = mid-1
return -1 # O(log n)
O(n) – زمان خطی
الگوریتم های زمان خطی یک پاس را بر روی ورودی انجام می دهند. Example: پیدا کردن حداکثر ارزش در یک لیست بدون سرنشین.شما باید هر عنصر را یک بار بررسی کنید.
def find_max(arr):
max_val = arr[0]
for i in arr[1:]:
if i > max_val: max_val = i
return max_val # O(n)
O(n log n) – Log-Linear Time
این پیچیدگی برای الگوریتم های منظم کارآمد مانند ادغام، توده ها و نوع کتابخانه استاندارد در بسیاری از زبان ها معمول است.این از تقسیم ورودی به نیمه (سطح n) و انجام کار خطی در هر سطح (عملیات در هر سطح) ناشی می شود.
def mergesort(arr):
if len(arr) <= 1: return arr
mid = len(arr)//2
left = mergesort(arr[:mid])
right = mergesort(arr[mid:])
return merge(left, right) # O(n log n)
O(n2) – Quadratic Time
زمان چهارگانه زمانی به نظر می رسد که شما حلقه های داخل را بر روی ورودی قرار داده اید. {\displaystyle \"FLT:1} که حلقه بیرونی n بار اجرا می شود و حلقه داخلی (n-I) زمان می برد و در n(n-1)/2 {\displaystyle n2} قرار می گیرد.
def bubble_sort(arr):
for i in range(len(arr)):
for j in range(len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j] # O(n²)
O(2^n) – زمان نمایی
پیچیدگی نمایی زمانی رخ می دهد که هر مرحله تعداد احتمالات را دو برابر کند. Example: : 1 محاسبات ساده لوحانه اعداد فیبوناچی بدون یادداشت سازی رشد می کند.
def fib(n):
if n <= 1: return n
return fib(n-1) + fib(n-2) # O(2^n)
چگونه پیچیدگی یک الگوریتم را تحلیل کنیم
کارشناسی ارشد تجزیه و تحلیل بزرگ نیاز به یک رویکرد سیستماتیک دارد، این مراحل را زمانی که شما با یک الگوریتم در مصاحبه مواجه می شوید دنبال کنید:
- [در این باره] [[[[۱]]] [[۱۰]]] [[۳]]]] [[۳]]] [[۳]]]] [[۳]]] [[۳]]]] [[۳]]] [[۳]]]] [۳]] [۳]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]]] [۳]]]]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳
- پیدا کردن عملیات غالب - عملیاتی که بیشترین زمان را برای اجرا دارد (به عنوان مثال مقایسه در مرتب سازی، دسترسی آرایه در جستجو).
- [در این باره] [مشرکان]: [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱۰] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳
- عوامل ثابت و شرایط سفارش پایین تر [FLT 1] - به عنوان مثال، نگه داشتن تنها سریعترین رشد.
- بدترین حالت را در نظر بگیرید [FLT 1] مگر اینکه مشخص شود، ورودی را که بیشترین عملیات را ایجاد می کند، فرض کنید.
برای پیچیدگی فضا، همان منطق را برای استفاده از حافظه اعمال کنید، خود ورودی را بشمارید – فقط ذخیره سازی اضافی اختصاص داده شده در طول اجرای.
اشتباهات رایج و تصورات غلط
بهترین، متوسط و بدترین موارد
در این میان، همیشه از آن استفاده می شود تا به آن اشاره کنید که در آن زمان، از آن استفاده می شود.
تشخیص عوامل دائمی
در حالی که بیگ-O ثابت های عمل را نادیده می گیرد، الگوریتم O(n) با ثابتی عظیم ممکن است کندتر از O(n2) باشد که برای عملکرد کوچک (FLT:0) در مصاحبه ها، اشاره کنید که شما ثابت ها را درک می کنید، اما بر عملکرد asymptotic تمرکز کنید.
فراموش کردن برای تحلیل فضا
پیچیدگی زمان اغلب تمرکز اصلی است، اما پیچیدگی فضا به همان اندازه مهم است، بسیاری از مصاحبه کنندگان به طور مستقیم می پرسند: " پیچیدگی فضا چیست؟" همیشه آماده برای بیان هر دو، و توجه به اینکه آیا مقیاس حافظه اضافی با اندازه ورودی یا ثابت باقی مانده است.
فرض بر این که همه حلقه ها O(n) هستند
دو حلقه ی لانه دار همیشه به معنی O(n2) نیست، اگر حلقه ی داخلی تعداد ثابتی از زمان را اجرا کند (به عنوان مثال، آن را بر روی اندازه ی حروف ثابت)، کل O(n) است که دقیقاً آن را تجزیه و تحلیل می کند.
نکات عملی برای روز مصاحبه
- با یک راه حل brute-force شروع کنید و پیچیدگی آن را یادداشت کنید، سپس بهینه سازی ها را پیشنهاد کنید و در مورد چگونگی تاثیر هر تغییر بر بیگ-O بحث کنید.
- از نوسازی بزرگ به عنوان یک ابزار ارتباطی استفاده کنید: “راه حل فعلی من O(n2) به دلیل حلقه ای که در تمام جفت ها قرار دارد، می توانیم آن را با مرتب کردن اول یا O(n) با استفاده از یک نقشه هش، به O(n log n) کاهش دهیم.”
- هنگامی که از شما خواسته شد کد خود را تجزیه و تحلیل کنید، با خط راه بروید، توضیح دهید که کدام اظهارات به شمارش اضافه می شود (به عنوان مثال، حلقه ها، تماس های بازگشتی).
- با درختان مشترک خانواده راحت باشید: حلقه بر روی ورودی (n)، عود که ورودی را تقسیم می کند (O(log n) یا O(n log n)، دوباره تکرار کنید که شاخه ها به شدت O(2^n) را تقسیم می کنند.
- می دانید که Big-O تنها یک متریک است که در مورد تجارت مانند قابلیت خواندن کد، قابلیت نگهداری و محدودیت های ورودی (به عنوان مثال، n کوچک ممکن است یک راه حل ساده O (n2) باشد.
منابع خارجی برای درک عمیق تر
برای تقویت دانش خود، این ارجاعات را بررسی کنید:
- وکیپزی: بزرگ او نوستگی - یک مرور کلی ریاضی.
- آکادمی کیهان: دوره الگوریتم [FLT 1] - درس های تعاملی در مورد تجزیه و تحلیل پیچیدگی.
- بزرگ تقلب ورق [FLT 1] - مرجع سریع برای ساختارهای داده و الگوریتم های رایج.
نتیجه گیری
درک بزرگ-Onotation یک پایه از مصاحبه های موفق برنامه نویسی است.شما را قادر می سازد تا در مورد عملکرد الگوریتم، ارتباط بهره وری به وضوح، و ایجاد اطلاع از معاملات در طول حل مسئله است.با تمرین تجزیه و تحلیل الگوریتم های رایج، اجتناب از مشکلات معمول، و بحث در مورد پیچیدگی در هر راه حل شما، شما یک ذهنیت مهندسی بالغ نشان می دهد. تجزیه و تحلیل کد شما نوشتن - هر دو مصاحبه های کار و کار - و اطمینان روزانه شما را تنها کمک می کند.