2010-07-19 13 views
16

Tôi đã xem qua câu hỏi sau.Về việc hợp nhất tại chỗ trong một mảng

Với một loạt các n yếu tố và một số nguyên k nơi k < n. Elements {một ... một k} và { một k ... mộtn} đã được sắp xếp. Cung cấp thuật toán sắp xếp theo thời gian O (n) và O (1).

Dường như tôi không thể thực hiện được trong thời gian O (n) và không gian O (1). Vấn đề thực sự dường như được yêu cầu làm thế nào để làm các bước hợp nhất của mergesort nhưng tại chỗ. Nếu nó có thể, sẽ không sáp nhập được thực hiện theo cách đó? Tôi không thể thuyết phục bản thân mình mặc dù và cần một số ý kiến.

+0

Câu hỏi có nêu rõ loại hợp nhất không? Tôi biết nó có thể hợp nhất sắp xếp tại chỗ, nhưng không phải trong thời gian O (n) (ít nhất tôi chưa bao giờ nghe nói về nó.) – jrista

+0

Không, nó không. Tôi đang làm tương tự với bước hợp nhất. Nó trông tương tự. – Sid

+0

Nếu bạn đã đăng chính xác từ ngữ của câu hỏi, thì có vẻ như không liên quan gì đến việc hợp nhất. Có các thuật toán sắp xếp là không gian O (1) và O (n) tại chỗ cho một mảng được sắp xếp trước (tức là sắp xếp chèn). Mergesort không phải là một trong số họ, và nó nổi tiếng rằng nó không phải là một trong số họ, vì vậy ... – jrista

Trả lời

9

This dường như chỉ ra rằng có thể thực hiện trong không gian O (lg^2 n). Tôi không thể thấy làm thế nào để chứng minh rằng nó là không thể hợp nhất trong không gian liên tục, nhưng tôi không thể nhìn thấy làm thế nào để làm điều đó hoặc.

Chỉnh sửa: Tham chiếu đuổi theo, Knuth Tập 3 - Bài tập 5.5.3 nói "Thuật toán phức tạp hơn đáng kể của L. Trabb-Pardo cung cấp câu trả lời tốt nhất có thể cho vấn đề này: Có thể thực hiện hợp nhất ổn định trong O (n) thời gian và phân loại ổn định trong thời gian O (n lg n), chỉ sử dụng các bit (lg n) của bộ nhớ phụ cho một số chỉ số cố định của biến số chỉ định

Thêm references mà tôi chưa đọc.

Chỉnh sửa tiếp theo: Bài viết này tuyên bố rằng bài viết của Huang và Langston có thuật toán kết hợp hai danh sách có kích thước m và n theo thời gian O (m + n), vì vậy câu trả lời cho câu hỏi của bạn dường như là có. Rất tiếc, tôi không có quyền truy cập vào bài viết, vì vậy tôi phải tin tưởng thông tin cũ. Tôi không chắc làm thế nào để hòa giải điều này với tuyên bố của Knuth rằng thuật toán Trabb-Pardo là tối ưu. Nếu cuộc sống của tôi phụ thuộc vào nó, tôi sẽ đi với Knuth.

Tôi bây giờ thấy rằng điều này đã được yêu cầu trước đó và tràn ngăn xếp question a number lần. Tôi không có trái tim để gắn cờ nó như là một bản sao.

Huang B.-C. và Langston M. A., Hợp nhất thực tế tại chỗ, Comm. ACM 31 (1988) 348-352

+0

Bạn nói đúng. Tôi có thể đọc bài báo kể từ khi tôi là trường đại học. Có vẻ như nó là có thể mặc dù kỹ thuật này khá phức tạp. Cảm ơn con trỏ. – Sid

+1

Bạn có thể tìm thấy bài báo tại CiteSeerX. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.8523 –

+0

@Daniel Cảm ơn. Kỹ năng googling của tôi cần cải thiện. – deinst

1

Không thể thực hiện được, mặc dù công việc của tôi sẽ dễ dàng hơn nhiều nếu nó là :).

Bạn có yếu tố O (log n) mà bạn không thể tránh. Bạn có thể chọn để lấy nó như là thời gian hoặc không gian, nhưng cách duy nhất để tránh nó là không sắp xếp. Với không gian O (log n), bạn có thể xây dựng danh sách các lần tiếp tục theo dõi vị trí bạn đã lưu trữ các phần tử không hoàn toàn phù hợp. Với đệ quy này có thể được thực hiện để phù hợp với O (1) đống, nhưng đó là chỉ bằng cách sử dụng O (log n) stack khung thay thế.

Đây là tiến độ của tỷ lệ phân loại hợp nhất và phát triển từ 1-9.Lưu ý cách bạn yêu cầu tính toán không gian log để theo dõi các đảo ngược thứ tự do các ràng buộc song song của không gian cố định và các hoán đổi tuyến tính.

 
.  - 
135792468 
. - 
135792468 
    : .- 
125793468 
    : .- 
123795468 
    #.:- 
123495768 
    :.- 
123459768 
     .:- 
123456798 
     .- 
123456789 

123456789 

Có một số điều kiện biên tinh tế, một chút khó khăn hơn so với tìm kiếm nhị phân để có được quyền, và ngay cả trong này hình thức (có thể), và do đó là một vấn đề bài tập về nhà xấu; nhưng một bài tập tâm thần thực sự tốt.

Cập nhật Dường như tôi nhầm lẫn và có một thuật toán cung cấp thời gian O (n) và O (1). Tôi đã tải xuống các giấy tờ để soi sáng bản thân mình và rút câu trả lời này là không chính xác.

+0

Có thể có danh sách được liên kết. O (log n) xuất phát từ một nơi khác. – Joshua

+0

Tôi có thể xem cách thực hiện với không gian bổ sung. Tôi không thể thấy làm thế nào để chứng minh rằng bạn không thể làm tốt hơn, tức là không gian thêm O (lg n) là cần thiết để giữ cho mọi thứ tuyến tính. – deinst

+0

@Joshua. Nó không thực sự công bằng để nói rằng nó có thể với một danh sách liên kết, bởi vì danh sách có O (n) thêm phần thông tin mà làm cho nó dễ dàng hơn - các con trỏ từ yếu tố đến yếu tố. Nếu bạn có thể đủ khả năng O (n) thêm không gian, bạn có thể làm cũng như với một mảng. Bạn phân bổ một mảng kết quả mới, và chỉ cần đi bộ hai mảng ban đầu của bạn, sao chép các mục ra theo thứ tự. – cape1232

2

Có một số thuật toán để thực hiện việc này, không có thuật toán nào trong số đó rất dễ sử dụng. Ý tưởng quan trọng là sử dụng một phần của các mảng để hợp nhất như một bộ đệm, sau đó thực hiện việc hợp nhất tiêu chuẩn bằng cách sử dụng bộ đệm này cho không gian phụ trợ. Nếu sau đó bạn có thể định vị lại các phần tử sao cho các phần tử đệm nằm ở đúng chỗ, bạn là vàng.

Tôi đã viết lên an implementation của một trong các thuật toán này trên trang web cá nhân của tôi nếu bạn quan tâm đến việc xem xét nó. Nó dựa trên bài báo “Thực hành sáp nhập tại chỗ” của Huang và Langston. Có thể bạn sẽ muốn xem qua bài báo đó để biết một số thông tin chi tiết.

Tôi cũng nghe nói rằng có những thuật toán thích ứng tốt cho việc này, sử dụng bộ đệm kích thước cố định mà bạn chọn (có thể là O (1) nếu bạn muốn), nhưng sau đó quy mô thanh lịch với kích thước bộ đệm. Tôi không biết bất kỳ điều gì trong số này nằm ngoài đầu của tôi, nhưng tôi chắc chắn một tìm kiếm nhanh cho "hợp nhất thích nghi" có thể biến cái gì đó lên.