Làm thế nào để O và Ω liên quan đến trường hợp xấu nhất và tốt nhất?


33

Hôm nay chúng tôi đã thảo luận trong một bài giảng một thuật toán rất đơn giản để tìm một phần tử trong một mảng được sắp xếp bằng cách sử dụng tìm kiếm nhị phân . Chúng tôi được yêu cầu xác định độ phức tạp tiệm cận của nó cho một mảng gồm phần tử.n

Ý tưởng của tôi là, đó là hoặc cụ thể hơn vì là số lượng hoạt động trong trường hợp xấu nhất. Nhưng tôi có thể làm tốt hơn, ví dụ nếu tôi nhấn phần tử được tìm kiếm lần đầu tiên - thì giới hạn dưới là .O(logn)O(log2n)Ω ( 1 )log2nΩ(1)

Giảng viên đã trình bày giải pháp là vì chúng ta thường chỉ xem xét các trường hợp đầu vào tồi tệ nhất cho các thuật toán.Θ(logn)

Nhưng khi chỉ xem xét các trường hợp xấu nhất, điểm quan trọng của việc có và gì khi tất cả các trường hợp xấu nhất của vấn đề đã cho đều có cùng độ phức tạp ( sẽ là tất cả những gì chúng ta cần, phải không?).OΩΘ

Tôi đang thiếu gì ở đây?


@Smaji: Ý của bạn là gì "Nhưng khi chỉ xem xét các trường hợp xấu nhất, điểm quan trọng của ký hiệu O lớn và Omega lớn là gì khi tất cả các trường hợp xấu nhất đều có + - độ phức tạp giống nhau (Theta sẽ là tất cả những gì chúng ta cần, phải không?)." hãy làm rõ nó
tanmoy

@Smajl: Tôi nghĩ câu hỏi của bạn là: Sự cần thiết của ký hiệu Big O và Big Omega trong phân tích thuật toán là gì? tôi có đúng không
tanmoy

5
O(log2n) không cụ thể hơn , chúng biểu thị cùng một lớp hàm. O(logn)
Raphael

l o g ( b ) / l o g ( 2 ) × l o g b ( n )log2(n) giống như do đó 2 chỉ ra một yếu tố, có thể được loại bỏ (giống như các yếu tố khác trong big-O.log(b)/log(2)×logb(n)
ctrl-alt-delor

Câu trả lời:


39

Ký hiệu Landau biểu thị giới hạn tiệm cận trên các chức năng . Xem ở đây để giải thích về sự khác biệt giữa , và .OΩΘ

Thời gian tồi tệ nhất, tốt nhất, trung bình hoặc tên bạn mô tả các hàm thời gian chạy riêng biệt: một cho chuỗi thời gian chạy cao nhất của bất kỳ , một cho mức thấp nhất, v.v.n

Per se, hai người không có gì để làm với nhau. Các định nghĩa là độc lập. Bây giờ chúng ta có thể tiếp tục và xây dựng các giới hạn tiệm cận trên các hàm thời gian chạy: trên ( ), dưới ( ) hoặc cả hai ( ). Chúng ta có thể làm một trong hai trường hợp xấu nhất, tốt nhất - hoặc bất kỳ trường hợp nào khác.Ohm qOΩΘ

Chẳng hạn, trong tìm kiếm nhị phân, chúng ta có một tiệm cận thời gian chạy tốt nhất của và một tiệm cận trong trường hợp xấu nhất của .Θ(1)Θ(logn)


Điểm mấu chốt đối với tôi là, chúng ta có thể thực hiện phân tích trường hợp xấu nhất, tốt nhất trên bất kỳ chức năng giới hạn tiệm cận nào. Đối với tôi, điều đó cho thấy sự độc lập của Big O so với phân tích trường hợp xấu nhất. Cảm ơn!
Patrick

1
@Patrick Không hoàn toàn. Cuối cùng, bạn quyết định xem bạn muốn phân tích trường hợp xấu nhất, trung bình hay tốt nhất. Sau đó, bạn đưa ra hàm chi phí (hoặc gần đúng nhất có thể). Chỉ sau đó, bạn mất tiệm cận, nếu có.
Raphael

17

Xem xét thuật toán sau (hoặc thủ tục hoặc đoạn mã hoặc bất cứ điều gì):

Contrive(n)
1. if n = 0 then do something Theta(n^3)
2. else if n is even then
3.    flip a coin
4.    if heads, do something Theta(n)
5.    else if tails, do something Theta(n^2)
6. else if n is odd then
7.    flip a coin
8.    if heads, do something Theta(n^4)
9.    else if tails, do something Theta(n^5)

Hành vi tiệm cận của chức năng này là gì?

Trong trường hợp tốt nhất (trong đó chẵn), thời gian chạy là và , nhưng không phải là của bất cứ điều gì.Ω ( n ) O ( n 2 ) ΘnΩ(n)O(n2)Θ

Trong trường hợp xấu nhất (trong đó là số lẻ), thời gian chạy là và , nhưng không phải là của bất cứ điều gì.Ω ( n 4 ) O ( n 5 ) ΘnΩ(n4)O(n5)Θ

Trong trường hợp , thời gian chạy là .Θ ( n 3 )n=0Θ(n3)

Đây là một chút của một ví dụ giả định, nhưng chỉ với mục đích thể hiện rõ ràng sự khác biệt giữa ràng buộc và vụ án. Bạn có thể có sự khác biệt trở nên có ý nghĩa với thủ tục hoàn toàn xác định, nếu các hoạt động bạn đang thực hiện không có bất kỳ tiếng vọt.Θ


1
nmod4

4

Không cần thiết. Trong trường hợp này, cụ thể là tìm kiếm nhị phân trên một mảng được sắp xếp, bạn có thể thấy rằng: (a) tìm kiếm nhị phân mất tối đa các bước ; (b) có những đầu vào thực sự buộc nhiều bước này. Vì vậy, nếu là thời gian chạy trên đầu vào trường hợp xấu nhất cho tìm kiếm nhị phân, bạn có thể nói rằng .T ( n ) T ( n ) = Θ ( log n )[logn+1]T(n)T(n)=Θ(logn)

Mặt khác, đối với các thuật toán khác, bạn có thể không thể tìm ra chính xác, trong trường hợp đó bạn có thể có một khoảng cách giữa giới hạn trên và dưới trong thời gian chạy trên đầu vào trường hợp xấu nhất.T(n)

Bây giờ, để tìm kiếm một mảng được sắp xếp, một điều nữa là đúng, đó là bất kỳ thuật toán nào để tìm kiếm một mảng được sắp xếp cần phải kiểm tra . Đối với loại ràng buộc thấp hơn, mặc dù vậy, bạn cần phải phân tích vấn đề. (Đây là ý tưởng: bất cứ lúc nào, một thuật toán tìm kiếm đã không loại trừ khả năng một số bộ các vị trí nơi mà các yếu tố đó đang tìm kiếm có thể sau đó một đầu vào một cách cẩn thận-crafted thể đảm bảo rằng. là giảm nhiều nhất là nhân tố .)S [ n ] | S | 2[logn+1]S[n]|S|2


1

Bạn nói đúng, nhiều người chậm chạp sử dụng khi họ nên sử dụng . Ví dụ: một nhà phân tích thuật toán có thể kết thúc bằng hàm thời gian và ngay lập tức kết luận rằng , đúng về mặt kỹ thuật , nhưng một xác nhận sắc nét hơn sẽ là . Tôi gán cho hành vi lãng quên này là hai lý do. Đầu tiên, nhiều người thấy trở nên phổ biến và được chấp nhận hơn, có thể là do lịch sử lâu đời của nó. Hãy nhớ lại rằng nó đã được giới thiệu cách đây hơn một thế kỷ, trong khi (và ) chỉ được giới thiệu vào năm 1976 (bởi Donald Knuth). Thứ hai, có thể là vìOΘT(n)=n2+n+2T(n)=O(n2)T(n)=Θ(n2)OΘΩOcó sẵn trên bàn phím, trong khi thì không!Θ

Tuy nhiên, từ quan điểm kỹ thuật, lý do chính khiến các nhà phân tích cẩn thận thích sử dụng hơn là vì cái trước bao trùm "lãnh thổ lớn hơn" so với cái sau. Nếu chúng tôi lấy ví dụ về tìm kiếm nhị phân của bạn và muốn sử dụng , chúng tôi sẽ phải đưa ra hai xác nhận: \ một cho trường hợp tốt nhất là và một trường hợp khác cho trường hợp xấu nhất là . Với , chúng tôi chỉ thực hiện một xác nhận, cụ thể là . Về mặt toán học, các hàm được bao phủ bởi cũng được bao phủ bởi , trong khi điều ngược lại không nhất thiết là đúng.OΘΘΘ(1)Θ(logn)OO(logn)ΘO


Chào mừng, và cảm ơn vì đã dành thời gian để gửi câu trả lời! Tuy nhiên, tôi không thể nói quan điểm của bạn ở đây là gì. Trong đoạn đầu tiên, bạn cung cấp một số suy đoán. Trong lần thứ hai, bạn đề xuất một quan điểm là "cẩu thả": nói "đó là trường hợp trung bình " không nói gì về trường hợp tốt nhất, ngoại trừ trường hợp đó trong cùng một lớp. Nói "đó là trường hợp trung bình " ngụ ý cùng giới hạn trên! Nếu bạn muốn truyền đạt thông tin bổ sung về trường hợp tốt nhất, bạn sẽ phải cung cấp thông tin rõ ràng theo bất kỳ cách nào. Do đó, tôi không thấy cách bạn tạo điểm cho việc sử dụng O trên Θ. O(logn)Θ(logn)
Raphael

@Raphael Tôi giới thiệu cho bạn các định nghĩa của hai ký hiệu. Hơn nữa, nhận ra rằng chúng được sử dụng để phân loại "tốc độ tăng trưởng" không triệu chứng của thời gian chạy, chứ không phải thời gian chạy như được tuyên truyền bởi các câu trả lời và nhận xét khác nhau của bạn.
Hamed Nassar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.