Đánh giá độ phức tạp thời gian trung bình của một thuật toán bubbleort nhất định.


11

Xem xét mã giả này của bong bóng:

FOR i := 0 TO arraylength(list) STEP 1  
    switched := false
    FOR j := 0 TO arraylength(list)-(i+1) STEP 1
        IF list[j] > list[j + 1] THEN
            switch(list,j,j+1)
            switched := true
        ENDIF
    NEXT
    IF switched = false THEN
        break
    ENDIF
NEXT

Điều gì sẽ là những ý tưởng cơ bản mà tôi sẽ phải ghi nhớ để đánh giá độ phức tạp thời gian trung bình? Tôi đã hoàn thành việc tính toán các trường hợp xấu nhất và tốt nhất, nhưng tôi bế tắc khi cân nhắc làm thế nào để đánh giá độ phức tạp trung bình của vòng lặp bên trong, để tạo thành phương trình.

Phương trình trường hợp xấu nhất là:

i=0n(j=0n(i+1)O(1)+O(1))=O(n22+n2)=O(n2)

trong đó sigma bên trong đại diện cho vòng lặp bên trong và sigma bên ngoài đại diện cho vòng lặp bên ngoài. Tôi nghĩ rằng tôi cần thay đổi cả hai sigmas do phần "if-then-break", điều này có thể ảnh hưởng đến sigma bên ngoài nhưng cũng do mệnh đề if trong vòng lặp bên trong, sẽ ảnh hưởng đến các hành động được thực hiện trong một vòng lặp (4 hành động + 1 so sánh nếu đúng, khác chỉ là 1 so sánh).

Để làm rõ về thuật ngữ thời gian trung bình: Thuật toán sắp xếp này sẽ cần thời gian khác nhau trên các danh sách khác nhau (có cùng độ dài), vì thuật toán có thể cần nhiều hoặc ít bước qua / trong các vòng lặp cho đến khi danh sách hoàn toàn theo thứ tự. Tôi cố gắng tìm một toán học (cách không thống kê) để đánh giá trung bình của các vòng đó cần thiết.

Đối với điều này, tôi hy vọng bất kỳ thứ tự sẽ có cùng khả năng.


6
trước tiên bạn cần xác định trung bình thậm chí có nghĩa là gì. Vì thuật toán mang tính xác định, bạn phải đảm nhận một số loại phân phối trên đầu vào.
Suresh

@Sim Bạn có thể chỉ ra cách bạn tính độ phức tạp trong trường hợp xấu nhất không? Sau đó, chúng tôi có thể có một ý tưởng về ý nghĩa của bạn bởi độ phức tạp trung bình trong trường hợp của bạn.
0x0

Ý tôi là thời gian trung bình theo cách của thời gian rất có thể cần thiết (hay nói cách khác là phiên bản toán học 'thuần túy' của: trung bình của tất cả các lần quan sát khi thực hiện phân tích thống kê). Ví dụ, quicksort có trung bình nlogn mặc dù trường hợp xấu nhất của nó là n ^ 2.
Sim

1
@Sim Trong trường hợp bong bóng trung bình sắp xếp trường hợp = độ phức tạp của thời gian trường hợp xấu nhất, nghĩa là, Độ phức tạp của trường hợp trung bình cũng là n2
0x0

3
Có một sự khác biệt. quicksort được tính trung bình "trên sự lựa chọn tung đồng xu khi chọn trục" không liên quan gì đến dữ liệu. Trong khi bạn đang ngụ ý rằng bạn muốn trung bình "trên tất cả các đầu vào" giả định (ví dụ) rằng bạn mong đợi mỗi thứ tự của đầu vào xảy ra với cùng một xác suất. Điều đó hợp lý, nhưng nó cần được nêu rõ ràng.
Suresh

Câu trả lời:


9

nn!1n

n!

(xi)inddxiimaxi(max(1,ixi))

Sau đó, bạn làm toán: với mỗi tìm số của danh sách với khoảng cách tối đa cụ thể này, thì giá trị mong đợi của là:dcdd

1n! d=0n dcd

Và đó là những suy nghĩ cơ bản mà không có phần khó nhất là tìm kiếm . Có lẽ có một giải pháp đơn giản hơn mặc dù.cd

EDIT: đã thêm 'mong đợi'


Nếu bạn xem xét một phân phối bình thường, có cách nào để xấp xỉ không? cd
Sim

Bạn có thể nóibởi vì bạn có thể trộn lẫn bất cứ nơi nào tất cả các hoán vị của [ , .., ] và nối ở cuối nhưng điều đó là nhỏ để chứng minh trung bình . cd(n+1d)(d1)!2d1n²
jmad

19

Hãy nhớ lại rằng một cặp (resp. ) bị đảo ngược nếu và .(A[i],A[j])(i,j)i<jA[i]>A[j]

Giả sử thuật toán của bạn thực hiện một lần hoán đổi cho mỗi lần đảo ngược, thời gian chạy thuật toán của bạn sẽ phụ thuộc vào số lần đảo.

Tính toán số lượng nghịch đảo dự kiến ​​trong một hoán vị ngẫu nhiên thống nhất rất dễ dàng:

Hãy là một hoán vị, và để cho là ngược lại của . Ví dụ: nếu thì .PR(P)PP=2,1,3,4R(P)=4,3,1,2

Đối với mỗi cặp chỉ số có một đảo ngược trong chính xác một trong hai hoặc .(i,j)PR(P)

Vì tổng số cặp là và tổng số và mỗi cặp được đảo ngược chính xác một nửa số hoán vị, giả sử tất cả các hoán vị đều có khả năng như nhau, nên số lần đảo ngược dự kiến ​​là:n(n1)/2

n(n1)4

cái này đánh giá lượng nghịch đảo. nhưng làm thế nào về số lượng so sánh phụ thuộc vào thời gian của điều khoản phá vỡ được bước vào
Sim

Bạn nhận được một so sánh bằng cách hoán đổi và quan trọng nhất là một lần hoán đổi có thể giảm số lần đảo ngược nhiều nhất là một lần.
jmad

không phải mọi so sánh đều dẫn đến một sự hoán đổi, nếu mệnh đề if là sai, không có phép đảo ngược nào được thực hiện.
Sim

@rgrig Nếu bạn cung cấp một ví dụ ngược lại, thì tôi sẽ sửa câu trả lời của mình.
Joe

@Joe: Tôi đã xóa bình luận của tôi. Đó là sai.
rgrig

2

Số lần hoán đổi <Số lần lặp (trong cả kịch bản trường hợp bong bóng đơn giản cũng như tối ưu hóa)

Số lượng nghịch đảo = Số lần hoán đổi.

Do đó, Số lần lặp>n(n1)4

Do đó, độ phức tạp trường hợp trung bình là . Nhưng, vì trường hợp trung bình không thể vượt quá trường hợp xấu nhất, chúng tôi nhận ra rằng đó là ,ω(n2)O(n2)

Điều này mang lại cho chúng tôi: Thời gian trung bình = θ(n2)

(Độ phức tạp thời gian = Số lần lặp số. Số lần lặp> số lần hoán đổi)


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.