2015-04-26 23 views
6

Giả sử chúng ta có thể chứng minh rằng một thuật toán, được gọi với đầu vào có kích thước n, chạy trong thời gian O(f(n)).Làm thế nào chúng ta có thể chứng minh rằng thời gian chạy của một thuật toán là chặt chẽ?

Tôi muốn chứng minh rằng thời gian chạy này bị ràng buộc chặt chẽ. Hai câu hỏi:

  1. Nó sẽ không đủ để cung cấp đầu vào đặc biệt và cho biết thời gian chạy tối thiểu là f(n)?
  2. Tôi đã đọc rằng một khả năng để chứng minh độ kín là "giảm phân loại cho nó". Tôi không biết những gì có nghĩa là rằng

Trả lời

5

Nó sẽ không đủ để cung cấp cho một đầu vào đặc biệt và thấy chạy thời gian tối thiểu là f (n)?

Vâng, giả sử bạn đang nói về trường hợp xấu nhất phức tạp.
Nếu bạn đang nói về sự phức tạp của trường hợp xấu nhất - và bạn đã chứng tỏ nó đang chạy trong O(f(n)), nếu bạn tìm thấy đầu vào "tồi tệ" hơn C*f(n)) đối với một số hằng số C - bạn đã chứng minh hiệu quả thuật toán (trong trường hợp xấu nhất) trong Ω(f(n)) và kể từ O(f(n)) [intersection] Ω(f(n)) = Theta(f(n)), điều đó có nghĩa là thuật toán của bạn đang chạy trong Theta(f(n)) trong phân tích trường hợp xấu nhất.
Note rằng nó thực sự phải là một "gia đình" của ví dụ, vì nếu tôi tuyên bố "có, nhưng điều này là chính xác chỉ cho n giá trị nhỏ, và không cho n>N (đối với một số N), bạn có thể chỉ cho tôi rằng đây gia đình của ví dụ này cũng bao gồm các trường hợp n>N, và vẫn còn có giá trị.

Tương tự, nếu bạn tỏ ra một thuật toán có hiệu suất trường hợp tốt nhất của Ω(f(n)), và bạn tìm thấy một số đầu vào mà chạy "tốt hơn" (nhanh hơn) so với C*f(n)) đối với một số hằng số C, bạn đã chứng minh hiệu quả thuật toán là Theta(f(n)) trong phân tích trường hợp tốt nhất.


Thủ thuật này KHÔNG làm việc cho phân tích trường hợp trung bình - nơi bạn nên tính toán thời gian chạy của thời gian chạy, và một ví dụ số ít không hữu ích.

Tôi đã đọc rằng một khả năng để chứng minh độ kín là "giảm bớt số phân loại cho nó". Tôi không biết những gì có nghĩa là rằng

này được thực hiện để chứng minh yêu cầu bồi thường mạnh hơn rất nhiều, đó không có thuật toán (ở tất cả) có thể giải quyết một số vấn đề ở thời điểm mong muốn.
Cách sử dụng phổ biến của nó là giả sử có một số thuật toán hộp đen A chạy trong khoảng thời gian o(g(n)) và sau đó sử dụng A để tạo thuật toán sắp xếp chạy trong thời gian o(nlogn). Tuy nhiên, kể từ khi phân loại là Ω(nlogn) vấn đề, chúng tôi có mâu thuẫn và chúng tôi có thể kết luận các giả định về A là sai và không thể chạy trong thời gian mong muốn.

Điều này giúp chúng tôi chứng minh một tuyên bố mạnh mẽ hơn: Không chỉ thuật toán của chúng tôi có giới hạn dưới này, nhưng TẤT CẢ các thuật toán giải quyết vấn đề cụ thể có giới hạn dưới này.

+0

Vì vậy, tôi cần chứng minh rằng vấn đề, thuật toán của tôi giải quyết, tương đương với vấn đề phân loại dữ liệu, đúng không? – 0xbadf00d

+0

@ 0xbadf00d Không chính xác, bạn có thể chỉ ra rằng bạn có thể giải quyết việc sắp xếp với nó trong thời gian o (nlogn). – amit

1

quảng cáo 1 .: Có, nhưng bạn phải có khả năng tìm thấy đầu vào có kích thước n cho bất kỳ n nào. Một ví dụ về kích thước 3 được xử lý trong 9 bước không thực sự chứng minh bất cứ điều gì.

quảng cáo 2 .: Nếu bạn có thể sửa đổi một chuỗi các phần tử để thuật toán của bạn sắp xếp một cách hiệu quả (bạn nhận được chuỗi được sắp xếp sau khi xử lý đầu ra), bạn đã giảm phân loại thành nó. Và bởi vì phân loại (bằng cách so sánh) không thể nhanh hơn O (n log (n)), điều này có thể được sử dụng để chứng minh rằng thuật toán của bạn không thể nhanh hơn O (n log (n)). Tất nhiên, các hàm xử lý đầu vào và đầu ra không thể chậm hơn hoặc bằng O (n log (n)) cho đối số này hợp lệ, nếu không bạn có thể sắp xếp mảng và chứng minh rằng thuật toán O (1) mà chỉ trả về mảng đầu vào là trên thực tế ít nhất là O (n log (n)) :).

+0

Khoảng 1: không cần thiết cho bất kỳ 'n' nào. Nó đủ để cho thấy rằng có một đầu vào như vậy cho tất cả các 'n' đủ lớn. – kraskevich

Các vấn đề liên quan