Cấu trúc dữ liệu tối ưu cho một cây bản đồ là gì.


9

Tôi đang tìm kiếm một cấu trúc dữ liệu, về cơ bản là một cây bản đồ, trong đó bản đồ ở mỗi nút chứa một số phần tử mới, cũng như các phần tử trong bản đồ của nút cha. Theo bản đồ ở đây tôi có nghĩa là một bản đồ lập trình với các khóa và giá trị, như bản đồ trong STL hoặc dict trong python.

Ví dụ: có thể có một nút gốc:

root = {'car':1, 'boat':2}

và 2 con, mỗi con thêm một yếu tố vào bản đồ cha

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

Tôi muốn điều này là không gian hiệu quả nhất có thể, tức là tôi không muốn lưu trữ một bản sao hoàn chỉnh của bản đồ kết quả ở mỗi nút, nhưng lý tưởng là việc tra cứu vẫn sẽ là O (log N), N là tổng số các phần tử tại nút, không phải toàn bộ cây.

Tôi đã nghĩ có lẽ có một hàm băm thông minh mà tôi có thể sử dụng cho việc này, nhưng không thể đưa ra bất cứ điều gì.

Cách tiếp cận ngây thơ sẽ lưu trữ các mục mới được thêm vào trong bản đồ tại mỗi nút và sau đó di chuyển lên cây nếu không tìm thấy gì. Tôi không thích điều này bởi vì nó phụ thuộc vào độ sâu của cây.


Vì vậy, mỗi nút đại diện cho một bản đồ tinh chỉnh bản đồ được lưu trữ trong cha mẹ?
Suresh Venkat

Ngoài ra, bạn có nghĩa là bản đồ theo nghĩa toán học hoặc bản đồ?
Suresh Venkat

Tôi có nghĩa là một bản đồ theo nghĩa toán học / CS. Giống như bản đồ trong STL chẳng hạn.
phreeza

@Suresh: Có vẻ như đó không phải là một sàng lọc. Nếu tôi trả lời đúng câu hỏi, một nút con sẽ thêm các phần tử mới vào bản đồ của nút cha của nó.
Jukka Suomela

và để trả lời câu hỏi đầu tiên, mỗi nút sẽ tinh chỉnh bản đồ theo nghĩa có thêm các cặp khóa / giá trị được thêm vào.
phreeza

Câu trả lời:


10

Bạn chưa nói truy vấn là gì, nhưng tôi sẽ giả sử truy vấn () lấy một nút và khóa và muốn giá trị được liên kết (hoặc null nếu không có giá trị đó tồn tại). Trong trường hợp này, tôi nghĩ nói chung bạn không thể làm tốt hơn việc lưu trữ một bản đồ riêng biệt ở mỗi nút. Ví dụ, hãy xem xét một cây sâu bướm trong đó mỗi nút đường dẫn có một nút được kết nối với nó bị tách ra (tổng cộng 2n nút). Root nó ở một đầu của con đường. Bây giờ giả sử kích thước vũ trụ cho các phím là m. Đối với mỗi nút rẽ nhánh v và mỗi m có thể có khóa, khóa đó có thể tồn tại hoặc không tồn tại tại v và cả hai sẽ tuân thủ ràng buộc cây con của bạn. Vì vậy, có khả năng cho dù mỗi khóa tồn tại ở mỗi nút ngã ba, vì vậy bạn cần mn bit không gian chỉ để lưu trữ thông tin cần thiết.2mn


5
Nhưng ví dụ này không cho thấy rằng bạn phải lưu trữ thông tin dư thừa (nghĩa là bạn cũng cần sao chép các mục của nút gốc ở mỗi đứa trẻ)!
Jukka Suomela

Tôi bối rối. Trong cây có độ sâu với nút, rõ ràng là bạn không thể lưu trữ các ràng buộc trong không gian . Là ví dụ của bạn cho thấy một cái gì đó nhiều hơn? n m o ( m )1nmo(m)
Radu GRIGore

15

Trước hết, tôi nghĩ ý của bạn về "bản đồ" là "từ điển" trong biệt ngữ TCS. Thứ hai, tôi không hiểu cụm từ "lý tưởng là việc tra cứu vẫn sẽ là ", vì trong từ điển, việc tra cứu mất thời gian O (1) với nhiều bảng băm khác nhau. Thứ ba, bạn chưa nói rõ vấn đề là tĩnh hay động; Tôi đang giả định tĩnh.O(logN)

Độ phức tạp tối ưu cho vấn đề này là tìm kiếm tiền thân), ví dụ sử dụng van Emde Boas. Điều này là tối ưu nếu kích thước từ của bạn là ; xem http://people.csail.mit.edu/mip/ con / pred / pred.pdf để biết giới hạn tiền nhiệm tối ưu.O ( lg lg N ) Θ ( lg n )Θ(O(lglgN)Θ(lgn)

Cách thích hợp để tấn công vấn đề là xây dựng một bảng băm toàn cầu và xử lý phân cấp riêng cho từng khóa trong bảng. Đối với một khóa , chúng ta biết các nút nơi nó xuất hiện. Xem xét một giao dịch theo thứ tự của cây. Các nút trong đó xuất hiện xác định các khoảng theo thứ tự này. Để xác định xem có trong bảng băm của một số nút , bạn phải hỏi xem đâm bất kỳ phân đoạn nào như được xác định ở trên không. Điều này được thực hiện dễ dàng bằng tìm kiếm của người tiền nhiệm, nơi chúng tôi xây dựng bảng tiền thân cho tất cả các điểm cuối khoảng.x x v vxxxvv

Đối với giới hạn dưới, lưu ý rằng ngay cả một câu hỏi đâm cũng khó như người tiền nhiệm (xem phần giảm từ tìm kiếm của người tiền nhiệm được tô màu). Vì các tham chiếu giấy ở trên cho thấy hành vi tổng trực tiếp tối ưu cho tìm kiếm của người tiền nhiệm, điều đó có nghĩa là thuật toán được mô tả ở trên là tối ưu cho bất kỳ tỷ lệ nào giữa số lượng nút và tổng số khóa.

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.