Tại sao sáp nhập O (log n)?


27

Mergesort là một thuật toán chia và chinh phục và là O (log n) vì đầu vào được lặp đi lặp lại một nửa. Nhưng không nên là O (n) vì mặc dù đầu vào được giảm một nửa mỗi vòng lặp, mỗi mục đầu vào cần phải được lặp lại để thực hiện hoán đổi trong mỗi mảng giảm một nửa? Điều này về cơ bản là không có triệu chứng O (n) trong tâm trí của tôi. Nếu có thể, vui lòng cung cấp các ví dụ và giải thích cách tính các thao tác chính xác! Tôi chưa mã hóa bất cứ điều gì nhưng tôi đã xem xét các thuật toán trực tuyến. Tôi cũng đã đính kèm một gif về những gì wikipedia đang sử dụng để hiển thị trực quan cách hoạt động của sự hợp nhất.

nhập mô tả hình ảnh ở đây


33
Đó là O (n log n)
Esben Skov Pedersen

18
Ngay cả thuật toán sắp xếp của thần (thuật toán sắp xếp giả thuyết có quyền truy cập vào một nhà tiên tri cho biết nơi mỗi phần tử thuộc về) có thời gian chạy là O (n) vì nó cần di chuyển từng phần tử ở vị trí sai ít nhất một lần.
Philipp

Câu trả lời:


59

Đó là O (n * log (n)), không phải O (log (n)). Như bạn đã phỏng đoán chính xác, toàn bộ đầu vào phải được lặp qua và điều này phải xảy ra O (log (n)) lần (đầu vào chỉ có thể giảm một nửa O (log (n)) lần). n mục lặp lại log (n) lần cho O (n log (n)).

Nó đã được chứng minh rằng không có loại so sánh có thể hoạt động nhanh hơn thế này. Chỉ các loại dựa vào một thuộc tính đặc biệt của đầu vào như radix sort mới có thể đánh bại sự phức tạp này. Các yếu tố liên tục của sự hợp nhất thường không lớn lắm mặc dù vậy các thuật toán có độ phức tạp tồi tệ hơn thường có thể mất ít thời gian hơn.


3
s / nhanh hơn / với độ phức tạp thấp hơn /
jk.

33

Độ phức tạp của sắp xếp hợp nhất là O (nlogn) và KHÔNG O (logn).

Hợp nhất sắp xếp là một thuật toán chia và chinh phục. Hãy nghĩ về nó theo 3 bước -

  1. Bước chia tính toán trung điểm của từng mảng phụ. Mỗi bước này chỉ mất O (1) thời gian.
  2. Bước chinh phục sắp xếp đệ quy hai phần tử con của n / 2 (cho n) các phần tử mỗi phần tử.
  3. Bước hợp nhất hợp nhất n phần tử cần thời gian O (n).

Bây giờ, đối với các bước 1 và 3 tức là giữa O (1) và O (n), O (n) cao hơn. Hãy xem xét các bước 1 và 3 mất tổng thời gian O (n). Nói nó là cn cho một số hằng số c.

Các bước này được thực hiện bao nhiêu lần?

Đối với điều này, hãy nhìn vào cây bên dưới - cho mỗi cấp độ từ trên xuống dưới Phương thức hợp nhất cuộc gọi cấp 2 trên 2 mảng con có độ dài n / 2 mỗi cấp. Độ phức tạp ở đây là 2 * (cn / 2) = cn Phương thức hợp nhất các cuộc gọi cấp 3 trên 4 mảng con có độ dài n / 4 mỗi mảng. Độ phức tạp ở đây là 4 * (cn / 4) = cn và cứ thế ...

Bây giờ, chiều cao của cây này là (logn + 1) cho một n cho trước. Do đó, độ phức tạp tổng thể là (logn + 1) * (cn). Đó là O (nlogn) cho thuật toán sắp xếp hợp nhất.

Hợp nhất sắp xếp cho n phần tử

Tín dụng hình ảnh: Khan Academy


9

Hợp nhất Sắp xếp là một thuật toán đệ quy và độ phức tạp thời gian có thể được biểu thị như sau mối quan hệ lặp lại.

T (n) = 2T (n / 2) + (n)

Sự lặp lại ở trên có thể được giải quyết bằng phương pháp Cây lặp lại hoặc phương pháp Master. Nó nằm trong trường hợp II của Phương pháp chủ và giải pháp tái phát là (n log n).

Độ phức tạp thời gian của Sắp xếp hợp nhất là (nLogn) trong cả 3 trường hợp (tệ nhất, trung bình và tốt nhất) vì sắp xếp hợp nhất luôn chia mảng thành hai nửa và mất thời gian tuyến tính để hợp nhất hai nửa.

Nó chia mảng đầu vào thành hai nửa, gọi chính nó cho hai nửa và sau đó hợp nhất hai nửa được sắp xếp. Hàm merg () được sử dụng để hợp nhất hai nửa. Hợp nhất (mảng, l, m, r) là quá trình chính giả định rằng mảng [l..m] và mảng [m + 1..r] được sắp xếp và hợp nhất hai mảng con được sắp xếp thành một. Xem sau thực hiện C để biết chi tiết.

MergeSort(arr[], l,  r)
If r > l
     1. Find the middle point to divide the array into two halves:  
             middle m = (l+r)/2
     2. Call mergeSort for first half:   
             Call mergeSort(arr, l, m)
     3. Call mergeSort for second half:
             Call mergeSort(arr, m+1, r)
     4. Merge the two halves sorted in step 2 and 3:
             Call merge(arr, l, m, r)

nhập mô tả hình ảnh ở đây

Nếu chúng ta nhìn kỹ hơn vào sơ đồ, chúng ta có thể thấy rằng mảng được chia theo cách đệ quy thành hai nửa cho đến khi kích thước trở thành 1. Khi kích thước trở thành 1, các quy trình hợp nhất sẽ hoạt động và bắt đầu hợp nhất các mảng trở lại cho đến khi mảng hoàn chỉnh sáp nhập.


1
Bạn có thể giải thích về bản chất của phần hợp nhất của nó và cách nó đóng góp vào hiệu suất O (n log n) không?

Độ phức tạp của hàm hợp nhất là O (n), vì nó lấy 2 mảng làm đầu vào, so sánh chúng và đưa ra đầu ra mới. Vì nó đang so sánh từng phần tử với mọi phần tử khác trong mảng, nên độ phức tạp của hàm hợp nhất này xuất hiện là O (n).
Nishant sethi

1
Tôi thích hình dung này của các loại!
spaaarky21

0

Các thuật toán sắp xếp dựa trên so sánh có giới hạn thấp hơn 𝞨(n*log(n)), có nghĩa là không thể có thuật toán sắp xếp dựa trên so sánh với O(log(n))độ phức tạp thời gian.

Nhân tiện, hợp nhất sắp xếp là O(n*log(n)). Hãy suy nghĩ theo cách này.

[ a1,a2,         a3,a4,         a5,a6,          a7,a8     .... an-3,an-2,     an-1, an ] 
   \ /            \  /           \ /             \  /            \  /            \  /    
    a1'            a3'            a5'             a7'            an-3'           an-1'    
      \            /                \             /                 \             /
            a1''                          a5''                       an-3''
             \                             /                         /
                          a1'''                                     /
                           \
                                              a1''''

Điều này trông giống như một cây nhị phân đảo ngược.

Đặt kích thước đầu vào là n.

Mỗi a_nđại diện cho một danh sách các yếu tố. Dòng đầu tiên a_nchỉ có một yếu tố.

Ở mỗi cấp, tổng chi phí hợp nhất trung bình là n(tồn tại các trường hợp góc mà chi phí thấp hơn [1]). Và chiều cao của cây là log_2(n).

Vì vậy, độ phức tạp thời gian của sắp xếp hợp nhất là O(n*log_2(n)).

[1] nếu sắp xếp trên một danh sách đã được sắp xếp, được gọi là trường hợp tốt nhất. chi phí giảm xuống n/2 + n/4 + n/8 + .... + 1 = 2^log_2(n) -1 ~ O(n). (giả sử chiều dài nlà sức mạnh của hai)


-2

Sắp xếp là một vấn đề NP-Complete trong khoa học máy tính (Vấn đề không đa thức). Điều này có nghĩa là, trừ khi được chứng minh về mặt toán học, bạn không thể xuống dưới O (n log n) khi sắp xếp danh sách các phần tử.

Kiểm tra bài viết này trong Wikipedia ( https://en.wikipedia.org/wiki/P_versus_NP_probols )

Về cơ bản cho đến nay không ai có thể chứng minh rằng (P == NP) và nếu bạn làm thế, trước tiên bạn trở thành triệu phú, thứ hai bạn bắt đầu chiến tranh thế giới III do thực tế là bạn sẽ có thể phá vỡ tất cả các cơ chế bảo mật khóa pub / private được sử dụng ngày nay mọi nơi :)


2
Đó không phải là ý của NP. Ngay cả BubbleSort cũng ở P. Bạn phải cố gắng hết sức để tạo ra một loại không có trong P (ví dụ: BogoSort)
Caleth
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.