Câu trả lời này không chỉ dành cho C ++ vì mọi thứ được đề cập là về chính cấu trúc dữ liệu, bất kể ngôn ngữ. Và, câu trả lời của tôi là giả sử rằng bạn biết cấu trúc cơ bản của danh sách kề và ma trận.
Ký ức
Nếu bộ nhớ là mối quan tâm chính của bạn, bạn có thể làm theo công thức này cho một biểu đồ đơn giản cho phép các vòng lặp:
Một ma trận kề là chiếm không gian 2/8 byte (một bit cho mỗi mục nhập).
Một danh sách kề chiếm không gian 8e, trong đó e là số cạnh (máy tính 32 bit).
Nếu chúng ta xác định mật độ của biểu đồ là d = e / n 2 (số cạnh chia cho số cạnh tối đa), chúng ta có thể tìm thấy "điểm dừng" trong đó danh sách chiếm nhiều bộ nhớ hơn ma trận:
8e> n 2 /8 khi d> 1/64
Vì vậy, với những con số này (vẫn là 32 bit cụ thể), điểm dừng ở 1/64 . Nếu mật độ (e / n 2 ) lớn hơn 1/64, thì nên sử dụng ma trận nếu bạn muốn tiết kiệm bộ nhớ.
Bạn có thể đọc về điều này tại wikipedia (bài viết về ma trận kề) và rất nhiều trang web khác.
Lưu ý bên lề : Người ta có thể cải thiện hiệu quả không gian của ma trận kề bằng cách sử dụng bảng băm trong đó các khóa là các cặp đỉnh (chỉ vô hướng).
Lặp lại và tra cứu
Danh sách điều chỉnh là một cách nhỏ gọn chỉ đại diện cho các cạnh hiện có. Tuy nhiên, điều này đi kèm với chi phí có thể tìm kiếm chậm các cạnh cụ thể. Vì mỗi danh sách miễn là mức độ của một đỉnh, thời gian tra cứu trường hợp xấu nhất để kiểm tra một cạnh cụ thể có thể trở thành O (n), nếu danh sách không có thứ tự. Tuy nhiên, việc tìm kiếm các lân cận của một đỉnh trở nên tầm thường và đối với một biểu đồ thưa thớt hoặc nhỏ, chi phí lặp lại qua các danh sách kề có thể không đáng kể.
Mặt khác, ma trận điều chỉnh sử dụng nhiều không gian hơn để cung cấp thời gian tra cứu liên tục. Vì mỗi mục có thể tồn tại, bạn có thể kiểm tra sự tồn tại của một cạnh trong thời gian không đổi bằng cách sử dụng các chỉ mục. Tuy nhiên, tra cứu hàng xóm mất O (n) vì bạn cần kiểm tra tất cả các hàng xóm có thể. Hạn chế không gian rõ ràng là đối với các biểu đồ thưa thớt, rất nhiều phần đệm được thêm vào. Xem các cuộc thảo luận về bộ nhớ ở trên để biết thêm thông tin về điều này.
Nếu bạn vẫn không chắc chắn nên sử dụng cái gì : Hầu hết các vấn đề trong thế giới thực tạo ra các biểu đồ thưa thớt và / hoặc lớn, phù hợp hơn cho các biểu diễn danh sách kề. Chúng có vẻ khó thực hiện hơn nhưng tôi đảm bảo với bạn rằng chúng không phải và khi bạn viết BFS hoặc DFS và muốn tìm nạp tất cả hàng xóm của một nút thì chúng chỉ cách một dòng mã. Tuy nhiên, lưu ý rằng tôi không quảng bá danh sách kề.