2012-03-09 43 views
5

Tôi có dữ liệu nhận bộ đệm, có nghĩa là dữ liệu giống như 'luồng' và có độ trễ trong 'IO'. Cách tôi đang làm bây giờ là khi bộ đệm đầy, sử dụng qsort để sắp xếp bộ đệm và ghi kết quả vào đĩa. nhưng có độ trễ rõ ràng khi thực hiện qsort, vì vậy tôi đang tìm một số thuật toán sắp xếp khác có thể bắt đầu sắp xếp trong khi dữ liệu đang được thêm vào bộ đệm, để giảm thời gian tiêu thụ tổng thể.Thuật toán sắp xếp nào phù hợp với điều kiện 'giống như luồng' này?

không biết nếu tôi đã thực hiện bản thân mình rõ ràng và để lại bất kỳ nhận xét nếu cần, nhờ

+2

Sắp xếp chèn. Thực sự ;-) Tuy nhiên, một loại 'O (n lg n)' có thể sắp xếp một lượng lớn dữ liệu khá nhanh ... và không nhất thiết phải nhanh hơn nếu nó "chủ yếu được sắp xếp" (quicksort thực sự có thể rất thoái hóa trong trường hợp này!). .. vì vậy nó có thể là đáng giá để thiết lập một phân tích hiệu suất nhanh chóng. –

Trả lời

5

Sắp xếp theo thứ tự giữ vĩnh viễn dữ liệu trong điều kiện được sắp xếp một phần và so sánh với loại Chèn. Nhưng nó là nhanh hơn đáng kể và có một trường hợp xấu nhất của O (n log n) so với O (n) để sắp xếp chèn.

Cách này hoạt động? Có lẽ tại một số điểm bạn phải ngừng đọc từ luồng, lưu trữ những gì bạn đã sắp xếp và bắt đầu đọc một bộ dữ liệu mới?

+0

1 cho heapsort, bạn không cần nó được sắp xếp hoàn toàn để đệm giữa các ghi –

+0

có trong trường hợp của tôi, tôi phải ngừng đọc từ luồng và sắp xếp bộ đệm và ghi kết quả vào đĩa, và sau đó bắt đầu đọc lại và lặp lại cho đến khi luồng kết thúc –

+0

Sau đó, sắp xếp đống là những gì bạn muốn. Đọc dữ liệu từ luồng vào heap cho đến khi bạn phải dừng lại, và sau đó đọc từ heap và ghi vào đĩa cho đến khi nó rỗng. Đọc dữ liệu từ heap xuất hiện theo thứ tự sắp xếp. – Borodin

2

Tôi nghĩ merge-sort hoặc cây loại có thể giúp đỡ rất nhiều. Hãy xem why on wikipedia.

  • Khi bạn có thể cắt đầu vào lớn trong các khối lớn hợp lý, sắp xếp hợp nhất phù hợp hơn.
  • Khi bạn chèn từng miếng nhỏ, việc sắp xếp cây phù hợp hơn.

Bạn muốn triển khai thuật toán sắp xếp trực tuyến, tức là thuật toán chạy trong khi nhận dữ liệu theo kiểu được sắp xếp hợp lý. Tìm kiếm online algorithms trên web và bạn có thể tìm thấy các thuật toán hay khác.

Trong trường hợp của bạn, tôi sẽ sử dụng sắp xếp cây. Nó không có độ phức tạp tốt hơn so với quicksort (cả hai đều là O(nlog n) hầu hết thời gian và O(n²) trong một vài trường hợp xấu). Nhưng nó phân bổ chi phí cho mỗi đầu vào. Điều này có nghĩa là sự chậm trễ mà bạn phải đợi sau khi dữ liệu cuối cùng được thêm vào không phải là đơn đặt hàng O(nlog n), nhưng O(log n)

0

Bạn có thể thử sử dụng cấu trúc Link Array của mình. Nó sẽ là ok cho tuần tự thêm dữ liệu ngẫu nhiên trong khi vẫn giữ nó được sắp xếp (xem các con số trong bảng). Đây là một biến thể của cách tiếp cận Skip list nhưng với việc triển khai và logic dễ dàng hơn (mặc dù hiệu suất của Danh sách bỏ qua phải tốt hơn)

Các vấn đề liên quan