Tải bản đầy đủ (.pdf) (58 trang)

Tối ưu hóa truy vấn tìm đường ngắn nhất trên đồ thị động quy mô lớn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.15 MB, 58 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

PHẠM HẢI ĐĂNG

TỐI ƯU HĨA TRUY VẤN TÌM ĐƯỜNG NGẮN NHẤT
TRÊN ĐỒ THỊ ĐỘNG QUY MÔ LỚN

LUẬN VĂN THẠC SĨ NGÀNH HỆ THỐNG THÔNG TIN

Hà Nội – 2016


1

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
TRANG PHỤ BÌA
PHẠM HẢI ĐĂNG

TỐI ƯU HĨA TRUY VẤN TÌM ĐƯỜNG NGẮN NHẤT
TRÊN ĐỒ THỊ ĐỘNG QUY MÔ LỚN

Ngành: Hệ thống thông tin
Chuyên ngành: Hệ thống thông tin
Mã số: 60480104

LUẬN VĂN THẠC SĨ NGÀNH HỆ THỐNG THÔNG TIN

NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TS. Nguyễn Ngọc Hóa


Hà Nội – 2016


2

LỜI CẢM ƠN
Để có thể hồn thiện được luận văn thạc sỹ của mình, trước tiên, tơi xin bày
tỏ lịng biết ơn sâu nhất tới thầy – PGS.TS. Nguyễn Ngọc Hóa (bộ mơn Các hệ
thống thơng tin – trường Đại học Công nghệ – Đại học Quốc gia Hà Nội). Sự gần
gũi, khích lệ và nhiệt tình hướng dẫn của thầy là nguồn động lực rất lớn đối với
tôi trong suốt thời gian thực hiện luận văn.
Tôi cũng xin được gửi lời cảm ơn chân thành nhất tới tất cả các thầy, cô trong
bộ môn Các hệ thống thông tin, cũng như các thầy, cô trong khoa Công nghệ
thông tin – trường Đại học Công nghệ – Đại học Quốc gia Hà Nội đã nhiệt tình
giảng dạy, cung cấp cho chúng tôi những kiến thức, kinh nghiệm không chỉ trong
học tập mà cịn trong cuộc sống hàng ngày.
Đồng thời tơi cũng xin được gửi lời cảm ơn đến cha mẹ, người thân trong
gia đình, các bạn học viên, đồng nghiệp đã giúp đỡ, động viên, tạo điều kiện tốt
nhất cho tơi trong suốt khóa học tại Trường Đại học Cơng nghệ – Đại học Quốc
gia Hà Nội để tơi có thể hồn thiện tốt luận văn thạc sỹ của mình.
Hà Nội, tháng 11 năm 2016
Học viên

Phạm Hải Đăng


3

LỜI CAM ĐOAN
Tôi xin cam đoan luận văn tốt nghiệp “Tối ưu hóa truy vấn tìm đường ngắn

nhất trên đồ thị động quy mơ lớn” là cơng trình nghiên cứu thực sự của bản thân,
được thực hiện trên cơ sở nghiên cứu lý thuyết, kiến thức chuyên ngành, nghiên
cứu khảo sát tình hình thực tiễn và dưới sự hướng dẫn khoa học của PGS.TS.
Nguyễn Ngọc Hóa. Các kết quả được viết chung với các tác giả khác đều được sự
đồng ý của tác giả trước khi đưa vào luận văn. Những phần tham chiếu, trích dẫn
trong luận văn đều được nêu rõ trong phần tài liệu tham khảo. Các số liệu, kết quả
trình bày trong luận văn là hồn tồn trung thực. Nếu sai tơi xin chịu hồn tồn
trách nhiệm và chịu mọi kỷ luật của khoa và nhà trường đề ra.
Hà Nội, tháng 11 năm 2016
Học viên
Phạm Hải Đăng


4

MỤC LỤC
TRANG PHỤ BÌA ................................................................................................ 1
LỜI CẢM ƠN ....................................................................................................... 2
LỜI CAM ĐOAN ................................................................................................. 3
MỤC LỤC ............................................................................................................ 4
DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT ........................................... 6
DANH MỤC CÁC BẢNG ................................................................................... 7
DANH MỤC CÁC HÌNH VẼ .............................................................................. 8
Giới thiệu chung.................................................................................................... 9
Động lực nghiên cứu ......................................................................................... 9
Mục tiêu và nội dung chính của luận văn ......................................................... 9
Tổ chức luận văn ............................................................................................... 9
Chương 1: Cơ sở lý thuyết và các vấn đề liên quan ........................................... 10
1.1. Đồ thị ....................................................................................................... 10
1.1.1. Giới thiệu đồ thị ................................................................................ 13

1.1.2. Một số thuật ngữ cơ bản ................................................................... 14
1.1.3. Biểu diễn đồ thị ................................................................................. 15
1.1.4. Các thuật tốn tìm kiếm trên đồ thị và ứng dụng .............................. 18
1.2. Bài tốn tìm đường đi ngắn nhất .............................................................. 21
1.3. Tổng kết chương ...................................................................................... 27
Chương 2: Bài toán, cách tiếp cận và phương pháp giải quyết .......................... 28
2.1. Định nghĩa bài toán .................................................................................. 28
2.2. Các vấn đề liên quan ................................................................................ 29
2.3. Cách tiếp cận giải quyết bài toán ............................................................. 34
2.4. Cấu trúc dữ liệu phù hợp.......................................................................... 34
2.5. Tối ưu quá trình thêm và xóa cạnh của đồ thị.......................................... 37
2.5.1. Thêm mới một cạnh .......................................................................... 37
2.5.2. Xóa đi một cạnh ................................................................................ 39
2.6. Tối ưu quá trình xử lý truy vấn tìm đường ngắn nhất .............................. 40
2.6.1. Cải thiện thuật tốn tìm đường đi ngắn nhất từ hai hướng ............... 40


5
2.6.2. Song song hóa truy vấn tìm đường đi ngắn nhất .............................. 41
2.7. Tổng kết chương ...................................................................................... 41
Chương 3: Thực nghiệm và đánh giá.................................................................. 42
3.1. Cài đặt ...................................................................................................... 42
3.2. Thực nghiệm ............................................................................................ 46
3.2.1. Cuộc thi ACM Sigmod Contest 2016 ............................................... 46
3.2.2. Kiểm nghiệm với bộ dữ liệu SNAP .................................................. 47
3.3. Tổng kết chương ...................................................................................... 53
Kết luận chung .................................................................................................... 54
Các đóng góp chính ........................................................................................ 54
Hướng phát triển ............................................................................................. 54
Danh mục cơng trình khoa học của tác giả ......................................................... 55

Tài liệu tham khảo .............................................................................................. 56


6

DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT

Kí hiệu

Giải thích
Tiếng Anh

Tiếng Việt

GPS

Global Positioning System

Hệ thống định vị tồn
cầu

ACM

Association for Computing
Machinery

Hiệp hội máy tính thế
giới

Sigmod


Special Interest Group on
Management of Data

Nhóm quan tâm đặc biệt
về quản lý dữ liệu

DFS

Depth First Search

Thuật toán duyệt đồ thị
theo chiều sâu

BFS

Breadth First Search

Thuật toán duyệt đồ thị
theo chiều rộng

BBFS

Bi-directional Breadth First
Search

Thuật toán duyệt đồ thị
theo chiều rộng từ cả hai
hướng.


SNAP

Stanford Network Analysis
Platform

Nền tảng phân tích
mạng của Stanford


7

DANH MỤC CÁC BẢNG
Bảng 1.1: Một số thống kê về độ phức tạp một số phương phức cơ bản trong đồ
thị [11] ......................................................................................................... 17
Bảng 2.1: Độ trễ trong bộ nhớ 2016 ................................................................... 34
Bảng 3.1:Thống kê bộ dữ liệu ACM Sigmod ..................................................... 46
Bảng 3.2: Kết quả cuộc thi ACM Sigmod (tính theo giây) ................................ 46
Bảng 3.3: Thống kê bộ dữ liệu LiveJournal và Pokec ........................................ 49
Bảng 3.4: Kết quả thử nghiệm (tính theo mili giây) ........................................... 51


8

DANH MỤC CÁC HÌNH VẼ
Hình 1.1: Mạng xã hội ........................................................................................ 10
Hình 1.2: Đường đi trong mạng xã hội ............................................................... 11
Hình 1.3: Chu trình trong mạng xã hội ............................................................... 11
Hình 1.4: Bản đồ khoảng cách một số tỉnh thành phía Bắc ................................ 12
Hình 1.5: Mạng xã hội có hướng ........................................................................ 12
Hình 1.6: Đồ thị .................................................................................................. 13

Hình 1.7: Đồ thị có hướng .................................................................................. 15
Hình 2.1: Dữ liệu đầu vào ................................................................................... 29
Hình 2.2: Lơ dữ liệu kiểm thử............................................................................. 29
Hình 2.3: Giới thiệu về OpenMP ........................................................................ 31
Hình 2.4: Giới thiệu về Pthread .......................................................................... 32
Hình 2.5: Song song hóa truy vấn bởi Cilk Plus................................................. 33
Hình 2.6: Cấu trúc dữ liệu của đồ thị .................................................................. 36
Hình 2.7: Thêm một cạnh bằng cách chèn vào giữa mảng ................................. 37
Hình 2.8: Cấu trúc dữ liệu danh sách kề cấp phát trước khoảng trống ............... 38
Hình 2.9: Thêm một cạnh bằng cách cấp trước khoảng trống ............................ 38
Hình 2.10: Quá trình thêm một cạnh .................................................................. 39
Hình 2.11: Quá trình xóa một cạnh ..................................................................... 39
Hình 2.12: Thứ tự duyệt đỉnh trong thuật toán duyệt đồ thị theo chiều rộng từ hai
hướng .......................................................................................................... 40
Hình 3.1: Thời gian thực thi giữa hai phép tốn thao tác trên mảng và bit ........ 45
Hình 3.2: Kết quả cuộc thi ACM Sigmod 2016.................................................. 48
Hình 3.3: Kết quả thử nghiệm với bộ dữ liệu SIGMOD TEST .......................... 52
Hình 3.4: Kết quả thử nghiệm với bộ dữ liệu POKEC ....................................... 52
Hình 3.5: Kết quả thử nghiệm với bộ dữ liệu LIVEJOURNAL ......................... 53


9

Giới thiệu chung
Động lực nghiên cứu
Hiện nay, chúng ta đang sống trong thời đại bùng nổ về công nghệ thông tin
cũng như bùng nổ về xã hội mạng. Một số mạng điển hình như mạng xã hội
(Facebook, Twitter), mạng sinh học, mạng phân tán nội dung, mạng lưới giao
thông, mạng thơng tin… có số lượng dữ liệu tăng nhanh chóng mặt. Để giải quyết
những thách thức về mặt dữ liệu lớn trên, có rất nhiều phương pháp tiếp cận, trong

đó phương pháp tiếp cận dựa trên đồ thị được cho là trực quan và phù hợp nhất
[8]. Với việc sử dụng lý thuyết đồ thị, các đỉnh biểu diễn các thực thể và các cạnh
biểu diễn mối liên hệ giữa chúng. Trong đồ thị, tìm đường đi (ngắn nhất) là vấn
đề tìm sự kết nối giữa hai đỉnh của một đồ thị và đảm bảo đường đi đó là ngắn
nhất dựa trên một số yêu cầu cho trước. Đây là vấn đề nền tảng và cơ bản được
áp dụng trong rất nhiều ứng dụng thực tế như tìm đường đi ngắn nhất giữa hai địa
điểm sử dụng GPS hay tìm mối liên kết giữa hai người trên mạng xã hội [6]. Vấn
đề này bình thường rất đơn giản, nhưng trong bối cảnh số lượng các đỉnh, cạnh
của đồ thị rất lớn (vài triệu đỉnh) và thay đổi nhanh (thêm cạnh, bớt cạnh), làm
thế nào để tối ưu hóa q trình tìm đường đi ngắn nhất là một thách thức lớn [21].
Mục tiêu và nội dung chính của luận văn
Với mục tiêu trên, luận văn này sẽ trình bày giải pháp để cải thiện hiệu năng
quá trình tối ưu truy vấn trên đồ thị động, quy mơ lớn có hướng và không trọng
số. Phương pháp tối ưu dựa trên các ý tưởng: cấu trúc dữ liệu phù hợp, tối ưu
không gian tìm kiếm và cài đặt phù hợp.
Tổ chức luận văn
Nội dung của luận văn sẽ được tổ chức như sau:
Mở đầu: Đặt vấn đề
Chương 1: Giới thiệu về cơ sở lý thuyết, các vấn đề liên quan đến đồ thị và
bài tốn tìm đường đi ngắn nhất trong đồ thị.
Chương 2: Trình bày bài tốn, cách tiếp cận, phương pháp giải quyết bài toán.
Chương 3: Thực nghiệm và đánh giá các kết quả đạt được.
Kết luận chung: Kết luận và đưa ra hướng phát triển tiếp theo.


10

Chương 1: Cơ sở lý thuyết và các vấn đề liên quan
1.1. Đồ thị
Trước khi tìm hiểu về lý thuyết đồ thị, chúng ta cùng xét một ví dụ về một

mạng xã hội nhỏ [7] sau:

Hình 1.1: Mạng xã hội

Mỗi ô màu xanh biểu diễn cho một người dùng trong mạng xã hội, giữa hai
người có một đường liên kết với nhau có nghĩa là họ biết nhau. Ngược lại, nếu
khơng có đường liên kết này thì họ khơng biết nhau. Mối liên hệ “biết nhau” trong
đồ thị này là hai chiều. Ví dụ: An biết Thanh thì Thanh sẽ biết An.
Một mạng xã hội như thế này là ví dụ cơ bản về đồ thị. Tên người chính là
các đỉnh, và mỗi đường liên kết giữa hai người chính là các cạnh. Chúng ta thường
biểu diễn sự liên kết giữa hai đỉnh u và v bởi cặp (u, v). Bởi vì quan hệ “biết nhau”
ở đây là quan hệ hai chiều, nên đây là ví dụ của đồ thị vô hướng. Trong đồ thị vô
hướng, cạnh (u, v) tương tự như cạnh (v, u). Trong đồ thị có hướng, quan hệ “biết
nhau” khơng cịn là hai chiều nữa, một người A biết người B nhưng chưa chắc
người B đã biết người A. Trong đồ thị vô hướng, một cạnh nối giữa hai đỉnh thì
cạnh này gọi là liên thuộc đến hai đỉnh đó. Chúng ta gọi các đỉnh liên kết với nhau
bằng một cạnh là các đỉnh liền kề hoặc hàng xóm của nhau. Số lượng cạnh liên
thuộc của một đỉnh là bậc của đỉnh đó.
Nhìn trên đồ thị, An và Sơn sẽ không biết nhau. Giả sử rằng Sơn muốn làm
quen với An. Có cách nào để Sơn làm quen với An khơng? Nhìn trên đồ thị ta
thấy, Sơn biết Hạnh và Hạnh lại biết Linh, cuối cùng Linh biết An. Vậy Sơn có
thể thơng qua Hạnh và Linh để làm quen với An. Thực ra, đây là một đường đi
trong đồ thị, đường đi đi từ điểm đầu Sơn đến điểm cuối An. Khơng có đường đi


11
ngắn hơn giữa Sơn và An mà phải đi qua ít nhất hai người. Đường đi giữa hai
đỉnh như thế này được gọi là đường đi ngắn nhất. Chúng ta đánh dấu đường đi
ngắn nhất này như Hình 1.2.


Hình 1.2: Đường đi trong mạng xã hội

Khi đường đi xuất phát từ một đỉnh và quay lại chính nó, chúng ta gọi đó là
một chu trình. Mạng xã hội bao gồm rất nhiều chu trình. Ví dụ từ An, Bình tới
Cường, Linh rồi cuối cùng quay lại An. Thực ra, có chu trình ngắn hơn đó là từ
An qua Bình tới Linh rồi quay lại An.

Hình 1.3: Chu trình trong mạng xã hội

Có những lúc, chúng ta thêm các trọng số vào các cạnh. Ví dụ, trong mạng
xã hội, chúng ta có thể sử dụng một trọng số để xác định mức độ biết nhau giữa
hai người. Một ví dụ cụ thể khác về đồ thị chính là bản đồ đường đi. Giả sử tất cả
đều là đường hai chiều, thì bản đồ đường đi này cũng là một đồ thị vô hướng, với
các thành phố (địa điểm) là đỉnh, các đường đi là cạnh, giá trị trọng số chính là số
biểu diễn khoảng cách giữa các thành phố. Ví dụ Hình 1.4 mơ tả khoảng cách giữa
một số tỉnh thành phía Bắc nước Việt Nam .


12

Hình 1.4: Bản đồ khoảng cách một số tỉnh thành phía Bắc

Cách thức đơn giản biểu diễn trọng số là ta viết thêm một số thực lên cạnh
của đồ thị. Khi đó, đồ thị có các cạnh có trọng số như thế này được gọi là đồ thị
có trọng số. Trong trường hợp bản đồ đường đi, nếu chúng ta muốn tìm đường đi
ngắn nhất giữa các vị trí, chúng ta phải tìm kiếm đường đi qua các vị trí trung gian
sao cho tổng trọng số là nhỏ nhất. Đây chính là bài tốn tìm đường đi ngắn nhất
giữa hai đỉnh trong đồ thị. Ví dụ ở bản đồ Hình 1.4, đường đi ngắn nhất từ Hà Nội
tới Hạ Long, sẽ qua Hải Dương, Hải Phòng. Tổng cộng đoạn đường đi này có
chiều dài 163km.

Mối quan hệ giữa hai đỉnh khơng phải lúc nào cũng là hai chiều. Lấy ví dụ,
trong bản đồ đường đi, chúng ta có thể gặp đường đi một chiều. Để biểu diễn sự
có hướng này, các cạnh được thêm dấu mũi tên ở cuối và đồ thị này được gọi là
đồ thị có hướng. Ví dụ Hình 1.5 mơ tả một mạng xã hội có hướng. Mũi tên có
hướng chỉ từ An sang Linh có nghĩa là An biết Linh, nhưng ngược lại Linh không
biết An. Dễ nhận thấy, đồ thị ở Hình 1.5 khơng có chu trình, khi đó đồ thị được
gọi là có hướng khơng chu trình.

Hình 1.5: Mạng xã hội có hướng


13
Chúng ta có thể sử dụng các thuật ngữ khác trong đồ thị có hướng. Ví dụ,
một cạnh có hướng sẽ ra ở một đỉnh và vào một đỉnh khác. Nếu cạnh đó ra ở đỉnh
u và vào một đỉnh v, sẽ được kí hiệu là (u, v), và thứ tự này sẽ cho ta biết hướng
đi từ đỉnh nào đến nào. Tổng số cạnh ra của một đỉnh gọi là bậc ra, tổng số cạnh
vào của một đỉnh gọi là bậc vào.
Như chúng ta thấy, đồ thị có rất nhiều ứng dụng trong biểu diễn các sự vật,
mối quan hệ giữa các sự vật đó trong thế giới thực. Phần tiếp theo, luận văn sẽ
trình bày một số lý thuyết nền tảng về đồ thị.
1.1.1. Giới thiệu đồ thị
Đồ thị (G), kí hiệu là G = (V, E) bao gồm một tập các đỉnh (V) và tập các
cạnh (E). Trong đó mỗi cạnh E nối giữa hai đỉnh thuộc tập các đỉnh (V) và được
kí hiệu là E = (u, v) (Đỉnh u nối đỉnh v). Ví dụ về đồ thị được đưa ra ở Hình 1.6.

Hình 1.6: Đồ thị

Đồ thị được phân loại dựa vào đặc điểm của các cạnh như sau:
Đơn đồ thị vô hướng
Đơn đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh, và E là tập các

cặp khơng có thứ tự gồm hai phần tử khác nhau của V được gọi là cạnh [1].
Đa đồ thị vô hướng
Đa đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh, và E là họ các cặp
không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh. Hai cạnh e1 và
e2 được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh [1].
Thực tế, mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào
cũng là đơn đồ thị, vì trong đa đồ thị có thể có hai (hoặc nhiều hơn) cạnh nối một
cặp đỉnh nào đó.
Giả đồ thị vơ hướng
Giả đồ thị vơ hướng G = (V, E) bao gồm V là một tập các đỉnh, và E là họ
các cặp khơng có thứ tự gồm hai phần tử (không nhất thiết phải khác nhau) của V
gọi là các cạnh. Cạnh e được gọi là khuyên nếu nó có dạng e = (u, u) [1].


14
Từ đó, với tính chất có hướng của đồ thị được định nghĩa như sau:
Đơn đồ thị có hướng
Đơn đồ thị có hướng G = (V, E) bao gồm V là một tập các đỉnh, và E là tập
các cặp có thứ tự gồm hai phần tử của V được gọi là cung.
Đa đồ thị có hướng
Đa đồ thị có hướng G = (V, E) bao gồm V là tập đỉnh, E là họ các cặp có thứ
tự gồm hai phần tử khác nhau của V được gọi là các cung. Hai cung e1 và e2 được
gọi là cung lặp nếu chúng cùng tương ứng với một cặp đỉnh.
1.1.2. Một số thuật ngữ cơ bản
Bậc của đỉnh
Hai đỉnh u và v của đồ thị vô hướng G = (V, E) được gọi là kề nhau nếu (u, v)
là cạnh thuộc đồ thị G. Nếu e = (u, v) là cạnh của đồ thị G thì ta nói cạnh này liên
thuộc với hai đỉnh u và v, hoặc ta nói cạnh e nối đỉnh u với đỉnh v, đồng thời các
đỉnh u và v sẽ được gọi là đỉnh đầu mút của cạnh e.
Bậc của đỉnh v trong đồ thị G = (V, E) ký hiệu deg(v) là số các cạnh liên

thuộc với nó, riêng khun tại một đỉnh được tính hai lần cho bậc của nó.
Đỉnh v gọi là đỉnh treo nếu deg(v) = 1 và gọi là đỉnh cô lập nếu deg(v) = 0.
Ví dụ: đồ thị vơ hướng G = (V, E) ở Hình 1.6.
+ V = {1,2,3,4,5,6}.
+ E = {(1,2), (1,3), (1,4), (2,3), (2,4), (2,5)}.
+ Bậc của các đỉnh: deg(1)=3; deg(2)=4, deg(3)=2, deg(4)=2, deg(5)=1,
deg(6)=0.
+ Đỉnh 5 là đỉnh treo.
+ Đỉnh 6 là đỉnh cô lập.
Trong đồ thị có hướng, bậc của đỉnh v được chia ra thành bậc trong
(Incoming Nodes) và bậc ngoài (Outgoing Nodes). Bậc trong của đỉnh v là số
lượng các cạnh được nối tới đỉnh v, kí hiệu là deg+(v). Bậc ngồi của đỉnh v là số
lượng các cạnh được nối từ đỉnh v, kí hiệu là deg-(v).
Đường đi và chu trình, đồ thị liên thông
Trong đồ thị vô hướng, đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là
số nguyên dương trên đồ thị vô hướng G = (V, E) là dãy


15
x0, x1, …, xn-1, xn
Trong đó u = x0, v = xn, (xi, xi+1) ∈ E, i = 0, 1, 2, ...., n-1
Đường đi nói trên cịn có thể biểu diễn dưới dạng dãy các cạnh:
(x0, x1), (x1, x2), ..., (xn-1, xn)
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi
có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình. Đường đi hay
chu trình được gọi là đơn nếu như khơng có cạnh nào bị lặp [1].
Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa hồn
tồn tương tự như trường hợp đồ thị vô hướng, chỉ khác là chúng ta phải chú ý
đến hướng trên các cung [1].
Đồ thị vô hướng G = (V, E) được gọi là liên thơng nếu ln tìm được đường

đi giữa hai đỉnh bất kỳ của nó.
1.1.3. Biểu diễn đồ thị
Trong phần này, luận văn sẽ giới thiệu bốn cấu trúc dữ liệu chính dùng để
biểu diễn một đồ thị. Trong mỗi cấu trúc, phần biểu diễn các đỉnh được giữ
nguyên, tuy nhiên phần biểu diễn các cạnh lại hoàn toàn khác nhau.
Đồ thị ở Hình 1.7 được sử dụng cho tồn bộ ví dụ trong mục 1.1.3 này.

Hình 1.7: Đồ thị có hướng

Danh sách cạnh (Edge list)
Trong biểu diễn đồ thị theo danh sách các cạnh, tất cả các cạnh e thuộc E đều
được lưu dưới dạng hai phần tử (vi, vj) trong danh sách lưu trữ. Nếu cạnh có trọng
số, chúng ta cần thêm một phần tử thứ ba vào trong mảng. Mỗi cạnh sẽ bao gồm
hai hoặc ba số, vậy nên không gian để lưu trữ đồ thị theo danh sách cạnh là Θ(|E|).
Ví dụ: L= {(1,2), (1,3), (1,4), (2,3), (2,4)}


16
Danh sách kề (Adjacency list)
Trong biểu diễn đồ thị bằng danh sách kề, với mỗi đỉnh u, ta lưu trữ tất cả
các đỉnh v kề với nó. Và chúng ta có tất cả |V| danh sách kề nhau như thế này, một
đỉnh và một danh sách các nốt kề với đỉnh, vậy nên không gian để lưu trữ đồ thị
theo cách này là Θ(|V|+|E|).
Ví dụ:
Đỉnh

Danh sách kề

1


{2, 3,4}

2

{3,4}

3

{}

4

{}

Ma trận liên thuộc (Incidence matrix)
Ma trận liên thuộc đỉnh – cạnh của đồ thị G = (V, E) là một đồ thị |V| x |E|,
trong đó phần tử ở hàng thứ i và cột thứ j bằng 1 khi và chỉ i là đỉnh đầu của cung
thứ j, bằng -1 khi và chỉ khi i là đỉnh cuối của cung thứ j và bằng 0 trong trường
hợp còn lại. Đồ thị được tổ chức theo kiểu này sẽ tốn không gian lưu trữ là
Θ(|V| x |E|).
Ví dụ:
1
2
3
4

(1,2)

(1,3)


(1,4)

(2,3)

(2,4)

1
−1
0
0

1
0
−1
0

1
0
0
−1

0
1
−1
0

0
1
0
−1


Ma trận kề (Adjaceny matrix)
Ma trận kề của đồ thị G = (V, E) là một đồ thị |V| x |V|, trong đó phần tử ở
hàng thứ i và cột thứ j bằng 1 khi và chỉ khi tồn tại cung (i, j) trong đồ thị, bằng 0
trong trường hợp ngược lại. Đồ thị được tổ chức theo kiểu này sẽ tốn không gian
lưu trữ là Θ(|V|2).


17
Ví dụ:
0
0
+ =
0
0

1
0
0
0

1
1
0
0

1
1
0
0


Một số thống kê về độ phức tạp thuật toán một số phương phức cơ bản của
các cấu trúc dữ liệu được trình bày ở Bảng 1.1. Giả sử rằng n là số đỉnh, m là số
cạnh, dv là bậc của đỉnh v.
Bảng 1.1: Một số thống kê về độ phức tạp một số phương phức cơ bản trong đồ thị [11]

Phương thức

Danh sách Danh sách Ma trận Ma trận kề
cạnh
kề
liên thuộc

numVertices( )
Trả về số lượng
đỉnh của đồ thị.

O(1)

O(1)

O(1)

O(1)

O(1)

O(1)

O(1)


O(1)

O(n)

O(n)

O(n)

O(n)

O(m)

O(m)

O(m)

O(m)

O(m)

O(min(du ,
dv))

O(m)

O(1)

numVertices( )
Trả về số lượng

cạnh của đồ thị.
vertices( )
Trả về phép duyệt
tất cả các đỉnh của
đồ thị.
edges( )
Trả về phép duyệt
tất cả các cạnh
của đồ thị.
getEdge(u, v)
Kiểm tra xem cạnh
(u, v) có tồn tại
khơng?


18
outDegree(v)
inDegree(v)
Trả về số lượng
đỉnh vào và đỉnh
ra của nốt v.

O(m)

O(1)

O(m)

O(n)


O(m)

O(dv )

O(m)

O(n)

O(1)

O(1)

O(m×n)

O(n2)

O(m)

O(dv)

O(m×n)

O(n2)

O(1)

O(1)

O(1)


O(1)

O(1)

O(1)

O(1)

O(1)

Θ(n)

Θ(m+n)

Θ(m×n)

Θ(n2)

outgoingEdges(v)
incomingEdges(v)
Trả về phép duyệt
tất cả đỉnh vào và
đỉnh ra của nốt v.
insertVertex(x)
Thêm một đỉnh
mới vào đồ thị.
removeVertex(v)
Xóa một đỉnh
trong đồ thị.
insertEdge(u, v)

Thêm một cạnh
mới vào đồ thị.
removeEdge(u, v)
Xóa một cạnh
trong đồ thị.
Khơng gian
lưu trữ

1.1.4. Các thuật tốn tìm kiếm trên đồ thị và ứng dụng
Trong đồ thị, bài toán duyệt qua tất cả các đỉnh của đồ thị sao cho mỗi đỉnh
chỉ thăm đúng duy nhất một lần là một bài toán quan trọng thu hút sự quan tâm
nghiên cứu của rất nhiều các nhà khoa học. Trong mục này, luận văn sẽ trình bày
hai thuật tốn duyệt đồ thị cơ bản: thuật tốn tìm kiếm theo chiều sâu (Depth First


19
Search – DFS) và thuật tốn tìm kiếm theo chiều rộng (Breadth First Seach –
BSF). Trên cơ sở hai thuật tốn cơ bản này, chúng ta có thể áp dụng chúng để giải
quyết một số bài toán quan trọng của lý thuyết đồ thị.
Thuật tốn tìm kiếm theo chiều sâu (DFS)
Ý tưởng cơ bản của thuật tốn tìm kiếm theo chiều sâu là bắt đầu từ một đỉnh
v nào đó của đồ thị, chọn một đỉnh bất kỳ kề với v và lặp lại quá trình đối với đỉnh
được chọn này. Nếu như trong số các đỉnh kề với v tìm được đỉnh w là chưa được
xét thì ta sẽ xét đỉnh này và bắt đầu từ đó chúng ta tiếp tục q trình tìm kiếm.
Cịn nếu khơng cịn đỉnh nào kề với v chưa được xét thì có nghĩa là đỉnh này đã
được duyệt xong và chúng ta sẽ quay trở lại tiếp tục tiếp tục duyệt từ đỉnh mà
trước đó chúng ta chưa duyệt. Có thể tóm tắt lại là tìm kiếm theo chiều sâu bắt
đầu từ đỉnh v được thực hiện trên cơ sở tìm kiếm theo chiều sâu từ tất các đỉnh
chưa xét kề với v. Q trình này có thể mơ tả bởi thủ tục đệ quy sau đây:
DFS(v) { // Tìm kiếm theo chiều sâu bắt đầu từ đỉnh v

visit(v);
check[v] = false;
For u∈neighbor (v) do
If check[u] then DFS(u);
}

Khi đó, duyệt đồ thị theo chiều sâu được thực hiện nhờ thuật toán sau:
for v ∈ V do
check[v] = TRUE; //thiết lập giá trị ban đầu cho mảng check[]*/
for v ∈ V do
if (check[v]) DFS(i);

Để đánh giá độ phức tạp của thuật tốn tìm kiếm theo chiều sâu trên đồ thị,
trước hết nhận thấy rằng số phép tốn cần thực hiện trong hai vịng lặp for của
thuật toán là cỡ n. Thủ tục DFS phải thực hiện trong trường hợp xấu nhất là n lần.
Tổng số phép toán cần phải thực hiện trong các thủ tục này là O(n+m), do trong
thủ tục ta phải xét qua tất cả các cạnh và các đỉnh của đồ thị. Vậy độ phức tạp tính
tốn của thuật tốn là O(n+m) [1].
Thuật tốn tìm kiếm theo chiều rộng (BFS)
Trong thuật tốn tìm kiếm theo chiều sâu, đỉnh được thăm càng muộn sẽ
càng sớm trở thành đỉnh đã duyệt xong. Điều đó là hệ quả tất yếu bởi vì các đỉnh


20
được thăm sẽ được lưu vào trong ngăn xếp (stack). Tìm kiếm theo chiều rộng trên
đồ thị được xây dựng trên cơ cở thay thế ngăn xếp (stack) bởi hàng đợi (queue).
Với sự thay đổi như thế này, đỉnh được thăm càng sớm sẽ càng sớm trở thành
đỉnh đã duyệt xong. Một đỉnh đã được duyệt xong ngay sau khi ta xét xong tất cả
các đỉnh kề (chưa được thăm) với nó. Q trình này có thể được mơ tả bởi thủ tục
sau đây.

BFS(v) { //Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v
QUEUE = ∅;
QUEUE <= v; //Đưa v vào hàng đợi
check[v] = false;
While QUEUE # ∅ do {
P <= QUEUE; //Lấy p từ QUEUE
visit (p);
For u ∈ neighbor (p) do
If check[u] then
QUEUE <= u;
check[u] = false;
}
}

Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực hiện nhờ thuật toán sau:
for v ∈ V do
check[v] = TRUE; //thiết lập giá trị ban đầu cho mảng check[]*/
for v ∈ V do
if (check[v]) BFS(i);

Tương tự như thủ tục tìm kiếm theo chiều sâu, lệnh gọi BFS(v) sẽ cho phép
đến thăm tất cả các đỉnh thuộc cùng thành phần liên thông với đỉnh v, và mỗi đỉnh
của đồ thị sẽ được thăm đúng một lần. Độ phức tạp tính toán của thuật toán là
O(n+m) [1].


21
1.2. Bài tốn tìm đường đi ngắn nhất
Trong các ứng dụng thực tế, bài tốn tìm đường đi ngắn nhất giữa hai đỉnh
trong đồ thị có một ý nghĩa to lớn. Ví dụ, bài tốn tìm đường đi ngắn nhất giữa

hai điểm trên bản đồ (có thể ngắn nhất về thời gian, hoặc về khoảng cách hay đáp
ứng một điều kiện nào đó cho trước). Hay bài tốn lựa chọn đường truyền các gói
tin với thời gian nhanh nhất hay đi qua ít router nhất… Hiện nay, có rất nhiều
phương pháp để giải quyết các bài toán như vậy nhưng thơng thường, các thuật
tốn được xây dựng trên cơ sở lý thuyết đồ thị dường như cho hiệu quả cao nhất.
Trong phần này luận văn sẽ đề cập đến một số bài tốn tìm đường đi ngắn nhất
cơ bản.
Bài tốn tìm đường đi ngắn nhất sẽ được áp dụng cho đồ thị G = (V, E) có
hướng, có trọng số với trọng số là hàm w: Ε ⟹ 2 ánh xạ cạnh với một giá trị
thực. Khi đó, chi phí w(p) của đường đi p = (v0, v1, …, vk) chính là tổng trọng số
của từng cạnh kết hợp thành đường đi này.
9

3 4 =

3 5678 , 56
6:8

Bài tốn tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng qt có thể phát
biểu như sau: tìm đường đi ngắn nhất xuất phát từ đỉnh đầu s đến đỉnh cuối t, (s,t
∈ V). Độ dài của đường đi từ s đến t được ký hiệu là d(s,t) (khoảng cách từ s đến
t). Nếu như không tồn tại đường đi từ s tới t thì d(s,t) = ∞.
Vấn đề tìm đường đi ngắn nhất trong đồ thị có các bài tốn cơ bản: tìm đường
đi ngắn nhất xuất phát từ một đỉnh và tìm đường đi ngắn nhất giữa tất cả các cặp
đỉnh. Các vấn đề này được giải quyết thông qua các thuật toán Bellman-Ford,
Dijkstra’s và Floyd-Warshall. Phần lớn các thuật tốn tìm khoảng cách này được
xây dựng nhờ kỹ thuật tính tốn sau: từ ma trận trọng số w[u, v], u,v ∈ V, cận trên
d[v] của khoảng cách từ s đến tất cả các đỉnh v ∈ V được tính. Mỗi khi biểu thức
sau thỏa mãn d[u] + w[u, v] < d[v] thì ta sẽ gán d[v] = d[u] + w[u, v]. Quá trình
này cứ tiếp tục cho đến khi tất cả các đỉnh kề với các cạnh trên mỗi bước đi đã

được duyệt. Kết quả d[v] chính là khoảng cách ngắn nhất giữa s và t. Sau đây,
luận văn sẽ trình bày chi tiết 3 thuật tốn tìm đường đi ngắn nhất trên.
BELLMAN-FORD
Đầu vào:
Đồ thị có hướng G = (V, E) với n đỉnh.
s ∈ V: đỉnh xuất phát


22
w[u, v], u, v∈ V: ma trận trọng số
Đầu ra:
Khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v] , v ∈ V.
Truoc[v], v ∈ V, lưu lại đỉnh đi trước v trong đường đi ngắn nhất từ
s đến v.
Giả thiết: Đồ thị khơng có chu trình âm.
Bellman-Ford() {
for v ∈ V do
d[v] = w[s,v];
truoc[v] = s;
d[s] = 0;
for k =1 to n -2 do
for v ∈V \ {s} do
for u ∈ ke(V) do
if d[v] > d[u] + w[u,v] then
d[v] = d[u] + w[u,v];
truoc[v] = u;
}
Dễ dàng thấy độ phức tạp thuật toán Bellman-Ford là O(n.m) [1].
DIJKSTRA’S
Đầu vào:

Đồ thị có hướng G = (V, E) với n đỉnh.
s ∈ V: đỉnh xuất phát,.
w[u, v], u, v∈ V: ma trận trọng số
Đầu ra:
Khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v] , v ∈ V.
Truoc[v], v ∈ V, lưu lại đỉnh đi trước v trong đường đi ngắn nhất từ
s đến v.


23
Dijkstra’s(){
for v ∈ V do
d[v] = w[s,v];
truoc[v] = s;
d[s] = 0;
T = V \ {s};
while T # ∅ do
tìm đỉnh u ∈ T thỏa mãn d[u] = min { d[z] : z ∈ T};
T = T \ {u};
for v ∈ T do
if d[v] > d[u] + w[u,v] then
d[v] = d[u] + w[u,v];
truoc[v] = u;
}
Thuật tốn Dijkstra’s tìm được đường đi ngắn nhất trên đồ thị sau thời gian
cỡ O(n2) [1].
FLOYD-WARSHALL
Đầu vào:
Đồ thị có hướng G = (V, E) với n đỉnh.
Ma trận trọng số w[i,j], i,j = 1,2,...,n

Đầu ra:
Ma trận đường đi ngắn nhất giữa các cặp đỉnh d[i,j], i,j = 1,2,...,n
Trong đó d[i,j] cho độ dài đường đi ngắn nhất từ i đến j.
Ma trận ghi nhận đường đi p[i,j] i,j = 1,2,...,n
Trong đó p[i,j] ghi nhận đỉnh đi trước đỉnh j trong đường đi ngắn
nhất từ i đến j.
Floyd-Warshall(){
for i = 1 to n do
for j = 1 to n do


24
d[i,j] = a[i,j];
p[i,j] = i;
for k = 1 to n do
for i = 1 to n do
for j = 1 to n do
if d[i,j] > d[i,k] + d[k,j]
d[i,j] = d[i,k] + d[k,j];
p[i,j] = p[k,j];
}
Dễ thấy thuật tốn Floyd-Warshall có độ phức tạp là O(n3) [1].
Ba thuật toán Bellman-Ford, Dijkstra’s và Floyd-Warshall dùng để tìm
đường đi ngắn nhất trong đồ thị G = (V, E) có hướng, có trọng số. Tuy nhiên,
trong thực tế, ví dụ như mạng xã hội, bài tốn tìm đường đi ngắn nhất cơ bản là
tìm số lượng đỉnh trung gian ít nhất để kết nối hai đỉnh. Khi đó đồ thị G = (V, E)
có hướng, có trọng số trở thành đồ thị có hướng, khơng trọng số, hay tất cả trọng
số của các cạnh đều là 1. Để giải quyết bài toán này, thuật toán duyệt đồ thị theo
chiều rộng đã được giới thiệu ở mục 1.1.4 được cho là hiệu quả nhất, hai thuật
toán Bellman-Ford và Dijkstra’s cùng sử dụng ý tưởng của BFS duyệt các đỉnh

kề với nốt để tìm được đường đi ngắn nhất. Thuật tốn tìm đường đi ngắn nhất
dựa vào duyệt đồ thị theo chiều rộng được trình bày chi tiết dưới đây.
BFS
Đầu vào:
Đồ thị có hướng G = (V, E) với n đỉnh.
s ∈ V: đỉnh xuất phát
t ∈ V: đỉnh kết thúc
Đầu ra:
Khoảng cách từ đỉnh s đến đỉnh t
BFS(){
if s == t
return 0;
QUEUE = ∅;


×