Tìm một trường hợp xấu nhất của loại heap


8

Tôi đang giải quyết vấn đề H trong cuộc thi ACM ICPC 2004 21002005 Đông Bắc Châu Âu .

Vấn đề cơ bản là tìm ra trường hợp xấu nhất tạo ra số lượng trao đổi tối đa trong thuật toán (rút xuống) để xây dựng heap.

  • Input: đầu vào fi le chứa ( ).n1n50,000
  • Đầu ra: Xuất ra mảng chứa số nguyên khác nhau từ đến , sao cho nó là một đống và khi chuyển đổi nó thành một mảng được sắp xếp, tổng số trao đổi trong các hoạt động chọn lọc là tối đa có thể.n1n

Đầu vào mẫu: 6
Đầu ra tương ứng:6 5 3 2 4 1

Và các kết quả cơ bản:

[2, 1]   
[3, 2, 1]   
[4, 3, 1, 2] 
[5, 4, 3, 2, 1] 
[6, 5, 3, 4, 1, 2]

2
về cơ bản bạn có hỏi "tại sao mã của tôi quá chậm" không? Tôi nghĩ rằng câu hỏi này quá cục bộ và dù sao thì cũng tốt hơn trong Stack Overflow
Ran G.

Không, thực sự, tôi muốn tìm trường hợp xấu nhất cho thuật toán heapsort. Nhưng mã của tôi là một cố gắng để hiểu những trường hợp này.
jonaprieto

2
Nếu bạn muốn thử sắp xếp vun đống trên tất cả các orderings có thể có của mảng, sau đó nó không phải là rất ngạc nhiên thuật toán của bạn là cực kỳ chậm: nó sẽ có một thời gian chạy ít nhất là , Mà phát triển hơn theo cấp số nhân. 10! đã là 3,6 triệu. Bạn sẽ tốt hơn với một phân tích lý thuyết. (đăng lại bình luận như tôi không nhận định sự bắt đầu của câu hỏi của bạn để phần thứ hai của bình luận của tôi là không hợp lệ)Ω(n!)
Alex ten Brink

Bài viết này dường như có liên quan. Tôi thứ hai Ran; vui lòng chỉnh sửa câu hỏi để nó đặt câu hỏi mà không cần soạn sẵn.
Raphael

Câu trả lời:


4

Với trường hợp xấu nhất cho , chúng ta có thể xây dựng các trường hợp xấu nhất cho n + 1 như sau: chúng ta làm một 'chu kỳ trao đổi như sau: chúng ta hãy n + 1 , đặt nó trong một [ 0 ] , và chúng tôi trao đổi một [ 0 ] với các phần tử tối đa của con của nó, đó là một [ 1 ] hoặc một [ 2 ] , mà chúng tôi lại trao đổi với các phần tử tối đa của con của nó và như vậy, cho đến khi chúng tôi rời khỏi n đống -element, tại thời điểm đó chúng tôi đặt phần tử cuối cùng đó ở n + 1nn+1n+1a[0]a[0]a[1]a[2]nn+1-thị trí.

Một ví dụ: trường hợp xấu nhất cho [ 5 , 4 , 3 , 2 , 1 ] . Chúng tôi trao đổi trong 6 tạo ra heap [ 6 , 5 , 3 , 4 , 1 ] , sau đó chúng tôi kết thúc bằng 2, chúng tôi chèn vào cuối: [ 6 , 5 , 3 , 4 , 1 , 2 ] .n=5[5,4,3,2,1][6,5,3,4,1][6,5,3,4,1,2]

Phương pháp công trình trên bằng cảm ứng: chúng tôi bắt đầu từ kết quả tồi tệ nhất đối với yếu tố và thực hiện một Sift xuống hoạt động theo hướng ngược lại, tối đa hóa số lượng giao dịch hoán đổi nó đã làm ( log ( n ) giao dịch hoán đổi). Bạn không thể thực hiện nhiều giao dịch hoán đổi hơn số này, vì vậy bạn tối đa hóa số lần hoán đổi sau thao tác trích xuất đầu tiên, sau đó bạn còn lại chính xác là trường hợp xấu nhất cho n - 1 phần tử cho thao tác trích xuất tiếp theo. Điều này ngụ ý rằng số lượng giao dịch hoán đổi thực sự là tối đa.n1log(n)n1

Lưu ý rằng phương pháp này cho kết quả khác với mức bạn đã nhận được:

[1]
[2, 1]
[3, 2, 1]
[4, 3, 1, 2]
[5, 4, 1, 3, 2]
[6, 5, 1, 4, 2, 3]
[7, 6, 1, 5, 2, 4, 3]
[8, 7, 1, 6, 2, 4, 3, 5]
[9, 8, 1, 7, 2, 4, 3, 6, 5]
[10, 9, 1, 8, 2, 4, 3, 7, 5 ,6]

Tuy nhiên, cả hai giải pháp đều đúng:

[5, 4, 1, 3, 2]
[2, 4, 1, 3| 5]
[4, 2, 1, 3| 5]
[4, 3, 1, 2| 5]
[2, 3, 1| 4, 5]
[3, 2, 1| 4, 5]

[5, 4, 3, 2, 1]
[1, 4, 3, 2| 5]
[4, 1, 3, 2| 5]
[4, 2, 3, 1| 5]
[1, 2, 3| 4, 5]
[3, 2, 1| 4, 5]

[6, 5, 1, 4, 2, 3]
[3, 5, 1, 4, 2| 6]
[5, 3, 1, 4, 2| 6]
[5, 4, 1, 3, 2| 6]
[2, 4, 1, 3| 5, 6]
[4, 2, 1, 3| 5, 6]
[4, 3, 1, 2| 5, 6]
[2, 3, 1| 4, 5, 6]
[3, 2, 1| 4, 5, 6]

[6, 5, 3, 4, 1, 2]
[2, 5, 3, 4, 1| 6]
[5, 2, 3, 4, 1| 6]
[5, 4, 3, 2, 1| 6]
[1, 4, 3, 2| 5, 6]
[4, 1, 3, 2| 5, 6]
[4, 2, 3, 1| 5, 6]
[1, 2, 3| 4, 5, 6]
[3, 2, 1| 4, 5, 6]

Nhưng, những ví dụ này không phải là đống!
jonaprieto
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.