Cấu trúc dữ liệu

175 314 0
Cấu trúc dữ liệu

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Cấu Trúc Dữ Liệu Biên tập bởi: nguyenvanlinh Cấu Trúc Dữ Liệu Biên tập bởi: nguyenvanlinh Các tác giả: unknown Phiên trực tuyến: http://voer.edu.vn/c/c5e6dc01 MỤC LỤC Lời nói đầu Tổng quan,tóm tắt,mô hình,giải thuật (algorithms),ngôn ngữ giả tinh chế bước Kiểu liệu trừu tượng (ABSTRACT DATA TYPE -ADT) Kiểu liệu trừu tượng danh sách (LIST) 4.1 Tổng quan,khái niệm phép toán danh sách 4.2 Cài đặt danh sách mảng (danh sách đặc) 4.3 Cài đặt danh sách trỏ (danh sách liên kết) 4.4 Cài đặt so sánh hai phương pháp Ngăn xếp (STACK) Hàng đợi (QUEUE) Danh sách liên kết kép (Double - lists) Bài tập kiểu liệu trừu tượng,ngăn xếp,hàng đợi danh sách liên kết kép Tổng quan thuật ngữ kiểu liệu trừu tượng 10 Cài đặt 11 Cây nhị phân (BRNARY TREES) 12 Cây tìm kiếm nhị phân (BINARY SEARCH TREES) 13 Bài tập cấu trúc 14 Tổng quan,khái niệm,kiểu liệu cài đặt tập hợp 15 Từ điển (DICTIONARY) 15.1 Từ điển (dictionary) 15.2 Cài đặt từ điển bảng băm 15.3 Cài đặt phương pháp xác định hàm băm 16 Hàng ưu tiên (priority queue) 17 Bài tập tập hợp 18 Các định nghĩa,kiểu liệu,biểu diễn tập đồ thị 19 Các phép duyệt đồ thị (Traversals of graph) 20 Một số toán đồ thị Tham gia đóng góp 1/173 Lời nói đầu LỜI NÓI ĐẦU Để đáp ứng nhu cầu học tập bạn sinh viên, sinh viên chuyên ngành tin học, Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ tiến hành biên soạn giáo trình, giảng chương trình học Giáo trình môn Cấu Trúc Dữ Liệu biên soạn dựa "Data Structures and Algorithms" Alfred V Aho, John E Hopcroft Jeffrey D Ullman Addison-Wesley tái năm 1987 Giáo trình biên soạn dựa kinh nghiệm giảng dạy nhiều năm môn Cấu Trúc Dữ Liệu Giải Thuật Tài liệu soạn theo đề cương chi tiết môn Cấu Trúc Dữ Liệu sinh viên chuyên ngành tin học Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ Mục tiêu nhằm giúp bạn sinh viên chuyên ngành có tài liệu cô đọng dùng làm tài liệu học tập, không loại trừ toàn đối tượng khác tham khảo Chúng nghĩ bạn sinh viên không chuyên tin người quan tâm tới cấu trúc liệu giải thuật tìm điều hữu ích Mặc dù cố gắng nhiều trình biên soạn giáo trình chắn giáo trình nhiều thiếu sót hạn chế Rất mong nhận đóng góp ý kiến quý báu sinh viên bạn đọc để giáo trình ngày hoàn thiện Cần thơ, ngày 10 tháng 11 năm 2003 Các tác giả Trần Cao Đệ Nguyễn Văn Linh Trương Thị Thanh Tuyền Lâm Hoài Bảo Phan Huy Cường Trần Ngân Bình 2/173 Tổng quan,tóm tắt,mô hình,giải thuật (algorithms),ngôn ngữ giả tinh chế bước TỔNG QUAN Mục tiêu Sau học xong chương này, sinh viên sẽ: Nắm bước lập trình để giải cho toán Nắm vững khái niệm kiểu liệu trừu tượng, khác kiểu liệu, kiểu liệu trừu tượng cấu trúc liệu Kiến thức cần thiết Các kiến thức cần thiết để học chương bao gồm: Khả nhận biết giải toán theo hướng tin học hóa Tài liệu tham khảo Aho, A V , J E Hopcroft, J D Ullman "Data Structure and Algorihtms", Addison–Wesley; 1983 (chapter 1) Đỗ Xuân Lôi "Cấu trúc liệu giải thuật" Nhà xuất khoa học kỹ thuật Hà nội, 1995 (Chương 1) Nội dung cốt lõi Chương nghiên cứu vấn đề sau: - Cách tiếp cận từ toán đến chương trình - Kiểu liệu trừu tượng (Abstract Data Type) - Kiểu liệu – Kiểu liệu trừu tượng – Cấu trúc liệu 3/173 Mô hình hóa toán thực tế Để giải toán thực tế máy tính ta phải việc xác định toán Nhiều thời gian công sức bỏ để xác định toán cần giải quyết, tức phải trả lời rõ ràng câu hỏi "phải làm gì?" sau "làm nào?" Thông thường, khởi đầu, hầu hết toán không đơn giản, không rõ ràng Để giảm bớt phức tạp toán thực tế, ta phải hình thức hóa nó, nghĩa phát biểu lại toán thực tế thành toán hình thức (hay gọi mô hình toán) Có thể có nhiều toán thực tế có mô hình toán Ví dụ 1: Tô màu đồ giới Ta cần phải tô màu cho nước đồ giới Trong nước tô màu hai nước láng giềng (cùng biên giới) phải tô hai màu khác Hãy tìm phương án tô màu cho số màu sử dụng Ta xem nước đồ giới đỉnh đồ thị, hai nước láng giềng hai đỉnh ứng với nối với cạnh Bài toán lúc trở thành toán tô màu cho đồ thị sau: Mỗi đỉnh phải tô màu, hai đỉnh có cạnh nối phải tô hai màu khác ta cần tìm phương án tô màu cho số màu sử dụng Ví dụ 2: Đèn giao thông Cho ngã năm hình I.1, C E đường chiều theo chiều mũi tên, đường khác hai chiều Hãy thiết kế bảng đèn hiệu điều khiển giao thông ngã năm cách hợp lý, nghĩa là: phân chia lối ngã năm thành nhóm, nhóm gồm lối đi đồng thời không xảy tai nạn giao thông (các hướng không cắt nhau), số lượng nhóm Ta xem đầu vào (input) toán tất lối ngã năm này, đầu (output) toán nhóm lối đi đồng thời mà không xảy tai nạn giao thông, nhóm tương ứng với pha điều khiển đèn hiệu, ta phải tìm kiếm lời giải với số nhóm để giao thông không bị tắc nghẽn phải chờ đợi lâu 4/173 Hình I.1 Trước hết ta nhận thấy ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED Tất nhiên, để giải toán ta phải tìm cách để thể mối liên quan lối Lối với lối đồng thời, lối lối đồng thời Ví dụ cặp AB EC đồng thời, AD EB không, hướng giao thông cắt Ở ta dùng sơ đồ trực quan sau: tên 13 lối viết lên mặt phẳng, hai lối đồng thời xảy đụng (tức hai hướng cắt qua nhau) ta nối lại đoạn thẳng, cong, ngoằn ngoèo tuỳ thích Ta có sơ đồ hình I.2 Như vậy, sơ đồ này, hai lối có cạnh nối lại với hai lối cho đồng thời Với cách biểu diễn ta có đồ thị (Graph), tức ta mô hình hoá toán giao thông theo mô hình toán đồ thị; lối trở thành đỉnh đồ thị, hai lối đồng thời nối đoạn ta gọi cạnh đồ thị Bây ta phải xác định nhóm, với số nhóm nhất, nhóm gồm lối đi đồng thời, ứng với pha đèn hiệu điều khiển giao thông Giả sử rằng, ta dùng màu để tô lên đỉnh đồ thị cho: • Các lối cho phép đồng thời có màu: Dễ dàng nhận thấy hai đỉnh có cạnh nối không tô màu • Số nhóm nhất: ta phải tính toán cho số màu dùng Tóm lại, ta phải giải toán sau: 5/173 Hình I.2 • "Tô màu cho đồ thị hình I.2 cho: • Hai đỉnh có cạnh nối với (hai gọi hai đỉnh kề nhau) không màu • Số màu dùng nhất." Hai toán thực tế “tô màu đồ giới” “đèn giao thông” xem khác biệt sau mô hình hóa, chúng thực chất một, toán “tô màu đồ thị” Đối với toán hình thức hoá, tìm kiếm cách giải thuật ngữ mô hình xác định có hay không chương trình có sẵn để giải Nếu chương trình tìm biết mô hình dùng tính chất mô hình để xây dựng giải thuật tốt Giải thuật (algorithms) Khi có mô hình thích hợp cho toán ta cần cố gắng tìm cách giải toán mô hình Khởi đầu tìm giải thuật, chuỗi hữu hạn thị (instruction) mà thị có ý nghĩa rõ ràng thực lượng thời gian hữu hạn Knuth (1973) định nghĩa giải thuật chuỗi hữu hạn thao tác để giải toán Các tính chất quan trọng giải thuật là: • Hữu hạn (finiteness): giải thuật phải luôn kết thúc sau số hữu hạn bước • Xác định (definiteness): bước giải thuật phải xác định rõ ràng phải thực xác, quán 6/173 • Hiệu (effectiveness): thao tác giải thuật phải thực lượng thời gian hữu hạn Ngoài giải thuật phải có đầu vào (input) đầu (output) Nói tóm lại, giải thuật phải giải xong công việc ta cho liệu vào Có nhiều cách để thể giải thuật: dùng lời, dùng lưu đồ, Và lối dùng phổ biến dùng ngôn ngữ giả, kết hợp ngôn ngữ tự nhiên cấu trúc ngôn ngữ lập trình Ví dụ: Thiết kế giải thuật để giải toán “ tô màu đồ thị” Bài toán tô màu cho đồ thị giải thuật tốt để tìm lời giải tối ưu, tức là, giải thuật khác "thử tất khả năng" hay "vét cạn" tất trường hợp có, để xác định cách tô màu cho đỉnh đồ thị cho số màu dùng Thực tế, ta "vét cạn" trường hợp đồ thị có số đỉnh nhỏ, trường hợp ngược lại ta "vét cạn" tất khả lượng thời gian hợp lý, ta phải suy nghĩ cách khác để giải vấn đề: Thêm thông tin vào toán để đồ thị có số tính chất đặc biệt dùng tính chất đặc biệt ta dễ dàng tìm lời giải, Thay đổi yêu cầu toán cho dễ giải quyết, lời giải tìm chưa lời giải tối ưu Một cách làm toán "Cố gắng tô màu cho đồ thị màu cách nhanh chóng" Ít màu có nghĩa số màu mà ta tìm luôn số màu lời giải tối ưu (ít nhất) đa số trường hợp trùng với đáp số lời giải tối ưu có chênh lệch "không chênh lệch nhiều" so với lời giải tối ưu, bù lại ta "vét cạn" khả có thể! Nói khác đi, ta không dùng giải thuật "vét cạn" khả để tìm lời giải tối ưu mà tìm giải pháp để đưa lời giải hợp lý cách khả thi thời gian Một giải pháp gọi HEURISTIC HEURISTIC cho toán tô màu đồ thị, thường gọi giải thuật "háu ăn" (GREEDY) là: • Chọn đỉnh chưa tô màu tô màu C • Duyệt danh sách đỉnh chưa tô màu Đối với đỉnh chưa tô màu, xác định xem có kề với đỉnh tô màu C không Nếu không có, tô màu C Ý tưởng Heuristic đơn giản: dùng màu để tô cho nhiều đỉnh (các đỉnh xét theo thứ tự đó), tô với màu dùng dùng màu khác Như ta "hi vọng" số màu cần dùng 7/173 Ví dụ: Đồ thị hình I.3 cách tô màu cho Hình I.3 Tô theo GREEDY(xét theo số thứ tự đỉnh) Tối ưu(thử tất khả năng) 1: đỏ; 2: đỏ 1,3,4 : đỏ 3: xanh;4: xanh 2,5 : xanh 5: vàng Rõ ràng cách tô màu giải thuật "háu ăn" không luôn cho lời giải tối ưu thực cách nhanh chóng Trở lại toán giao thông áp dụng HEURISTIC Greedy cho đồ thị hình I.2 (theo thứ tự đỉnh liệt kê trên), ta có kết quả: Tô màu xanh cho đỉnh: AB,AC,AD,BA,DC,ED Tô màu đỏ cho đỉnh: BC,BD,EA Tô màu tím cho đỉnh: DA,DB Tô màu vàng cho đỉnh: EB,EC Như ta tìm lời giải dùng màu để tô cho đồ thị hình I.2 Như nói, lời giải không lời giải tối ưu Vậy liệu dùng màu màu không? Ta trở lại mô hình toán dùng tính chất đồ thị để kiểm tra kết Nhận xét rằng: Một đồ thị có k đỉnh cặp đỉnh nối phải dùng k màu để tô Hình I.4 hai ví dụ với k=3 k=4 8/173 Tiếp tục, F lấy khỏi hàng Không có đỉnh kề với F mà chưa duyệt Vậy không duyệt thêm đỉnh Duyệt Tương tự F, E đến G lấy khỏi hàng Hàng trở thành rỗng giải thuật kết thúc 159/173 Một số toán đồ thị MỘT SỐ BÀI TOÁN TRÊN ĐỒ THỊ Phần giới thiệu với bạn số toán quan trọng đồ thị, toán tìm đường ngắn nhất, toán tìm bao đóng chuyển tiếp, bao trùm tối thiểu Các toán với giải thuật trình bày chi tiết giáo trình Qui Hoạch Động, ta không vào chi tiết giải thuật Phần xem phần nêu ứng dụng với giải thuật để giải toán nhằm giúp bạn đọc vận dụng giải thuật vào việc cài đặt để giải toán nêu Bài toán tìm đuờng ngắn từ đỉnh đồ thị (the single source shorted path problem) Cho đồ thị G với tập đỉnh V tập cạnh E (đồ thị có hướng vô hướng) Mỗi cạnh đồ thị có nhãn, giá trị không âm, nhãn gọi giá (cost) cạnh Cho trước đỉnh v xác định, gọi đỉnh nguồn Vấn đề tìm đường ngắn từ v đến đỉnh lại G; tức đường từ v đến đỉnh lại với tổng giá (cost) cạnh đường nhỏ Chú ý đồ thị có hướng đường đường có hướng Ta giải toán cách xác định tập hợp S chứa đỉnh mà khoảng cách ngắn từ đến đỉnh nguồn v biết Khởi đầu S={v}, sau bước ta thêm vào S đỉnh mà khoảng cách từ đến v ngắn Với giả thiết cung có giá không âm ta luôn tìm đường ngắn mà qua đỉnh tồn S Để chi tiết hoá giải thuật, giả sử G có n đỉnh nhãn cung lưu mảng hai chiều C, tức C[i,j] giá (có thể xem độ dài) cung (i,j), i j không nối C[i,j]=∞ Ta dùng mảng chiều D có n phần tử để lưu độ dài đường ngắn từ đỉnh đồ thị đến v Khởi đầu khoảng cách độ dài cạnh (v,i), tức D[i]=C[v,i] Tại bước giải thuật D[i] cập nhật lại để lưu độ dài đường ngắn từ đỉnh v tới đỉnh i, đường qua đỉnh có S Để cài đặt giải thuật dễ dàng, ta giả sử đỉnh đồ thị đánh số từ đến n, tức V={1, ,n} đỉnh nguồn Dưới dây giải thuật Dijkstra để giải toán void Dijkstra() { 160/173 S = [1]; //Tập hợp S chứa đỉnh nguồn for (i =2; i[...]... cấu trúc dữ liệu Kiểu dữ liệu sơ cấp là kiểu dữ liệu mà giá trị dữ liệu của nó là đơn nhất Ví dụ: kiểu Boolean, Integer… Kiểu dữ liệu có cấu trúc hay còn gọi là cấu trúc dữ liệu là kiểu dữ liệu mà giá trị dữ liệu của nó là sự kết hợp của các giá trị khác Ví dụ: ARRAY là một cấu trúc dữ liệu Một kiểu dữ liệu trừu tượng là một mô hình toán học cùng với một tập hợp các phép toán trên nó Có thể nói kiểu dữ. .. đặt ta chọn một cấu trúc dữ liệu thích hợp có trong ngôn ngữ lập trình hoặc là một cấu trúc dữ liệu phức hợp được xây dựng lên từ các kiểu dữ liệu cơ bản của ngôn ngữ lập trình KIỂU DỮ LIỆU - CẤU TRÚC DỮ LIỆU VÀ KIỂU DỮ LIỆU TRỪU TƯỢNG (DATA TYPES, DATA STRUCTURES, ABSTRACT DATA TYPES) Mặc dù các thuật ngữ kiểu dữ liệu (hay kiểu - data type), cấu trúc dữ liệu (data structure), kiểu dữ liệu trừu tượng... toán trên nó Có thể nói kiểu dữ liệu trừu tượng là một kiểu dữ liệu do chúng ta định nghĩa ở mức khái niệm (conceptual), nó chưa được cài đặt cụ thể bằng một ngôn ngữ lập trình Khi cài đặt một kiểu dữ liệu trừu tượng trên một ngôn gnữ lập trình cụ thể, chúng ta phải thực hiện hai nhiệm vụ: 16/173 1 Biểu diễn kiểu dữ liệu trừu tượng bằng một cấu trúc dữ liệu hoặc một kiểu dữ liệu trừu tượng khác đã được... Tài liệu tham khảo [1] Aho, A V , J E Hopcroft, J D Ullman "Data Structure and Algorithms", Addison–Wesley; 1983 (chapter 2) [2] Đỗ Xuân Lôi "Cấu trúc dữ liệu và giải thuật" Nhà xuất bản khoa học và kỹ thuật Hà nội, 1995 (chương 4,5 trang 71-119) [3] Nguyễn Trung Trực, "Cấu trúc dữ liệu" BK tp HCM, 1990 (chương 2 trang 22-109) [4] Lê Minh Trung ; “Lập trình nâng cao bằng Pascal với các cấu trúc dữ liệu. .. Ở bước này ta dùng các cấu trúc dữ liệu được cung cấp trong ngôn ngữ, ví dụ Array, Record, để thể hiện các kiểu dữ liệu trừu tượng, các bước của giải thuật được thể hiện bằng các lệnh và các cấu trúc điều khiển trong ngôn ngữ lập trình được dùng để cài đặt giải thuật Tóm tắt các bước như sau: 12/173 Bảng tóm tắt 13/173 Kiểu dữ liệu trừu tượng (ABSTRACT DATA TYPE -ADT) KIỂU DỮ LIỆU TRỪU TƯỢNG (ABSTRACT... chương trình con thực hiện các phép toán trên kiểu dữ liệu trừu tượng mà ta thường gọi là cài đặt các phép toán TỔNG KẾT CHƯƠNG Trong chương này, chúng ta cần phải nắm vững các vấn đề sau: 1 Các bước phân tích và lập trình để quyết một bài toán thực tế 2 Hiểu rõ khái niệm về kiểu dữ liệu, kiểu dữ liệu trừu tượng và cấu trúc dữ liệu 17/173 Kiểu dữ liệu trừu tượng danh sách (LIST) Tổng quan,khái niệm... Lop là một biến thuộc kiểu dữ liệu trừu tượng mà ta sẽ xét sau 14/173 Trừu tượng hóa dữ liệu Trừu tượng hóa dữ liệu là định nghĩa các kiểu dữ liệu trừu tượng Một kiểu dữ liệu trừu tượng là một mô hình toán học cùng với một tập hợp các phép toán (operator) trừu tượng được định nghĩa trên mô hình đó Ví dụ tập hợp số nguyên cùng với các phép toán hợp, giao, hiệu là một kiểu dữ liệu trừu tượng Trong một... Kiểu dữ liệu là một tập hợp các giá trị và một tập hợp các phép toán trên các giá trị đó Ví dụ kiểu Boolean là một tập hợp có 2 giá trị TRUE, FALSE và các phép toán trên nó như OR, AND, NOT … Kiểu Integer là tập hợp các số nguyên có giá trị từ -32768 đến 32767 cùng các phép toán cộng, trừ, nhân, chia, Div, Mod… Kiểu dữ liệu có hai loại là kiểu dữ liệu sơ cấp và kiểu dữ liệu có cấu trúc hay còn gọi là cấu. .. sinh viên • Nắm vững các kiểu dữ liệu trừu tượng như: danh sách, ngăn xếp, hàng đợi • Cài đặt các kiểu dữ liệu bằng ngôn ngữ lập trình cụ thể • Ứng dụng được các kiểu dữ liệu trừu tượng trong bài toán thực tế Kiến thức cơ bản cần thiết Để học tốt chương này, sinh viên phải nắm vững kỹ năng lập trình căn bản như: - Kiểu cấu trúc (struct) , kiểu mảng và kiểu con trỏ - Các cấu trúc điều khiển, lệnh vòng... bằng Pascal với các cấu trúc dữ liệu “; 1997 (chương 7, 8) 18/173 Nội dung cốt lõi Trong chương này chúng ta sẽ nghiên cứu một số kiểu dữ liệu trừu tượng cơ bản như sau: - Kiểu dữ liệu trừu tượng danh sách (LIST) - Kiểu dữ liệu trừu tượng ngăn xếp (STACK) - Kiểu dữ liệu trừu tượng hàng đợi (QUEUE) Khái niệm danh sách Mô hình toán học của danh sách là một tập hợp hữu hạn các phần tử có cùng một kiểu,

Ngày đăng: 08/06/2016, 21:06

Mục lục

  • Lời nói đầu

  • Tổng quan,tóm tắt,mô hình,giải thuật (algorithms),ngôn ngữ giả và tinh chế từng bước

  • Kiểu dữ liệu trừu tượng (ABSTRACT DATA TYPE -ADT)

  • Kiểu dữ liệu trừu tượng danh sách (LIST)

    • Tổng quan,khái niệm các phép toán trên danh sách

    • Cài đặt danh sách bằng mảng (danh sách đặc)

    • Cài đặt danh sách bằng con trỏ (danh sách liên kết)

    • Cài đặt và so sánh hai phương pháp

    • Ngăn xếp (STACK)

    • Hàng đợi (QUEUE)

      • Cách khắc phục hàng bị tràn

      • Các khai báo cần thiết

      • Tạo hàng rỗng

      • Kiểm tra hàng rỗng

      • Kiểm tra đầy

      • Xóa phần tử ra khỏi hàng

      • Thêm phần tử vào hàng

      • Khai báo cần thiết

      • Tạo hàng rỗng

      • Kiểm tra hàng rỗng

      • Kiểm tra hàng đầy

      • Xóa một phần tử ra khỏi ngăn xếp

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan