Ngăn xếp có thể chia


22

Những gì được biết về cấu trúc dữ liệu có thể duy trì một chuỗi các mục theo hai hoạt động sau đây?

  • Đẩy (x): thêm x vào cuối chuỗi và trả về mã định danh cho vị trí của nó trong chuỗi
  • Trích xuất (S): được cung cấp một bộ định danh không có thứ tự, xóa các mục trong các vị trí đó khỏi chuỗi và trả về danh sách các mục đã xóa theo thứ tự

Nếu bạn thích, bạn có thể coi đây là một ngăn xếp hoặc một hàng đợi với thao tác phân tách tách nó thành hai ngăn xếp: thao tác trích xuất có thể được sử dụng để thực hiện thao tác pop hoặc dequeue, và cũng có thể đặt chuỗi trích xuất của các mục trở lại vào một ngăn xếp hoặc hàng đợi khác nhau.

Những gì tôi đã biết: người ta có thể duy trì chuỗi dưới dạng danh sách liên kết đôi, trong đó mỗi mã định danh chỉ là một con trỏ tới nút danh sách được liên kết và mỗi nút cũng lưu trữ một số vị trí cho phép so sánh nhanh giữa vị trí của hai yếu tố không liên quan theo trình tự. Không khó để cập nhật số vị trí khi cấu trúc dữ liệu tiến triển sao cho tất cả chúng đều là số nguyên dương có giá trị tối đa , trong đó là số mục hiện tại trong danh sách. Với cấu trúc dữ liệu này, phần khó khăn duy nhất của thao tác trích xuất là sắp xếp các mục được trích xuất theo số vị trí của chúng. Việc trích xuất các mục mấtn k O ( k O(n)nkO(kloglogk) Chẳng hạn thời gian ngẫu nhiên dự kiến ​​sử dụng thuật toán sắp xếp số nguyên của Han và Thorup từ FOCS 2002, và một hoạt động đẩy cần thời gian không đổi.

Những gì tôi không biết: có thể xử lý trích xuất trong thời gian và đẩy trong thời gian không đổi? Có tài liệu về vấn đề này? Có khó như phân loại số nguyên không?O(k)

Động lực: đây là bước cơ bản cần thiết để đặt hàng các mục trong thuật toán lập lịch Coffman-Graham, cũng có các ứng dụng trong vẽ biểu đồ. Phần khó của Coffman-Graham là một trật tự tôpô từ vựng. Điều này có thể được thực hiện bằng cách duy trì, đối với mỗi đại diện khác nhau, một chuỗi các đỉnh với độ phân giải đó trong biểu đồ con được tạo bởi các đỉnh còn lại. Sau đó, liên tục loại bỏ đỉnh đầu tiên khỏi chuỗi các đỉnh zero-indegree và thêm nó vào thứ tự tôpô; trích xuất các hàng xóm của từ các độ mà trước đây chúng thuộc về và đẩy chúng lên chuỗi cho mức độ nhỏ hơn tiếp theo. Vậy mộtv O ( k )vvO(k) thời gian cho các hoạt động trích xuất trong cấu trúc dữ liệu này sẽ dẫn đến việc triển khai thời gian tuyến tính của thuật toán Coffman-Graham.

Vì ban đầu hỏi điều này, tôi đã tìm thấy một bài báo của Sethi từ năm 1976 cho phép thuật toán CoffmanTHER Graham được thực hiện theo thời gian tuyến tính, và đưa nó vào bài viết Wikipedia của tôi về thuật toán Coffman xông Graham , vì vậy động lực ban đầu ít có ý nghĩa. Tôi vẫn tò mò câu trả lời là gì.


Nếu việc chèn thêm chỉ xảy ra ở cuối chuỗi, bạn có thể xác định cả danh sách liên kết kép và bảng băm của các vị trí mục. Chèn: khấu hao O (1) (chỉ cần giữ một con trỏ đến mục cuối cùng). Trích xuất các mục k: khấu hao O (k) (đối với mỗi phần tử của S, lấy con trỏ và xóa nó khỏi bảng băm, lấy và xóa mục khỏi danh sách và thêm nó vào kết quả trích xuất).
Marzio De Biasi

3
Không phải trích xuất các mục từ danh sách mất thời gian, nó sắp xếp lại chúng từ thứ tự chưa sắp xếp của đối số để Trích xuất theo thứ tự đúng.
David Eppstein

Câu trả lời:


1

Tôi nghĩ rằng điều này ít nhất cũng khó như sắp xếp một tập hợp các số nguyên với "lời khuyên ngẫu nhiên" về đa thức kích thước trong . Theo lời khuyên ngẫu nhiên, ý tôi là với bất kỳ nào, có một phân phối cố định ( chỉ phụ thuộc vào ) trên các chuỗi có kích thước poly ( ) và thuật toán của chúng tôi (được mô hình hóa bằng máy RAM) được cấp quyền truy cập ngẫu nhiên vào một mẫu đơn từ . là cấu trúc dữ liệu (ngẫu nhiên) sau khi đẩy theo thứ tự, cùng với bảng băm ánh xạ các số nguyên sang số nhận dạng trong thời gian dự kiến .n n D n n n D n D n [ n ] O ( 1 )S[n]nnDnnnDnDn[n]O(1)

Với thiết lập đó, đối với một ví dụ của vấn đề sắp xếp số nguyên, chúng ta có thể phát hành trích xuất ( ) (thực sự chúng ta cần các định danh của nhưng ánh xạ này có thể được thực hiện trong thời gian cho mỗi mục bằng cách sử dụng bảng băm là một phần của lời khuyên) và đầu vào sẽ được sắp xếp trong thời gian cần thiết để thực hiện giải nén.S S O ( 1 )S[n]SSO(1)

Vì vậy, thông điệp là, trừ khi một số thông tin bên "miễn phí" chỉ phụ thuộc vào giới hạn trên của số nguyên có thể giúp việc sắp xếp số nguyên dễ dàng hơn, trích xuất cũng khó như sắp xếp số nguyên.

Có phải điều này ngụ ý một mối quan hệ giữa hai vấn đề mà không có mô hình kỳ lạ? Đây có phải là khái niệm về lời khuyên ngẫu nhiên một cái gì đó được biết đến? Đây giống như một giao thức MA, nhưng thông điệp của Merlin không được phép phụ thuộc vào đầu vào và chúng tôi quan tâm đến thời gian chạy của Arthur.


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Dave

Ω(n)DnkO(k)Dn

Đây là lý do tôi không tìm thấy câu trả lời này hoàn toàn thuyết phục. Nếu bạn chỉ có một bộ S số nguyên mà bạn muốn sắp xếp, mọi thứ đều là thời gian tuyến tính (chỉ cần đếm sắp xếp theo O (n + k)). Nhưng nếu bạn đang cố gắng sử dụng cấu trúc dữ liệu này để mô phỏng một chuỗi nhiều loại nhỏ (để loại sắp xếp đó không đủ tốt) thì chỉ có loại đầu tiên trong số này là hoàn toàn không bị ràng buộc: sau đó, bạn đã xóa một số trong số các phần tử của [n], vì vậy mỗi chuỗi bạn sắp xếp phải tách rời khỏi các phần tử trước đó. Vì vậy, có vẻ khó để giảm bớt từ việc sắp xếp công việc.
David Eppstein

O(k)O(n+k)

Ω(n)DnO(k)
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.