Ở đây bằng phân tích tiệm cận tôi giả sử chúng ta có nghĩa là hành vi của thuật toán khi kích thước của đầu vào đi đến vô cùng.
Lý do chúng tôi sử dụng phân tích tiệm cận là vì
nó hữu ích trong việc dự đoán hành vi của các thuật toán trong thực tế . Các dự đoán cho phép chúng ta đưa ra quyết định, ví dụ khi chúng ta có các thuật toán khác nhau cho một vấn đề chúng ta nên sử dụng? (Hữu ích không có nghĩa là nó luôn luôn đúng.)
Câu hỏi tương tự có thể được hỏi về bất kỳ mô hình đơn giản hóa nào của thế giới thực. Tại sao chúng ta sử dụng các mô hình toán học đơn giản hóa của thế giới thực?
Hãy nghĩ về vật lý. Vật lý Newton cổ điển không tốt bằng vật lý tương đối tính trong việc dự đoán thế giới thực. Nhưng nó là một mô hình đủ tốt để chế tạo ô tô, tòa nhà chọc trời, tàu ngầm, máy bay, cầu, v.v ... Có những trường hợp nó không đủ tốt, ví dụ nếu chúng ta muốn xây dựng một vệ tinh hoặc gửi tàu thăm dò không gian tới Sao Diêm Vương hoặc dự đoán chuyển động của các thiên thể khổng lồ như sao và hành tinh hoặc các vật thể tốc độ rất cao như electron.
Điều quan trọng là phải biết giới hạn của một mô hình là gì.
Nó thường là một xấp xỉ đủ tốt của thế giới thực.
Trong thực tế, chúng ta thường thấy rằng một thuật toán có phân tích tiệm cận tốt hơn hoạt động tốt hơn trong thực tế. Rất hiếm khi một thuật toán có hành vi tiệm cận tốt hơn Vì vậy, nếu các yếu tố đầu vào có thể đủ lớn thì chúng ta thường có thể dựa vào phân tích tiệm cận như một dự đoán đầu tiên về hành vi của thuật toán. Nó không phải là như vậy nếu chúng ta biết đầu vào sẽ nhỏ. Tùy thuộc vào hiệu suất mà chúng tôi muốn, chúng tôi có thể cần phân tích cẩn thận hơn, ví dụ: nếu chúng tôi có thông tin về phân phối đầu vào, thuật toán sẽ được cung cấp, chúng tôi có thể phân tích cẩn thận hơn để đạt được các mục tiêu chúng tôi có (ví dụ: nhanh trên 99 % đầu vào). Điểm quan trọng là bước đầu tiên phân tích tiệm cận là điểm khởi đầu tốt. Trong thực tế chúng ta cũng nên thực hiện các bài kiểm tra hiệu suất nhưng hãy nhớ rằng cũng có vấn đề riêng của nó.
Nó là tương đối đơn giản để tính toán trong thực tế.
Thông thường chúng ta có thể tính toán ít nhất các giới hạn tốt về độ phức tạp tiệm cận của thuật toán. Để đơn giản, hãy giả sử rằng chúng ta có một thuật toán vượt trội hơn bất kỳ thuật toán nào khác trên mỗi đầu vào. Làm thế nào chúng ta có thể biết tốt hơn những người khác? Chúng ta có thể phân tích tiệm cận và thấy rằngA AAAAcó độ phức tạp tiệm cận tốt hơn. Điều gì không ai trong số họ là tốt hơn so với cái khác trong tất cả các đầu vào? Sau đó, nó trở nên khó khăn hơn và phụ thuộc vào những gì chúng ta quan tâm. Chúng ta quan tâm đến đầu vào lớn hay đầu vào nhỏ? Nếu chúng ta quan tâm đến các đầu vào lớn thì không có gì phổ biến là một thuật toán có độ phức tạp tiệm cận tốt hơn nhưng lại hoạt động kém nhất trên các đầu vào lớn mà chúng ta quan tâm. Nếu chúng ta quan tâm nhiều hơn về các đầu vào nhỏ thì phân tích tiệm cận có thể không hữu ích. Chúng ta nên so sánh thời gian chạy của các thuật toán trên các đầu vào mà chúng ta quan tâm. Trong thực tế, đối với các nhiệm vụ phức tạp với các yêu cầu phức tạp, phân tích tiệm cận có thể không hữu ích. Đối với các vấn đề cơ bản đơn giản mà sách giáo khoa thuật toán bao gồm, nó khá hữu ích.
Trong độ phức tạp tiệm cận ngắn là một phép tính gần đúng tương đối dễ dàng về độ phức tạp thực tế của các thuật toán cho các nhiệm vụ cơ bản đơn giản (các vấn đề trong sách giáo khoa thuật toán). Khi chúng tôi xây dựng các chương trình phức tạp hơn, các yêu cầu về hiệu suất thay đổi và trở nên phức tạp hơn và phân tích tiệm cận có thể không hữu ích.
Thật tốt khi so sánh phân tích tiệm cận với các phương pháp khác để dự đoán hiệu suất của các thuật toán và so sánh chúng. Một cách tiếp cận phổ biến là kiểm tra hiệu suất đối với đầu vào ngẫu nhiên hoặc điểm chuẩn. Điều này là phổ biến khi tính toán độ phức tạp tiệm cận là khó khăn hoặc không khả thi, ví dụ như khi chúng ta đang sử dụng phương pháp phỏng đoán như trong giải quyết SAT. Một trường hợp khác là khi các yêu cầu phức tạp hơn, ví dụ khi hiệu suất của chương trình phụ thuộc vào các yếu tố bên ngoài và mục tiêu của chúng tôi có thể là có một cái gì đó hoàn thành trong một số giới hạn thời gian cố định (ví dụ: nghĩ về việc cập nhật giao diện cho người dùng) trên 99% đầu vào.
Nhưng hãy nhớ rằng phân tích hiệu suất cũng có vấn đề. Nó không cung cấp cho những người được cấp toán học về hiệu suất khi chúng tôi thực sự chạy thử nghiệm hiệu năng trên tất cả các đầu vào sẽ được cung cấp cho thuật toán (thường là infeasbile tính toán) (và thường không thể quyết định một số đầu vào sẽ không bao giờ được đưa ra). Nếu chúng ta thử nghiệm trên đối với một mẫu ngẫu nhiên hoặc một chuẩn mực chúng ta ngầm giả định một số quy luật
về hiệu suất của các thuật toán, tức là thuật toán sẽ thực hiện tương tự như trên các đầu vào khác mà không phải là một phần của thử nghiệm hiệu suất.
Vấn đề thứ hai với các bài kiểm tra hiệu suất là chúng phụ thuộc vào môi trường kiểm tra. Tức là hiệu suất của chương trình không chỉ được xác định bởi các yếu tố đầu vào mà là các yếu tố bên ngoài (ví dụ: loại máy, hệ điều hành, hiệu quả của thuật toán mã hóa, sử dụng CPU, thời gian truy cập bộ nhớ, v.v.) một số yếu tố có thể khác nhau giữa các lần chạy khác nhau các thử nghiệm trên cùng một máy. Một lần nữa ở đây, chúng tôi giả định rằng các môi trường cụ thể mà kiểm tra hiệu năng được thực hiện tương tự như môi trường thực tế trừ khi chúng tôi thực hiện kiểm tra hiệu suất trên tất cả các môi trường mà chúng tôi có thể chạy chương trình trên (và làm thế nào chúng tôi có thể dự đoán máy nào có thể chạy phân loại thuật toán trong 10 năm?).
So sánh những điều này với việc tính toán thời gian chạy tiệm cận của MergeSort ( ) và so sánh nó với thời gian chạy của Lựa chọn nói ( ) hoặc BinarySerch ( ) với Tìm kiếm tuyến tính ( ).Θ ( n 2 ) Θ ( lg n ) O ( n )Θ(nlgn)Θ(n2)Θ(lgn)O(n)