MỤC LỤC
Nguyên lý hoạt động của đệ quy là giảm bài toán lớn thành một hoặc nhiều bài toán nhỏ hơn có cùng đặc điểm, từ bài toán nhỏ hơn này ta giảm thành nhiều bài toán nhỏ hơn nữa, cứ như vậy ta sẽ giảm bài toán thành những bài toán nhỏ nhất có thể đã có lời giải [3]. Ưu điểm: Giải thuật đệ quy được thiết kế ngắn gọn cho nên lập trình viên viết chương trình nhanh và mã lệnh sáng sủa, do khả năng định nghĩa một tập hợp rất lớn các đối tượng bằng một số các tập lệnh hữu hạn.
Danh sách đặc (condensed list) hay còn gọi là danh sách kề (contiguous list) là danh sách mà không gian bộ nhớ lưu trữ các phần tử được đặt liên tiếp nhau trong bộ nhớ, do đó phải biết trước số lượng phần tử của danh sách. Nếu biết được địa chỉ của phần tử đầu tiên trong danh sách liên kết đơn thì có thể truy xuất đến phần tử thứ hai thông qua mối liên kết; dựa thông tin liên kết của phần tử thứ hai để truy xuất đến phần tử thứ ba, và thực hiện tương tự để truy xuất đến các phần tử còn lại.
Duyệt danh sách là việc truy cập lần lượt các phần tử trong danh sách và thực hiện xử lý các phần tử theo cùng một cách thức để đáp ứng một số yêu cầu như : in ra giá trị của các phần tử, tìm các phần tử thỏa mãn một số điều kiện nào đó,. Để sắp xếp một danh sách liên kết đơn, ta có thể thực hiện hoán vị thành phần dữ liệu giữa các phần tử trong danh sách với một thuật toán sắp xếp. Điểm khác biệt so với danh sách đặc là danh sách liên kết phải truy xuất tuần tự các phần tử dựa vào liên kết.
Danh sách liên kết đôi là danh sách mà mỗi phần tử trong danh sách có hai liên kết: một mối liên kết với một phần tử đứng trước nó và một mối liên kết đến một phần tử đứng sau nó. Đối với danh sách liên kết đôi, thành phần liên kết của mỗi phần tử gồm thông tin liên kết với phần tử trước và thông tin liên kết với phần tử sau. Tương tự danh sách liên kết đơn, để quản lý một danh sách liên kết đôi cũng cần biết địa chỉ của phần tử đầu tiên.
Danh sách rỗng là danh sách khi phần tử đầu tiên (phead) là None, vì vậy thuật toán sẽ trả về giá trị true nếu danh sách rỗng (không có phần tử), và trả về giá trị false nếu danh sách không rỗng.
Phần tử đầu trong danh sỏch liờn kết vũng khụng cú vị trớ rừ ràng, do đú cú thể xem một phần tử bất kỳ trên danh sách như là phần tử đầu để thực hiện xử lý các thao tác trên một danh sách liên kết vòng. Việc xử lý các thao tác trên danh sách liên kết vòng cũng tương tự như danh sách liên kết đơn và danh sách liên kết kép, nhưng phải đảm bảo tính chất liên kết vòng trong quá trình xử lý. Ví dụ: Để giúp cho việc tìm kiếm và in ấn trong ứng dụng quản lý danh bạ điện thoại theo những thông tin khác nhau như: theo tên người dùng, theo số điện thoại, theo thời gian đường dây được lắp đặt, ta có thể tổ chức một danh sách đa liên kết với ba mối liên kết gồm: tên người dùng, số điện thoại và thời gian lắp đặt như hình bên dưới.
Ngăn xếp và hàng đợi là các dạng danh sách liên kết đặc biệt và là các cấu trúc dữ liệu quan trọng trong lập trình cũng như được ứng dụng để giải quyết nhiều bài toán trong thực tế. Để khai báo một ngăn xếp ta cần một mảng một chiều được đặt tên là nodes, một biến số nguyên top cho biết chỉ số của đầu ngăn xếp và biến MAXSTACK cho biết kích thước tối đa của ngăn xếp. Khi đổi một số nguyên hệ thập phân sang hệ nhị phân, ta thực hiện chia liên tiếp cho 2 và lấy số dư đưa vào ngăn xếp theo chiều ngược lại, phép chia dừng lại khi kết quả bằng 0.
Hàng đợi (Queue) là một dạng danh sách đặc biệt, trong đó thao tác thêm các phần tử được thực hiện ở vị trí cuối hàng đợi (rear) và thao tác lấy ra các phần tử thực hiện ở vị trí đầu hàng đợi (front).
Cây là một cấu trúc dữ liệu gồm một tập hữu hạn các nút, giữa các nút có một quan hệ phân cấp gọi là quan hệ “cha - con”, trong đó có một nút đặc biệt gọi là nút gốc (root). • Hai tập con còn lại tự thân hình thành hai cây nhị phân là nhánh cây con bên trái (left subtree) và nhánh cây con bên phải (right subtree) của nút gốc. Nhược điểm của các cấu trúc cây tổng quát là bậc của các nút trên cây có thể dao động trong một biên độ lớn, do đó việc biểu diễn gặp nhiều khó khăn và lãng phí.
Cây nhị phân tìm kiếm là cây nhị phân trong đó tại mỗi nút, khóa của nút đang xét lớn hơn khóa của tất các nút thuộc cây con bên trái và nhỏ hơn khóa của tất cả các nút thuộc cây con bên phải. Tuy nhiên, trong một số ứng dụng cần sử dụng cấu trúc dữ liệu cây với số con của mỗi nút chưa biết trước thì cây nhị phân không đáp ứng được vì bị hạn chế mỗi nút chỉ có tối đa hai con. Cây nhiều nhánh là một cấu trúc gồm một tập hữu hạn các nút cùng kiểu dữ liệu và có thể được phân thành các tập con gồm: một tập con gồm nút gốc và tập con còn lại hình thành nên các cây nhiều nhánh, gọi là các nhánh cây con của nút gốc.
Ví dụ: Đối với cây Trie trong hình 4.21, chuỗi “bull” được tìm thấy vì trong cây có đường đi đi qua các ký tự của “bull” và đường đi kết thúc tại nút lá.
Duyệt đồ thị là xuất phát từ một đỉnh, theo các cạnh để thăm tất cả các đỉnh của đồ thị đúng một lần, ví dụ bài toán tìm đường đi giữa 2 đỉnh của đồ thị hoặc kiểm tra đồ thị có liên thông hay không. Ý tưởng cơ bản của thuật toán duyệt hay tìm kiếm theo chiều sâu là bắt đầu tại một đỉnh v0 nào đó, chọn một đỉnh u bất kỳ kề với v0 và lấy nó làm đỉnh duyệt tiếp theo. Nếu đồ thị không liên thông sẽ không có cây khung nhỏ nhất, ngược lại đồ thị liên thông ta mới đi tìm cây khung nhỏ nhất bằng thuật toán tương ứng.
Bước 2: Sắp xếp lại các danh sách các cạnh listEdge của đồ thị G theo trọng số tăng dần sau đó đánh dấu tất cả các cạnh là chưa xét và khởi tạo T:=∅ (T là tập cạnh của cây khung hay cây bao trùm của đồ thị). Thuật toán dừng nếu T không có đủ (n-1) cạnh, đồ thị không liên thông và không có cây khung/bao trùm nhỏ nhất, ngược lại ta tìm được cây khung/bao trùm nhỏ nhất. Trong mạng xã hội, ví dụ Facebook, người dùng được coi là đỉnh và nếu họ là bạn bè thì sẽ có một cạnh liên kết giữa họ, đây là dạng đồ thị vô hướng.
Cho đồ thị dưới đây, sử dụng thuật toán tìm kiếm theo chiều rộng (BFS) và biểu diễn từng bước:. 148 Ứng dụng đồ thị để giải bài toán trong kinh doanh. Quản lý đường bay. b) Đa đồ thị vô hướng. c) Đa đồ thị có hướng.
Sắp xếp là quá trình xử lý một danh sách các phần tử (hoặc các mẫu tin) để đặt chúng theo một thứ tự nhằm thỏa mãn một số tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử [9]. Khi xây dựng một thuật toán sắp xếp cần chú ý tìm cách giảm thiểu những phép so sánh và đổi chỗ không cần thiết để tăng hiệu quả của thuật toán. Xuất phát từ đầu hoặc cuối dãy, đổi chỗ các cặp phần tử nghịch thế liền kề nhau để đưa phần tử lớn hoặc nhỏ hơn trong cặp phần tử đó về vị trí cuối hoặc đầu dãy hiện hành, sau đó sẽ không xét đến nó ở bước tiếp theo.
Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ phần tử này với phần tử tương ứng trong cặp nghịch thế. Sắp xếp mảng A1, A2 bằng cách gọi đệ quy lại hàm Merge Sort, sau đó trộn hai mảng con sao cho các phần tử trong mảng sau khi trộn vẫn được sắp xếp theo thứ tự. Nếu như trong các thuật toán khác, cơ sở để sắp xếp luôn là việc so sánh giá trị của hai phần tử thì Radix Sort lại dựa trên nguyên tắc phân loại.
Radix Sort không hề quan tâm đến việc so sánh giá trị của phần tử mà bản thân việc phân loại và trình tự phân loại sẽ tạo ra thứ tự cho các phần tử.