Danh sách kề

Trong lý thuyết đồ thị, danh sách kề (tiếng Anh: adjacency list) là danh sách biểu diễn tất cả các cạnh hoặc cung trong một đồ thị.

Nếu đồ thị vô hướng, mỗi phần tử của danh sách là một cặp hai đỉnh là hai đầu của cạnh tương ứng. Nếu đồ thị có hướng, mỗi phần tử là một cặp có thứ tự gồm hai đỉnh là đỉnh đầu và đỉnh cuối của cung tương ứng.

Ví dụ, danh sách {a,b},{a,c},{b,c} mô tả đồ thị vô hướng trong hình dưới đây, trong đó ba đỉnh a, b, c được nối với nhau.

Thông thường, danh sách kề không coi trọng thứ tự giữa các cạnh.


Trong Khoa học máy tính, danh sách kề là một cấu trúc dữ liệu gắn bó chặt chẽ với việc biểu diễn đồ thị. Trong một biểu diễn danh sách kề, với mỗi đỉnh trong đồ thị, ta lưu trữ tất cả các đỉnh khác có cạnh nối với đỉnh đó - danh sách kề của đỉnh. Ví dụ, đồ thị trong hình vẽ có biểu diễn danh sách kề như sau:

a kề với b,c
b kề với a,c
c kề với a,b

Các thỏa hiệp

[sửa | sửa mã nguồn]

Đối thủ chính của danh sách kề là ma trận kề. Với một đồ thị có ma trận kề thưa, biểu diễn danh sách kề của nó chiếm ít không gian hơn, do nó không sử dụng phần không gian nào để lưu trữ các cạnh không tồn tại. Sử dụng cài đặt danh sách liên kết đơn giản trên một máy tính 32-bit, một danh sách kề cho một đồ thị vô hướng cần khoảng 16e byte, trong đó e là số cạnh của đồ thị.

Mặt khác, do mỗi ô trong ma trận kề chỉ đòi hỏi một bit, chúng có thể được biểu diễn rất gọn, chỉ chiếm n2/8 byte không gian bộ nhớ liên tục, trong đó n là số đỉnh. Ngoài việc tiết kiệm bộ nhớ, lưu trữ gọn gàng này còn khuyến khích locality of reference (tính địa phương của các truy nhập đến bộ nhớ).

Lưu ý rằng một đồ thị có thể có nhiều nhất n2 cạnh (kể cả các khuyên). Giả sử d = e/n2 ký hiệu mật độ của đồ thị. Ta có: 16e > n2/8, có nghĩa là danh sách kề chiếm nhiều không gian hơn khi d > 1/128. Do đó, chỉ nên dùng danh sách kề với đồ thị thưa.

Bên cạnh thỏa hiệp về không gian bộ nhớ, các cấu trúc dữ liệu khác nhau còn tạo thuận lợi cho các thao tác dữ liệu khác nhau. Với một danh sách kề, ta dễ dàng tìm mọi đỉnh kề với một đỉnh cho trước; ta chỉ cần đọc danh sách kề của đỉnh đó. Với một ma trận kề, ta phải duyệt toàn bộ một hàng, việc đó cần thời gian O(n). Còn nếu ta lại muốn biết giữa hai đỉnh cho trước có cạnh nối hay không, điều này có thể được xác định ngay lập tức với một ma trận kề, trong khi đó với một danh sách kề, việc này đòi hỏi thời gian tỷ lệ thuận với bậc nhỏ nhất của các đỉnh trong đồ thị.

Chú thích

[sửa | sửa mã nguồn]

Tham khảo

[sửa | sửa mã nguồn]
David Eppstein (1996). “ICS 161 Lecture Notes: Graph Algorithms”.
Chúng tôi bán
Bài viết liên quan
Ngân hàng Trung ương Hoa Kỳ Federal Reserve hoạt động như thế nào?
Ngân hàng Trung ương Hoa Kỳ Federal Reserve hoạt động như thế nào?
Nền kinh tế thế giới đang ở trong giai đoạn mỏng manh nhất trong lịch sử hoạt động của mình
Genshin Impact - Hướng dẫn build đồ tối ưu cho newbie
Genshin Impact - Hướng dẫn build đồ tối ưu cho newbie
Sai lầm của 1 số newbie về việc build tướng như thế nào là tối ưu nhất vì chưa hiểu rõ role
Những điều khiến Sukuna trở nên quyến rũ và thành kẻ đứng đầu
Những điều khiến Sukuna trở nên quyến rũ và thành kẻ đứng đầu
Dáng vẻ bốn tay của anh ấy cộng thêm hai cái miệng điều đó với người giống như dị tật bẩm sinh nhưng với một chú thuật sư như Sukuna lại là điều khiến anh ấy trở thành chú thuật sư mạnh nhất
Tổ chức SWORD trong One Piece - Garp có phải là một thành viên
Tổ chức SWORD trong One Piece - Garp có phải là một thành viên
Qua chương 1080 thì ta biết thêm được về SWORD, về cơ bản thì họ là đội biệt kích đặc biệt gồm những Hải Quân đã từ bỏ Quân Tịch nhưng vẫn hoạt động với vai trò là 1 Hải Quân