Ký hiệu lớn là gì?

Ký hiệu lớn là một khung toán học được dùng trong khoa học máy tính để mô tả [FLT: 0] hiệu suất [FLT:] của một thuật toán khi kích cỡ nhập vào. Đối với một thuật toán, nó cho phép một giới hạn trên mức tăng trưởng của một hàm số. Đối với một thuật toán có kích cỡ nhập , [FLT:], ký hiệu O [FT] [FT] [FT],] [FL], ngôn ngữ ảo giác] [FL] có nghĩa là thời gian chạy quá nhiều [FT] không cho phép [FT] bộ nhớ [FT] [FT], hoặc thuật toán học [FT].K].

Trong các cuộc phỏng vấn, Big-O là công cụ phổ biến nhất để thảo luận về hiệu quả của giải pháp và khi có thể, đề xuất những phương pháp thay thế hiệu quả hơn. một sự nắm bắt vững của Big-O cho bạn từ vựng để giải quyết các cuộc trao đổi giữa thời gian và không gian, và nó cho thấy rằng bạn nghĩ cực kỳ đáng tin cậy về tính khả thi - một kỹ năng cốt yếu để xử lý dữ liệu thực.

Tại sao có những cuộc phỏng vấn lớn trong các cuộc phỏng vấn

Người phỏng vấn đặt ra vấn đề thuật toán không chỉ để xem bạn có thể tạo ra một giải pháp làm việc, mà còn để đánh giá quá trình giải quyết vấn đề của bạn. Big-O đóng vai trò trung tâm trong đánh giá đó. Khi bạn mô tả độ phức tạp thời gian của phương pháp tiếp cận, bạn cho thấy sự hạn chế hiệu suất - ngay cả đối với các vấn đề có vẻ tầm thường. Hơn nữa, nhiều câu hỏi phỏng vấn được thiết kế như vậy là quá chậm cho đầu vào lớn; câu trả lời đúng thường đòi hỏi sự hiểu biết về cách giảm độ phức tạp từ O(n) sang O(n) đến O(n) hoặc O(n).

Ngoài ra, thảo luận Big-O cho thấy bạn có thể lý luận về sự đánh đổi giữa các chiến lược khác nhau. Chẳng hạn, sử dụng bộ nhớ bổ sung (không gian) để tăng tốc thời gian chạy (thời gian) là một kiểu phỏng vấn cổ điển. Có thể giải thích tại sao bàn Hath cung cấp O (1) trong khi danh sách yêu cầu O(n) có thể tách bạn khỏi ứng cử viên chỉ giải quyết vấn đề về cơ học.

Những sự phức tạp về thời gian thường được giải thích bằng gương

O( 1) – Thời gian không đổi

Một thuật toán chạy trong thời gian không định khi thời gian thực hiện không phụ thuộc vào kích cỡ nhập. [FLT: 0] chạy [FLT: 1] truy cập một yếu tố bằng chỉ mục trên một tập tin. Không quan trọng nếu danh sách có 10 hay 10 triệu yếu tố, việc tra cứu có cùng số bước máy.

def get_first(arr): return arr[0] # O(1)

O (log n) – Thời gian ghi lưu

Sự phức tạp thấu kính phát sinh khi thuật toán lặp đi lặp lại kích cỡ nhập. [FLT: 0] Chạy [FLT: 1] tìm kiếm nhị phân trên một dãy xếp xếp xếp. Mỗi lần lặp lại bỏ đi một nửa các yếu tố còn lại, vì vậy số lượng hoạt động tương ứng với 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) – Tuyến giờ

Các thuật toán thời gian tuyến thực hiện một lần đi qua đầu vào. [FLT: 0] Chạy [FLT: 1]] tìm giá trị tối đa trong danh sách không được xác định. Bạn phải kiểm tra mỗi yếu tố một lần.

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-Linar Time

Sự phức tạp này là điển hình cho việc sắp xếp các thuật toán hiệu quả như trộn, xếp chồng và sắp xếp thư viện chuẩn trong nhiều ngôn ngữ. Nó xuất phát từ việc chia dữ liệu ra hai phần (tiểu thức n) và thực hiện công việc tuyến tính ở mỗi cấp (không thao tác trên mỗi cấp).

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) – Thời gian Quadratic

Thời gian Quadratic xuất hiện khi bạn đã lồng nhau trên đầu vào. [FLT: 0] Chạy đa chiều: bong bóng kiểu, nơi vòng ngoài chạy n lần và vòng lặp bên trong chạy (n - i), kết quả là n(n- 1)/ 2 n2 so sánh.

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) – Thời gian trưng bày

Sự phức tạp về mặt sức khỏe xảy ra khi mỗi bước nhân đôi số khả năng. [FLT: 0] Apple: [FLT: 1] tính toán ngây thơ của các số Fibonacci mà không ghi nhớ. Cây đệ quy tăng theo cấp số nhân, làm cho phương pháp này không thực tế cho n > 30 hoặc như vậy.

def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2) # O(2^n)

Làm thế nào để phân tích tính phức tạp của thuật toán

Phân tích Big-O cần một phương pháp có hệ thống. Hãy theo dõi những bước này khi bạn gặp một thuật toán trong một cuộc phỏng vấn:

  1. Hãy xác định kích cỡ nhập — thường ) ) cho một đầu vào, hoặc riêng rẽ cho nhiều đầu vào (v., n và [FL:6] [FL: 6).
  2. Tìm thao tác thống trị – thao tác này góp phần lớn để chạy (v. d., so sánh trong sắp xếp, danh sách truy cập vào các mục tìm kiếm).
  3. Phụ đề được thực hiện bao nhiêu lần ) như một chức năng ) ).
  4. yếu tố liên tục và các từ lệnh thấp ) – chỉ giữ số phát triển nhanh nhất. Ví dụ, 3n2 + 5n + 1 trở thành O(n2).
  5. Hãy xem trường hợp tệ nhất – trừ trường hợp đã ghi rõ, giả sử đầu vào gây ra nhiều thao tác nhất. Đối với nhiều vấn đề, đây là trường hợp định nghĩa.

Để độ phức tạp không gian, hãy áp dụng cùng logic cho việc sử dụng bộ nhớ. Đừng đếm dữ liệu nhập vào chỉ thêm được cấp thêm trong khi thực hiện.

Những cạm bẫy thường gặp và những quan điểm sai lầm

Phân biệt những điều tốt nhất, trung bình và xấu nhất

Big-O hầu như luôn luôn được sử dụng để biểu thị [FLT: 0] chữ thường [FLT: 1]. Tuy nhiên, bạn nên sẵn sàng để thảo luận độ phức tạp trung bình [FLT: 0] [FLT: 0]- chữ thường [FLT: 1]. Người phỏng vấn đánh giá ứng cử viên có khả năng phân biệt và giải thích hiệu suất thực tế.

Bỏ qua các yếu tố liên tục

Trong khi Big-O lờ đi hằng số, trong thực tế hằng số là quan trọng. Một thuật toán O(n) với một hằng số lớn có thể chậm hơn một O(n2) một cho [FLT: 0] [FLT: 1]. Trong các cuộc phỏng vấn, đề cập đến bạn hiểu hằng số nhưng tập trung vào hiệu suất không đều.

Quên không gian phân tích

Sự phức tạp về thời gian thường là điều chính yếu, nhưng sự phức tạp về không gian cũng quan trọng như vậy.

Giả sử mọi vòng lặp đều O(n)

Hai vòng tổ không phải lúc nào cũng có nghĩa là O(n2). Nếu vòng lặp bên trong chạy liên tục số lần (v. d., việc lặp lại trên một kích thước bảng chữ cái cố định), tổng số là O(n). Phân tích chính xác.

Lời khuyên thực tế cho ngày phỏng vấn

  • Bắt đầu với một giải pháp mạnh mẽ và chú ý đến độ phức tạp của nó sau đó đề xuất tối ưu hóa và thảo luận về cách mỗi thay đổi ảnh hưởng đến Big-O
  • Chẳng hạn, hãy dùng ký hiệu Big-O như một công cụ liên lạc: “ Giải pháp hiện tại của tôi là O(n2) vì các vòng lồng nhau trên mọi cặp.
  • Khi được yêu cầu phân tích mã, hãy đi từng hàng một để giải thích những lời nào thêm vào số (v. d., vòng, cuộc gọi đệ quy).
  • Hãy thoải mái với cây gia đình thông thường: vòng qua đầu vào O(n), tái sử dụng để chia ra o(log n) hoặc O(n log n), tái tạo rất nhiều nhánh O(2^n).
  • Biết rằng Big-O chỉ là một đo. Thảo luận về việc đánh đổi như khả năng đọc mã, khả năng duy trì và hạn chế nhập (v. d., n nhỏ có thể ưu tiên một giải pháp O(n2) đơn giản hơn.

Những nguồn tài nguyên bên ngoài để hiểu sâu hơn

Để củng cố kiến thức của bạn, hãy khám phá những tài liệu tham khảo sau:

Kết luận

Hiểu được ký hiệu lớn là nền tảng của các cuộc phỏng vấn mã hóa thành công. nó cho phép bạn lý luận về hiệu suất thuật toán, giao tiếp rõ ràng, và làm cho các đánh đổi có hiểu biết trong quá trình giải quyết vấn đề. bằng cách thực hành phân tích các thuật toán thông thường, tránh những cạm bẫy thông thường, và thảo luận về sự phức tạp trong mỗi giải pháp bạn xây dựng, bạn sẽ thể hiện một tư duy kỹ thuật trưởng thành. tiếp tục phân tích các mã bạn viết - cả hai trong các cuộc phỏng vấn và trong công việc hàng ngày - và Big-O sẽ trở thành tự nhiên thứ hai. sự tự tin được thu thập từ khái niệm này sẽ giúp bạn vượt qua các cuộc phỏng vấn nhưng cũng chuẩn bị bạn cũng có thể thiết kế, hiệu quả phần mềm trong sự nghiệp của bạn.