Giáo trình Cấu trúc dữ liệu và giải thuật - Trần Thiên Thành

Giáo trình được soạn trên cơ sở chương trình đào tạo của Khoa. Một số kiến thức về thuật toán và kỹ thuật lập trình sinh viên đã được học trong các môn học trước đó nên không được đề cập trong giáo trình này. Giáo trình dùng làm tài liệu học tập cho sinh viên năm thứ ba hoặc học kỳ 2 của năm thứ hai ngành Tin học và Công nghệ thông tin với thời lượng 75 tiết. Ngoài ra, giáo trình có thể dùng cho sinh viên thuộc các ngành Toán học, Kỹ thuật và những người muốn có kiến thức sâu hơn về các cấu trúc dữ liệu thường dùng trong lập trình.

pdf165 trang | Chia sẻ: lylyngoc | Lượt xem: 1865 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Giáo trình Cấu trúc dữ liệu và giải thuật - Trần Thiên Thành, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TRƯỜNG  ĐẠI  HỌC  SƯ  PHẠM  QUY  NHƠN KHOA  TIN  HỌC TRẦN  THIÊN  THÀNH Giáo trình CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Quy  nhơn,  10/2002 2 LỜI  NÓI  ĐẦU Cấu  trúc  dữ  liệu  và  giải  thuật  là  một  môn  học  bắt  buộc  trong  chương  trình   đào  tạo  cử  nhân  Tin  học  và  Công  nghệ  thông  tin.  Giáo  trình  này  được  hình  thành   dựa  trên  nội  dung  giảng  dạy  nhiều  năm  tại  khoa  Tin  học  trường  Đại  học  sư  phạm   Quy  nhơn  của  tác  giả. Nội  dung  giáo  trình  gồm  6  chương: Chương   1   trình   bày  một   số   kiến   thức   cơ   bản   về   cấu   trúc   dữ liệu   và   giải   thuật. Chương  2  trình  bày  về  mô  hình  dữ  liệu  danh  sách.  Trong  chương  cũng  giới   thiệu  hai  kiểu  dữ  liệu  trừu  tượng  là  Stack  và  Queue  cùng  với  một  số  ứng  dụng  tiêu   biểu. Chương  3  trình  bày  về  mô  hình  cây,  chủ  yếu  tập  trung  vào  cây  tìm  kiếm  nhị   phân,  cây  cân  bằng  và  một  số  ứng  dụng. Chương  4   trình  bày  về  mô  hình  đồ   thị  và  một   số   thuật   toán   thường  dùng   trên  đồ  thị. Chương  5  trình  bày  về  cách  tổ  chức  dữ  liệu  cho  bộ  nhớ  ngoài. Chương  6  trình  bày  các  thuật  toán  sắp  xếp  trong  và  sắp  xếp  ngoài. Giáo trình   được   soạn   trên   cơ   sở   chương   trình   đào   tạo   của  Khoa.  Một   số   kiến  thức  về  thuật  toán  và  kỹ  thuật  lập  trình  sinh  viên  đã  được  học  trong  các  môn   học  trước  đó  nên  không  được  đề  cập  trong  giáo  trình  này.  Giáo  trình  dùng  làm  tài   liệu  học  tập  cho  sinh  viên  năm  thứ  ba  hoặc  học  kỳ  2  của  năm  thứ  hai  ngành  Tin   học  và  Công  nghệ  thông  tin  với  thời  lượng  75  tiết.  Ngoài  ra,  giáo  trình  có  thể  dùng   cho  sinh  viên  thuộc  các  ngành  Toán  học,  Kỹ  thuật  và  những  người  muốn  có  kiến   thức  sâu  hơn  về  các  cấu  trúc  dữ  liệu  thường  dùng trong  lập  trình. Trong  mỗi  chương  của  giáo  trình,  các  kiến  thức  lý  thuyết  được  trình  bày  cơ   bản,   rõ   ràng,  được  minh  hoạ  chi   tiết   cùng  với  những  ứng  dụng  cụ   thể  giúp  cho   người  học  dễ  đọc,  dễ  hình  dung  những  ứng  dụng  của  các  cấu   trúc  dữ   liệu   trong   một  số  ứng  dụng  điển  hình.  Do  đó  giáo  trình  có  thể  dùng  làm  tài  liệu  tự  học  cho   những   người   đã   có   những   kiến   thức   cơ   bản   về   thuật   toán   và   lập   trình   trên  một   ngôn  ngữ  lập  trình  bậc  cao.  Nội  dung  trong  giáo  trình  bám  sát  những  nội  dung  cơ   bản  về  các  cấu  trúc  dữ  liệu  mà  các  chương  trình  đào  tạo  cử  nhân  Tin  học  và  Công   nghệ  thông  tin  yêu  cầu.  Cuối  mỗi  chương  đều  cung  cấp  một  hệ  thống  các  bài  tập   từ  cơ  bản  đến  nâng  cao  nhằm  giúp  cho  sinh  viên   rèn   luyện   tư  duy,  kỹ   thuật   lập   trình  và  hiểu  rõ  hơn  những  nội  dung  lý  thuyết. Trong  giáo   trình   sử  dụng  ngôn  ngữ   lập   trình  Pascal  để  minh  hoạ   các   cấu   trúc  dữ  liệu  và  thuật  toán  để  giúp  sinh  viên  dễ  hình  dung  hơn  trong  cài  đặt  thành   chương  trình.  Các  cấu  trúc  dữ  liệu  được  tổ  chức  dưới  hình  thức  bao  gói  thông  tin,   mỗi  cấu  trúc  dữ  liệu  được  xem  như  một  kiểu  dữ  liệu  độc  lập.  Các  thuật  toán  trình   bày   dưới   dạng   ngôn   ngữ   tự   nhiên   và   được   hoàn   chỉnh   bằng   những   thủ   tục   viết   3 bằng  Pascal  nên  rất  thuận  tiện  cho  sinh  viên  trong  thực  hành  bằng  Pascal  hay  bất   kỳ  một  ngôn  ngữ  lập  trình  bậc  cao  nào  mà  mình  ưa  thích. Để  hoàn  thành  giáo  trình  này  tác  giả  đã  nhận  được  nhiều  ý  kiến  đóng  góp   và  động  viên  của  các  đồng  nghiệp,  đặc  biệt  là  ThS  Hồ  Anh  Minh  đã  đọc  bản  thảo   và  đóng  góp  nhiều  ý  kiến  quý  báu. Do  thời  gian  và  khả  năng  còn  hạn  chế  nên  giáo  trình  không  thể  tránh  khỏi   những  khiếm  khuyết  nhất  định.  Chúng  tôi  chân  thành  và  mong  đón  nhận  những  ý   kiến  đóng  góp  của  độc  giả. Tác  giả 4 MỤC  LỤC Lời  nói  đầu .....................................................................................................2 Mục  lục ..........................................................................................................4 Chương  1 Tổng  quan  về  Cấu  trúc  dữ  liệu  và  giải  thuật ................................8 1.  Tổng  quan  về  thuật  toán .........................................................................8 1.1.  Khái  niệm  thuật  toán .......................................................................8 1.2.  Các  đặc  trưng  của  thuật  toán ...........................................................8 1.3.  Tiêu  chuẩn  đánh  giá  thuật  toán ........................................................9 1.4.  Độ  phức  tạp  của  thuật  toán ..............................................................9 1.5.  Ký  hiệu  O-lớn ................................................................................11 2.  Kiểu  dữ  liệu  và  cấu  trúc  dữ  liệu ...........................................................11 2.1.  Kiểu  dữ  liệu ...................................................................................11 2.2.  Cấu  trúc  dữ  liệu .............................................................................12 2.3.  Mô  hình  dữ  liệu .............................................................................12 2.4.  Các  tiêu  chuẩn  của  cấu  trúc  dữ  liệu ...............................................12 3.  Mối  liên  hệ  giữa  cấu  trúc  dữ  liệu  và  giải  thuật .....................................13 3.1.  Mối  liên  hệ .....................................................................................13 3.2.  Một  số  ví  dụ  minh  họa ...................................................................13 4.  Bài  tập ..................................................................................................15 Chương  2 Danh sách ...................................................................................17 1.  Khái  niệm  và  các  thao  tác ....................................................................17 1.1.  Định  nghĩa  danh  sách ....................................................................17 1.2. Các thao tác trên danh sách ...........................................................17 2.  Biểu  diễn  danh  sách  bằng  mảng ...........................................................18 2.1.  Tổ  chức  dữ  liệu ..............................................................................18 2.2. Các thao tác trên danh sách ...........................................................19 3.  Danh  sách  liên  kết  đơn .........................................................................24 3.1.  Cấp  phát  động,  biến  con  trỏ  và  các  thao  tác ..................................24 3.2.  Khái  niệm  danh  sách  liên  kết .........................................................25 3.3.  Tổ  chức  danh  sách  liên  kết ............................................................25 3.4.  Các  phép  toán  trên  danh  sách  liên  kết ...........................................26 5 3.5.  So  sánh  cấu  trúc  dữ  liệu  danh  sách  liên  kết  đơn  và  mảng .............29 3.6.  Một  số  dạng  danh  sách  liên  kết  khác .............................................29 4.  Ngăn  xếp  (Stack) ..................................................................................34 4.1.  Khái  niệm ......................................................................................35 4.2.  Tổ  chức  ngăn  xếp  bằng  mảng ........................................................36 4.3.  Tổ  chức  ngăn  xếp  bằng  danh  sách  liên  kết ....................................38 4.4.  Ứng  dụng  của  ngăn  xếp .................................................................40 5.  Hàng  đợi  (Queue) .................................................................................44 5.1.  Khái  niệm ......................................................................................44 5.2.  Tổ  chức  hàng  đợi  bằng  mảng ........................................................45 5.3.  Tổ  chức  hàng  đợi  bằng  danh  sách  liên  kết ....................................49 6.  Bài  tập ..................................................................................................51 Chương  3 Cây .............................................................................................57 1.  Các  khái  niệm  về  cây ...........................................................................57 1.1.  Khái  niệm  cây ................................................................................57 1.2.  Một  số  khái  niệm  khác ..................................................................58 2.  Cây  nhị  phân .........................................................................................59 2.1.  Khái  niệm ......................................................................................59 2.2.  Biểu  diễn  cây  nhị  phân ..................................................................60 2.3.  Duyệt  cây  nhị  phân ........................................................................63 2.4.  Cây  tìm  kiếm  nhị  phân ..................................................................67 2.5.  Các  thao  tác  trên  cây  tìm  kiếm  nhị  phân .......................................68 3.  Cây  cân  bằng ........................................................................................74 3.1.  Khái  niệm ......................................................................................75 3.2.  Thêm  vào  cây  cân  bằng .................................................................76 3.3.  Loại  bỏ  khỏi  cây  cân  bằng .............................................................82 4.  Các  ứng  dụng  của  cây  nhị  phân ...........................................................88 4.1. Mã Huffman ..................................................................................88 4.2.  Cấu  trúc  dữ  liệu  Heap ....................................................................91 5.  Cây  tổng  quát .......................................................................................97 5.1.  Tổ  chức  dữ  liệu ..............................................................................97 5.2.  Các  thao  tác  trên  cây  tổng  quát................................................... 100 6 5.3.  Cây  tìm  kiếm  tổng  quát .............................................................. 103 6.  Bài  tập ............................................................................................... 105 Chương  4 Đồ  thị....................................................................................... 108 1.  Các  khái  niệm .................................................................................... 108 1.1.  Khái  niệm  đồ  thị  (Graph) ........................................................... 108 2.  Tổ  chức  dữ  liệu  biểu  diễn  đồ  thị ....................................................... 109 2.1.  Biểu  diễn  đồ  thị  bằng  ma  trận  kề  (adjacency  matrice) ............... 109 2.2.  Biểu  diễn  đồ  thị  bằng  danh  sách  kề  (adjacency  list) .................. 110 2.3.  Biểu  diễn  đồ  thị  bằng  danh  sách  cạnh  (cung) ............................. 111 3.  Duyệt  đồ  thị ....................................................................................... 112 3.1.  Duyệt  theo  chiều  sâu .................................................................. 112 3.2.  Duyệt  đồ  thị  theo  chiều  rộng ...................................................... 114 3.3.  Tìm  đuờng  đi  trên  đồ  thị ............................................................. 115 4.  Tìm  đường  đi  ngắn  nhất .................................................................... 117 4.1.  Đường  đi  ngắn  nhất  trên  đồ  thị  không  có  trọng  số ..................... 117 4.2.  Đường  đi  ngắn  nhất  trên  đồ  thị  có  trọng  số ................................ 118 5.  Cây  khung  của  đồ  thị ......................................................................... 126 5.1.  Khái  niệm  cây  khung  (Spanning  tree) ........................................ 126 5.2.  Thuật  toán  tìm  cây  khung  của  đồ  thị .......................................... 126 5.3.  Cây  khung  ngắn  nhất .................................................................. 127 5.4.  Thuật  toán  tìm  cây  khung  ngắn  nhất  của  đồ  thị ......................... 127 6.  Bài  tập ............................................................................................... 132 Chương  5 Các  cấu  trúc  dữ  liệu  ở  bộ  nhớ  ngoài ....................................... 134 1.  Mô  hình  tổ  chức  dữ  liệu  ở  bộ  nhớ  ngoài ........................................... 134 2.  File  băm ............................................................................................. 135 2.1.  Cấu  trúc  Bảng  băm  (Hash  Table) ............................................... 135 2.2.  File  Băm ..................................................................................... 142 3.  File  chỉ  số  (Indexed  File) .................................................................. 143 3.1.  Tổ  chức  File  chỉ  số ..................................................................... 144 3.2.  Các  thao  tác  trên  file  chỉ  số ........................................................ 144 4. B-Cây ................................................................................................ 145 4.1.  Khái  niệm  B-Cây ........................................................................ 146 7 4.2. Các thao tác trên B-Cây .............................................................. 147 5.  Bài  tập ............................................................................................... 149 Chương  6 Sắp  xếp .................................................................................... 151 1.  Các  thuật  toán  sắp  xếp  trong ............................................................. 151 1.1.  Sắp  xếp  bằng  cách  chọn  trực  tiếp ............................................... 151 1.2.  Sắp  xếp  bằng  cách  đổi  chỗ  trực  tiếp ........................................... 152 1.3.  Sắp  xếp  bằng  cách  chèn  trực  tiếp ............................................... 153 1.4.  Sắp  xếp  với  độ  dài  bước  giảm  dần ............................................. 155 1.5.  Sắp  xếp  trộn ................................................................................ 156 1.6.  Sắp  xếp  kiểu  vun  đống ............................................................... 156 1.7.  Sắp  xếp  bằng  phân  hoạch ........................................................... 159 2.  Sắp  xếp  ngoài .................................................................................... 160 2.1.  Trộn  hai  tệp  được  sắp ................................................................. 160 2.2.  Thuật  toán  sắp  xếp  trộn  tự  nhiên ................................................ 161 3.  Bài  tập ............................................................................................... 164 Tài  liệu  tham  khảo .................................................................................... 165 8 Chương  1 TỔNG  QUAN  VỀ  CẤU  TRÚC  DỮ  LIỆU  VÀ  GIẢI  THUẬT 1. TỔNG  QUAN  VỀ  THUẬT  TOÁN 1.1. Khái  niệm  thuật  toán Khái  niệm  thuật  toán  (Algorithm)  xuất  phát  từ  tên  một  nhà  toán  học  Arập   Abu  Ja'far  Mohamed  ibn  Musa  al’Khwarizmi, thường  gọi  là  al’Khwarizmi.  Ông  là   tác  giả  một  cuốn  sách  về  số  học,  trong  đó  ông  đã  dùng  phương  pháp  mô  tả  rất  rõ   ràng,  mạch   lạc  cách  giải  những  bài   toán.  Sau  này,  phương  pháp  mô   tả  cách  giải   của  ông  đã  được  xem   là  một   chuẩn  mực  và  được  nhiều  nhà   toán  học  khác   tuân   theo.  Thuật  ngữ  algorithm  ra  đời  từ  đó  dựa  theo  cách  phiên  âm  tên  của  ông.  Cùng   với   thời  gian  khái  niệm   thuật   toán  được  hoàn chỉnh  dần  và  khái  niệm  hình   thức   chính  xác   của   thuật   toán  được  định  nghĩa   thông  qua  mô  hình  máy  Turing.  Giáo   trình  này  không  đi  sâu  vào  những  khía  cạnh  lý  thuyết  của  thuật  toán  nên  chỉ  trình   bày  khái  niệm  không  hình  thức  của  thuật  toán:   Thuật  toán  là  một  hệ  thống  chặt  chẽ  và  rõ  ràng  các  quy  tắc  nhằm  xác  định   một  dãy  các  thao  tác  trên  những  đối  tượng  sao  cho  sau  một  số  hữu  hạn  bước  thực   hiện  các  thao  tác  thì  đạt  được  mục  tiêu  định  trước. 1.2. Các  đặc  trưng  của  thuật  toán Một  thuật  toán  thông  thường  có  6  đặc  trưng  cơ  bản  sau: 1.2.1. Tính  kết  thúc  (tính  dừng) Thuật  toán  bao  giờ  cũng  phải  dừng  sau  một  số  hữu  hạn  bước  thực  hiện. 1.2.2. Tính  xác  định Thuật  toán  yêu  cầu  ở  mỗi  bước  các  thao  tác  phải  hết  sức  rõ  ràng, không gây nên  sự  nhập  nhằng,  lẫn  lộn,  tùy  tiện.  Khi  thực  hiện  thuật  toán,  trong  cùng  một  điều   kiện  thì  cho  cùng  một  kết  quả. 1.2.3. Tính  phổ  dụng Thuật  toán  phải  có  thể  giải  được  một  lớp  các  bài  toán.  Mỗi  thuật  toán  có  thể   làm  việc  với  những  dữ  liệu  khác  nhau  trong  một  miền  xác  định. 9 1.2.4. Đại  lượng  vào Mỗi  thuật  toán  thường  có  những  đại  lượng  vào  gọi  là  dữ  liệu  vào  để  cung   cấp  dữ  liệu  cho  thuật  toán.  Tuy  nhiên,  cũng  có  những  thuật  toán  không  có  dữ  liệu   vào. 1.2.5. Đại  lượng  ra Sau  khi  kết  thúc  thuật  toán,  tùy  vào  chức  năng  của  thuật  toán  mà  thu  được   một  số  đại  lượng  xác  định  gọi  là  đại  lượng  ra  hay  dữ  liệu  ra. 1.2.6. Tính  hiệu  quả Với  dữ  liệu  vào,  sau  một  số  hữu  hạn  bước  thực  hiện  thuật  toán  sẽ  dừng  và   cho  đúng  kết  quả  mong  muốn  với  thời  gian  chấp  nhận được. 1.3. Tiêu  chuẩn  đánh  giá  thuật  toán Một  bài   toán  có   thể  có  nhiều   thuật   toán  giải,  mỗi   thuật   toán  có  những  ưu   nhược  điểm  riêng.  Để  quyết  định  chọn  thuật  toán  nào  thông  thường  dựa  vào  2  tiêu   chuẩn  cơ  bản sau: 1. Thuật  toán  đơn  giản,  dễ  hiểu,  dễ  cài  đặt. 2. Thuật  toán  sử  dụng  tiết  kiệm  các  tài  nguyên  của  hệ  thống  máy  tính  như   bộ  nhớ,  thời  gian  chiếm  dụng  CPU  và  đặc  biệt  là  thời  gian  chạy. Trong  trường  hợp  chương  trình  ít  sử  dụng  và  giá  viết  chương  trình  vượt  xa   giá   chạy   chương   trình   thì   tiêu   chuẩn   1   được   ưu   tiên.   Với   những   chương   trình   thường  dùng  như  các  thư  viện,  các  chương  trình  hệ  thống  thì  tiêu  chuẩn  2  được  ưu   tiên  chọn  trước. Trong  tiêu  chuẩn  2,  tính  hiệu  quả  của  thuật  toán  bao  gồm  2  yếu  tố: - Dung lượng  không  gian  nhớ  cần  thiết  để  lưu  các  loại  dữ  liệu  và  các  kết   quả  trung  gian  để  giải  bài  toán  (tổ  chức  dữ  liệu  cho  bài  toán). - Thời  gian  cần  thiết  để  thực  hiện  thuật  toán  (thời  gian  chạy). Hai   yếu   tố   trên   thường  mâu   thuẫn   nhau   và   ảnh   hưởng   qua   lại   lẫn nhau. Thường  khi  chọn  thuật  toán  ta  quan  tâm  đến  thời  gian  thực  hiện.  Mặc  dù  hiện  nay   tốc  độ  máy  tính  ngày  được  cải  thiện  đáng  kể,  có  thể  thực  hiện  hàng  trăm  triệu  phép   tính   trên  giây  nhưng  vẫn  chưa  đáp  ứng  được  cho  một  số   thuật   toán  có   thời  gian   chạy  rất lớn. 1.4. Độ  phức  tạp  của  thuật  toán Việc  đánh  giá  thời  gian  thực  hiện  của  thuật  toán  phụ  thuộc  vào  nhiều  yếu   tố: - Dữ  liệu  vào. - Tốc  độ  của  máy  tính. 10 - Chương  trình  dịch  và  hệ  điều  hành  dùng  cho  chương  trình. Do  đó  việc  đo,