Cần một tổng quan tốt cho các thuật toán cấu trúc dữ liệu ngắn gọn


14

(đã hỏi trên trang web chính , nhưng cũng hỏi ở đây để được bảo hiểm tốt hơn, xin lỗi)

Vì tôi biết về Cấu trúc dữ liệu ngắn gọn, tôi rất cần một cái nhìn tổng quan tốt về hầu hết các phát triển gần đây trong lĩnh vực đó.

Tôi đã googled và đọc rất nhiều bài viết tôi có thể thấy trong đầu kết quả google theo yêu cầu từ đầu của tôi. Tôi vẫn nghi ngờ tôi đã bỏ lỡ điều gì đó quan trọng ở đây.

Đây là những chủ đề được tôi đặc biệt quan tâm:

  1. Mã hóa ngắn gọn của cây nhị phân với các hoạt động hiệu quả là lấy cha mẹ, con trái / phải, số phần tử trong một cây con.

    Câu hỏi chính ở đây là như sau: tất cả các cách tiếp cận mà tôi biết về giả sử các nút cây được liệt kê theo thứ tự đầu tiên (như trong công việc tiên phong trong lĩnh vực này Jacobson, G. J (1988). Cấu trúc dữ liệu tĩnh) có vẻ phù hợp với nhiệm vụ của tôi Tôi xử lý các cây nhị phân khổng lồ được bố trí theo chiều sâu và các chỉ số nút đầu tiên là các khóa cho các thuộc tính nút khác, vì vậy việc thay đổi bố cục cây có một số chi phí đối với tôi mà tôi muốn giảm thiểu. Do đó, quan tâm đến việc có được các tài liệu tham khảo cho các công trình xem xét bố trí cây BF khác.

  2. Các mảng vật phẩm có độ dài thay đổi lớn trong bộ nhớ ngoài. Các mảng là bất biến: Tôi không cần thêm / xóa / chỉnh sửa các mục. Yêu cầu duy nhất là thời gian truy cập phần tử O (1) và chi phí càng thấp càng tốt, tốt hơn là cách tiếp cận bù và kích thước đơn giản. Dưới đây là một số thống kê tôi thu thập về dữ liệu điển hình cho nhiệm vụ của mình:

    số lượng vật phẩm tiêu biểu - hàng trăm triệu, lên tới hàng chục milliards;

    khoảng 30% các mặt hàng có chiều dài không quá 1 bit ;

    Các mục 40% -60% có độ dài nhỏ hơn 8 bit;

    chỉ một vài phần trăm của các mục có độ dài từ 32 đến 255 bit (255 bit là giới hạn)

    chiều dài mục trung bình ~ 4 bit +/- 1 bit.

    bất kỳ phân phối độ dài vật phẩm nào khác về mặt lý thuyết là có thể nhưng tất cả các trường hợp thực tế thú vị đều có số liệu thống kê gần với mô tả ở trên.

Liên kết đến các bài viết về bất kỳ sự phức tạp, hướng dẫn về bất kỳ thư viện C / C ++ nào, ít nhiều được ghi lại, - bất cứ điều gì hữu ích cho bạn trong các nhiệm vụ tương tự hoặc những gì trông giống như điều đó theo phỏng đoán của bạn - tất cả những điều đó đều được đánh giá cao.

Cập nhật : Tôi quên thêm vào câu hỏi 1: cây nhị phân tôi đang xử lý là bất biến. Tôi không có yêu cầu thay đổi chúng, tất cả những gì tôi cần chỉ là truyền tải chúng theo nhiều cách khác nhau luôn chuyển từ nút sang con hoặc sang cha mẹ, do đó chi phí trung bình của các hoạt động đó là O (1).

Ngoài ra, cây thông thường có hàng triệu nút và không nên được lưu trữ đầy đủ trong RAM.

Câu trả lời:


12

Tôi giả sử rằng bạn quan tâm đến các cấu trúc dữ liệu bộ nhớ ngoài cô đọng, hiệu quả trong thực tế. Trong trường hợp đó, bạn có thể có được những gì bạn muốn với một vài kỹ thuật cơ bản và một số kỹ thuật.

Đối với cây, tôi sẽ bắt đầu với việc đọc Arroyuelo et al.: Cây cô đơn trong thực tế . Bài viết liên quan đến cây trong bộ nhớ chính, nhưng hầu hết các kỹ thuật có thể được sử dụng trong bộ nhớ ngoài với các lựa chọn tương tự như dưới đây.

Đối với câu hỏi thứ hai của bạn, sự lựa chọn quan trọng nhất là quyết định bạn sử dụng mã hóa nào cho các mục. Với phân phối mà bạn mô tả, trước tiên tôi sẽ thử sử dụng -codes hoặc -codes . Khi bạn đã chọn mã hóa, bước tiếp theo là mã hóa mảng theo khối có kích thước , trong đó kích thước khối được chọn để việc đọc đĩa ngẫu nhiên có kích thước có hiệu quả trong thực tế.γδBB

Để tìm khối chính xác một cách nhanh chóng, bạn cần một từ điển xếp hạng nằm trong bộ nhớ chính. Giả sử rằng bạn có mục, bạn xây dựng chuỗi nhị phân có độ dài , trong đó mục iff bắt đầu một khối mới. Mã hóa Gap nén chuỗi tốt; Gupta et al.: Cấu trúc dữ liệu nén: từ điển và các biện pháp nhận biết dữ liệu đưa ra một ví dụ về chỉ số đó. Nếu bạn muốn tìm mục , thì bạn cần lấy khối và giải mã nó để lấy vật phẩm.nSnS[Tôi]= =1Tôijrmộtnk(j)

Nếu bạn muốn giữ chỉ số xếp hạng nhỏ, bạn phải làm cho kích thước khối khá lớn (có thể là kilobyte hoặc hàng chục kilobyte), làm cho giải pháp cơ bản ở trên cần nhiều CPU. Điều này có thể được giải quyết bằng cách thêm một ít chi phí vào các khối được lưu trữ trên đĩa. Về cơ bản, bạn áp dụng cùng một giải pháp đệ quy, sao cho mỗi khối đĩa lưu trữ một số khối nhỏ cũng như một chỉ số xếp hạng khác. Khi bạn đã lấy được khối đĩa chính xác, bạn sử dụng chỉ số xếp hạng bên trong nó để tìm đúng khối nhỏ để giải mã, thay vì giải mã toàn bộ khối. Với chỉ số phụ này, các truy cập ngẫu nhiên có thể trở thành giới hạn I / O ngay cả với các ổ đĩa trạng thái rắn nhanh nhất hiện có.

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.