Cấu trúc dữ liệu cho các đồ thị có hướng và không bị giới hạn có tầm quan trọng cơ bản. Các triển khai nổi tiếng và được sử dụng rộng rãi như Boost Graph Library và Lemon được thiết kế sao cho các chỉ số nguyên tiếp giáp của các nút và cạnh không được tiếp xúc với người dùng thông qua giao diện.Tại sao cấu trúc dữ liệu C++ cho biểu đồ ẩn chỉ số nguyên liền kề?
Thay vào đó, người dùng xác định các nút và cạnh bằng các đối tượng đại diện (nhỏ). Một ưu điểm là các đối tượng này được cập nhật tự động khi các chỉ mục của các nút và các cạnh thay đổi do việc loại bỏ các cạnh hoặc các nút khỏi biểu đồ.
Theo ý kiến của tôi (!), Lợi thế này bị đánh giá quá cao. Người dùng thường sẽ lưu trữ các đối tượng đại diện của các nút và/hoặc các cạnh trong một vùng chứa, ví dụ: std::vector
. Bây giờ, nếu các nút hoặc các cạnh được loại bỏ khỏi đồ thị và các đối tượng đại diện của chúng trở nên không hợp lệ, người dùng cần bỏ qua hoặc sắp xếp lại vectơ để giữ các chỉ số nguyên hợp nhau, nghĩa là, thực hiện chính xác sổ kế toán mà thiết kế được cho là làm cho không cần thiết.
Do đó, câu hỏi của tôi là: Lựa chọn thiết kế (ẩn các chỉ số nguyên liền kề của các nút và cạnh từ người dùng) có lợi thế khác không?
Câu hỏi thú vị nhưng điều này chỉ có thể áp dụng để tăng biểu đồ bằng cách sử dụng vecS. Boost cho phép tạo ra các đồ thị bằng nhiều loại container khác nhau. Không phải tất cả chúng đều yêu cầu các chỉ mục int tiếp giáp. Các trường hợp bạn đề cập, thêm và xóa các nút hoặc cạnh, không phù hợp với vùng chứa vector. – pbible
Tôi hiểu rằng Thư viện đồ thị tăng cường cho phép chúng tôi lưu trữ danh sách kề trong các vùng chứa không cung cấp truy cập ngẫu nhiên thời gian không đổi nhưng chèn và xóa các phần tử thời gian liên tục. Điều này lần lượt cho phép chúng tôi chèn và xóa các cạnh trong thời gian logarit ở mức độ của đồ thị, với điều kiện là các thùng chứa phải được sắp xếp. Ràng buộc bản thân vào các thùng chứa với truy cập ngẫu nhiên thời gian không đổi sẽ làm phức tạp thời gian cho việc chèn và xóa các cạnh tuyến tính ở mức độ của biểu đồ. Tuy nhiên, trong thực tế, thời gian chạy tuyệt đối có thể được giữ nhỏ bằng cách sử dụng, ví dụ: 'memmove'. –