Có tồn tại một cấu trúc dữ liệu cho các truy vấn thứ tự và thao tác danh sách nhanh không?


9

Chúng tôi có một tập hợp, , danh sách các phần tử từ tập N = { 1 , 2 , 3 , . . . , n } . Mỗi phần tử từ N xuất hiện trong một danh sách duy nhất trong . Tôi đang tìm kiếm một cấu trúc dữ liệu có thể thực hiện các cập nhật sau:LN={1,2,3,...,n}NL

  1. concat(x,y) : nối danh sách chứa vào cuối danh sách chứaxyx

  2. split(x) : chia danh sách chứa trực tiếp sauxxx

Nó cũng cần thực hiện các truy vấn sau:

  1. follows(x,y) : trả về nếu và nằm trong cùng một danh sách và xuất hiện sau (nhưng không nhất thiết phải liền kề với )x y y x xtruexyyxx

  2. first(x) : trả về phần tử đầu tiên của danh sách chứax

  3. next(x) : trả về phần tử tiếp theo sau trong danh sách chứaxxx

Tôi đã đưa ra một cấu trúc dữ liệu thực hiện các cập nhật này trong thời gian và truy vấn trong thời gian . Tôi chủ yếu quan tâm đến việc có hay không một cấu trúc dữ liệu có thể làm điều này (hy vọng nhanh hơn?).O ( l g ( n ) )O(lg2(n))O(lg(n))

Động lực: các khu rừng có hướng gốc có thể được biểu diễn bằng hai trong số các bộ danh sách này và chúng cho phép tính toán nhanh khả năng tiếp cận trong các khu rừng đó. Tôi muốn xem những gì khác họ có thể được sử dụng cho và nếu tất cả điều này đã được biết đến.

Câu trả lời:


11

Giữ số nguyên của bạn trong danh sách bỏ qua. Danh sách bỏ qua bình thường được sắp xếp theo khóa, nhưng chúng tôi sẽ chỉ sử dụng chúng làm đại diện cho chuỗi. Ngoài ra, duy trì một loạt các con trỏ có kích thước . Mỗi phần tử của mảng nên trỏ đến một nút trong danh sách bỏ qua. Tôi tin rằng điều này hỗ trợ trong và tất cả các hoạt động khác trong .n e x t O ( 1 ) O ( lg n )nnextO(1)O(lgn)

Đặc biệt:

  • s p l i t O ( lg n ) O ( lg n )concat ing hoặc ting hai danh sách bỏ qua mất thời gian và do đó làm mất hiệu lực của hầu hết các con trỏ .splitO(lgn)O(lgn)
  • O ( 1 )next chỉ theo con trỏ chuyển tiếp ở cấp độ lá, mất thời gian .O(1)
  • O ( lg n )first mất thời gian : theo dõi các con trỏ cho đến khi bạn gặp khó khăn, sau đó theo một con trỏ bên trái. Khi bạn không thể theo dõi bất kỳ con trỏ bên trái nào nữa, bạn sẽ ở con trỏ đầu của danh sách bỏ qua của bạn. Theo con trỏ xuống lá, sau đó một con trỏ về phía trước. Đây là yếu tố đầu tiên trong danh sách.O(lgn)
  • f i r s t y x x y O ( lg n ) O ( lg n )follows có phần phức tạp hơn. Tiếp tục như cho , nhưng ghi lại danh sách các giá trị mà bạn gặp khó khăn (nghĩa là bạn không thể theo dõi con trỏ nữa). Chúng tôi sẽ gọi danh sách này bạn ghi lại một "dấu vết". Làm tương tự cho , nhưng theo con trỏ phải khi bạn gặp khó khăn, không phải trái. Nếu đi trước , dấu vết của chúng sẽ giao nhau. Các dấu vết có kích thước . Nếu mỗi phần tử trong theo dõi được chú thích với mức bị kẹt, chúng ta có thể kiểm tra giao điểm trong thời gian .firstyxxyO(lgn)O(lgn)

O ( 1 ) O ( lg n )next là trường hợp xấu nhất , tất cả các trường hợp khác là với xác suất cao . Chúng có thể được thực hiện trong trường hợp xấu nhất bằng cách sử dụng danh sách bỏ qua xác định.O(1)O(lgn)

Tôi nghĩ rằng có thể được tạo thành bằng cách sử dụng các cây (2,5) liên kết với cấp độ lá và tăng cường các gai. Đối với thủ thuật bootstrapping, hãy xem " Các biểu diễn hoàn toàn chức năng của các danh sách được sắp xếp có thể điều khiển được " của Kaplan và Tarjan.O ( lg lg n )concatO(lglgn)


mát mẻ. tôi đã suy nghĩ về danh sách bỏ qua nhưng không thể thấy làm thế nào để làm theo mà không có các giá trị quan trọng liên quan.
Sasho Nikolov

O(lg(n))

1

O(n+mloglogn)nm


O(lglg(n))
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.