Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 37 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
37
Dung lượng
1,07 MB
Nội dung
KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ ============================ BÁO CÁO ĐỀ TÀI NGHIÊN CỨU MÔN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI : GIẢI THUẬT TÌM KIẾM , ADT NGĂN XẾP (STACK) VÀ ADT HÀNG ĐỢI (QUEUE) Giảng viên hướng dẫn: Ths Giang Thị Thu Huyền Lớp: HTTT- K12 Thành viên: Cấu trúc liệu giải thuật Đàm Văn Mạnh Nguyễn Khắc Kiên Nguyễn Văn Nam Trịnh Minh Toàn Đỗ Văn Mạnh Nguyễn Thị Xuyến MỤC LỤC I Tổng quan thuật tốn tìm kiếm II Các thuật tốn tìm kiếm Tìm kiếm t ên danh ách: 1.1 Tìm kiếm .5 1.2 Tìm kiếm có lính canh 1.3 Tìm kiếm nhị phân Tìm kiếm t ên nhị phân .7 2.1 Tìm kiếm theo chiều rộng 2.2 Tìm kiếm theo chiều âu 2.3 Cây nhị phân tìm kiếm .9 Tìm kiếm t ên đồ thị 12 III Cấu trúc liệu ngăn xếp (ADT Stack) 19 Định nghĩa ADT Stack: 19 1.1 Khái niệm: 19 1.2 Nguyên tắc thực hiện: 19 1.3 Đối tượng cất giữ: 19 1.4 Các phép toán thực hiện: 19 Cài đặt: 19 2.1 Xây dựng cấu t úc: 19 2.2 Các phép toán bản: 21 2.3 Các phép toán khác: 21 2.4 Chương t ình minh họa chức stack: 21 Ứng dụng: 22 3.1 Phát biểu toán: 22 3.2 Mô tả thuật giải đánh giá độ phức tạp: 22 3.3 Mô tả cài đặt chương t ình: 23 3.4 Các ví dụ minh họa hướng dẫn sử dụng: 26 Cấu trúc liệu giải thuật IV ADT hàng đợi (Queue) 30 Khái niệm hàng đợi 30 Các phép toán với hàng đợi 31 Cài đặt hàng đợi 31 3.2 Cài đặt hàng đợi danh ách móc nối 33 Ứng dụng 33 4.1 Bài toán: 33 4.2 Thuật toán 33 4.3 Mô tả cài đặt chương t ình 35 Cấu trúc liệu giải thuật Tổng quan thuật tốn tìm kiếm I - Nhu cầu tìm kiếm liệu HTTT: Trong hầu hết hệ lưu trữ, quản lý liệu, thao tác tìm kiếm thường thực để khai thác thông tin Do hệ thống thông tin thường phải lưu trữ khối lượng liệu đáng kể, nên việc xây dựng giải thuật cho phép tìm kiếm nhanh có ý nghĩa lớn Nếu liệu hệ thống tổ chức theo trật tự đó, việc tìm kiếm tiến hành nhanh chóng hiệu - Có nhiều giải thuật tìm kiếm mức độ hiệu giải thuật phụ thuộc vào tính chất cấu trúc liệu cụ thể mà tác động đến Dữ liệu lưu trữ chủ yếu nhớ nhớ phụ, đặc điểm khác thiết bị lưu trữ, thuật tốn tìm kiếm xếp xây dựng cho cấu trúc lưu trữ nhớ phụ có đặc thù khác Chúng tơi trình bày thuật tốn xếp tìm kiếm liệu lưu trữ nhớ - gọi giải thuật tìm kiếm xếp nội II Các thuật tốn tìm kiếm Tìm kiếm danh sách • Tìm kiếm • Tìm kiếm nhị phân • Tìm kiếm lính canh Tìm kiếm nhị phân • Tìm kiếm theo chiều rộng • Tìm kiếm theo chiều sâu • Cây nhị phân tìm kiếm Tìm kiếm đồ thị • Thuật tốn Dijkstra Tìm kiếm t ên danh ách: Cấu trúc liệu giải thuật 1.1 Tìm kiếm Bài tốn: Tìm vị trí xuất phần tử có giá trị x danh sách đặc a Tư tưởng: Lần lượt so sánh giá trị x với phần tử mảng a tìm thấy hết phần tử mảng a Các bước tiến hành: Bước 1: i = Vị trí đầu; Bước 2: Nếu a[i] = x : Tìm thấy Dừng, vị trí xuất hiện: i Bước 3: i = Vị trí kế(i); // xét tiếp phần tử kế mảng Bước 4: Nếu i >Vị trí cuối: //Hết mảng Khơng tìm thấy Dừng Ngược lại: Lặp lại Bước Hàm t ả tìm thấy, ngược lại trả 0: int LinearSearch(int a[],int n, int x) { int i=0; while((i x xuất đoạn [ai+1 , aN] dãy Nếu x < x xuất đoạn [a1, ai-1] dãy Tư tưởng: So sánh khóa cần tìm với phần tử dãy hành Nếu nhỏ tìm bên trái dãy hành Ngược lại tìm bên phải dãy hành Lặp lại thao tác Các bước tiến hành: Bước 1: left = VTĐ; right = VTC; Bước 2: Trong left right lặp: //đoạn tìm kiếm chưa rỗng Bước 2.1: mid = (left+right)/2; // lấy mốc so sánh Bước 2.2: Nếu a[mid] = x: //Tìm thấy Dừng, vị trí xuất hiện: mid Bước 2.3: Nếu a[mid] > x: //tìm x dãy aleft amid -1 right = mid - 1; Ngược lại //tìm x dãy amid +1 aright left = mid + 1; //Hết lặp Bước 3: Dừng, khơng tìm thấy Thuật toán: Int BinarySearch (int a[], int N, int x ) Cấu trúc liệu giải thuật { int left =0, right = N-1, midle; while (left địa nút gốc NULL void CreateTree(TREE &T) { T=NULL; } Tạo nút có t ường Key x: TNode *CreateTNode(int x) { TNode *p; p = new TNode; //cấp phát vùng nhớ động if(p==NULL) exit(1); // thoát else { Cấu trúc liệu giải thuật p->key = x; //gán trường liệu nút =x p->pLeft = NULL; p->pRight = NULL; } return p; } Thêm nút vào nhị phân tìm kiếm: Ràng buộc: Sau thêm đảm bảo nhị phân tìm kiếm int insertNode (TREE &T, Data X) { if(T) { if(T->Key == X) return 0; if(T->Key > X) return insertNode(T->pLeft, X); else return insertNode(T->pRight, X);} T = new TNode; if(T == NULL) return -1; T->Key = X; T->pLeft =T->pRight = NULL; return 1; } Xoá nút có Key x t ên Hủy phần tử phải đảm bảo điều kiện ràng buộc Cây nhị phân tìm kiếm Có trường hợp hủy nút TH1: X nút lá, ta xố nút mà khơng ành hưởng đến nút khác ttrên TH2: X có (cây trái phải), trước xố x ta móc nối cha X với cùa X Cấu trúc liệu giải thuật 10 - Nếu gặp toán hạng đưa - Nếu gặp dấu mở ngoặc nạp vào ngăn xếp - Nếu gặp dấu đóng ngoặc đẩy kí tự gặp dấu mở ngoặc - Nếu gặp toán hạng đưa khỏi ngăn xếp tốn hạng gặp tốn hạng có thứ tự ưu tiên thấp tốn hạng có tính kết hợp phải có thứ tự ưu tiên -> nạp phép tốn vào ngăn xếp - Duyệt hết biểu thức: Đưa tất phép tốn cịn lại khỏi ngăn xếp 3.2.2 Tính giá t ị biểu thức hậu tố: Thuật tốn tính tốn biểu thức hậu tố sau: - Duyệt biểu thức từ trái sang phải - Nếu gặp toán hạng đưa vào ngăn xếp - Nếu gặp phép tốn thì: o Nếu tốn tử hai ngơi lấy hai phần tử khỏi ngăn xếp, áp dụng toán tử lên hai toán hạng, push giá trị vào ngăn xếp o Nếu tốn tử ngơi lấy phần tử khỏi ngăn xếp, áp dụng toán tử lên toán hạng, push giá trị vào ngăn xếp - Tiếp tục duyệt hết xâu - Giá trị cịn lại ngăn xếp giá trị biểu thức 3.2.3 Độ phức tạp: Mỗi thuật tốn có lần duyệt xâu, đồng thời, trường hợp tồi nhất, kí tự xâu phải vào Stack lần, thời gian tỉ lệ tuyến tính với N – độ dài xâu biểu thức Độ phức tạp O(N) – N độ dài xâu biểu thức 3.3 Mơ tả cài đặt chương t ình: Chương trình có hai hàm hàm: + int inToPost(char *s, char *t): Chuyển dạng trung tố thành dạng hậu tố Cấu trúc liệu giải thuật 23 + int postfixExp(char *strExp, float *V): Tính giá trị biểu thức hậu tố Ngồi cịn phiên đồ họa, thao tác cửa sổ window cách sử dụng hàm API thư viện windows.h 3.3.1 Int inToPost(char *s, char *t): Input: biểu thức s dạng trung tố Output: biểu thức t dạng trung tố Thực hiện: Như thuật tốn trình bày trên, tốn hạng, ta nhập số thực, chẳng hạn: 17.5 -> đầu t, toán hạng chèn thêm dấu cách Do đó, viết 24 hiểu hai số 4, cịn viết 24 () hiểu số 24 3.3.2 Int postfixExp(char*strExp, float *V): Input: biểu thức strExp dạng hậu tố Output: giá trị V – số thực Thực hiện: Việc tính giá trị biểu thức hậu tố cách dùng stack thuật tốn trình bày Đối với tốn hạng, việc xử lí rắc rối chút, ta chuyển xâu chữ thành giá trị số thuật toán sau: Giá trị ban đầu val= 0, cờ Point = 0, Deca = 1; Duyệt đoạn xâu từ đầu đến cuối Nếu gặp dấu chấm “ ” Point = 1, Deca = Deca*10 Nếu gặp chữ số thì: o Nếu Point = val = val*10 + o Nếu Point = val = val + giá trị số / Deca; Deca = Deca * 10 - Nếu gặp kí tự khác kết thúc, đưa giá trị val - 3.3.3 Đồ họa: Cấu trúc liệu giải thuật 24 Việc xử lý đồ họa dùng theo cách sau: Tạo cửa sổ có tên Expresstion Trên đó, tạo label có tên Expresstion Tạo Vùng Text Edit để nhập biểu thức Tạo Button : Calculate để tính giá trị Reset để nhanh chóng khơi phục lại trạng thái lúc khởi động - Tạo vùng Text cuối để lưu giá trị - Phương pháp xử lí sau: o Khi người dùng nhấn Calculate thực đọc xâu từ cửa sổ phía trên, thực hai phép toán: Chuyển xâu biểu thức dạng trung tố thành hậu tố Tính biểu thức dạng hậu tố o Nếu tính thành cơng, đưa kết biểu thức bên o Ngược lại, thông báo message cảnh báo tới người dùng - Cấu trúc liệu giải thuật 25 3.4 Các ví dụ minh họa hướng dẫn sử dụng: 3.4.1 Ví dụ minh họa: 3.4.1.1 Chương t ình dịng lệnh: Tính giá trị biểu thức: – 2^2 + 2*(1+3)/5 Kết quả: 0.6 Tính giá trị biểu thức: * 3^2*0.5/3 + 12.4/2 Kết quả: 9.2 Tính giá trị biểu thức: – (~8.4)/4 + 5*2 15.1 Cấu trúc liệu giải thuật => kết quả: 26 3.4.1.2 Chương t ình đồ họa: Tính giá trị biểu thức: – (~ +2)^6 => kết - 61 Tính giá trị biểu thức: 2.2 – 12/5 + (1+2)/3 8.8 Cấu trúc liệu giải thuật => Kết 27 Cấu trúc liệu giải thuật 28 Tính giá trị biểu thức: 2.5 – (~4.5) + 2^3 – 10 + 1.2*(1+3) => kết quả: 9.8 3.4.2 Hướng dẫn người dùng: 3.4.2.1 Chương t ình dịng lệnh: a) Chạy chương t ình: - Mở chương trình: Thư mục Expresstion-cmd, click đúp vào file Expresstion.exe - Chương trình chạy hình cmd, người dùng nhập biểu thức bất kì, dạng trung tố - Nhấn Enter - Chương trình tính tốn hiển thị kết - Chương trình hỏi người dùng có muốn tiếp tục hay khơng? - Nếu muốn chạy lại nhấn Y y - Ngược lại, bấm phím khác để b) Biên dịch chương t ình: - Mở file “Expresstion.cpp” thư mục DevC - Nhấn Ctrl + F9 để biên dịch, nhấn Ctrl + F10 để chạy chương trình 3.4.2.2 Chương t ình đồ họa: a) Chạy chương t ình: Cấu trúc liệu giải thuật 29 - Mở chương trình: Thư mục Expresstion-Do hoa, click đúp vào file “Expresstion.exe” - Chương trình chạy mở cửa sổ window hình vẽ: - Nhập biểu thức vào Expreestion nhấn Calculate để tính giá trị - Có thể xóa biểu thức nhập lại bình thường nhấn Reset b) Biên dịch chương t ình: - Mở file “expresstion.dev” devC để mở project chứa mã nguồn chương trình - Nhấn Ctrl + F9 để biên dịch - Nhấn Ctrl + F10 để chạy chương trình IV ADT hàng đợi (Queue) Khái niệm hàng đợi Hàng đợi danh sách có thứ tự phép tốn chèn ln thực phía phía sau hay cuối (back or rear), cịn phép tốn thực phía cịn lại phía trước hay đầu (front or head) Các phần tử lấy khỏi hàng đợi theo quy tắc vào trước trước hàng đợi cịn gọi danh sách vào trước trước Cấu trúc liệu giải thuật 30 Các thuật ngữ liên quan đến hàng đợi: Bổ sung /Đưa vào Add/Enqueue Loại bỏ/ Đưa (Remove/ Dequeue) Phía trước/Đầu Front/Head Phía sau/Cuối Back/Rear Các phép toán với hàng đợi Q = init(): khởi tạo Q hàng đợi rỗng isEmpty(Q): Trả lại true Q hàng đợi rỗng isFull(Q): Trả lại true hàng đợi true tràn, cho biết ta sử dụng vượt kích thước tối đa dành cho hàng đợi front(Q): Trả lại phần tử phía trước (front) hàng đợi Q gặp lỗi hàng đợi rỗng enqueue(Q, x): chèn phần tử x vào phía sau hàng đợi Q Nếu việc chèn dẫn đến tràn hàng đợi cần thơng báo điều dequeue(Q, x): Xóa phần tử phía trước hàng đợi, trả lại x thông tin chứa phần tử Nếu hàng đợi rỗng cần đưa thông tin báo lỗi print(Q): Đưa danh sách tất phần tử hàng đợi Q theo thứ tự từ phía trước đến phía sau Size(Q): Trả lại số lượng phần tử hàng đợi Cài đặt hàng đợi 3.1 Cài đặt hàng đợi mảng - Sử dụng mảng Q kích thước N theo thứ tự vịng trị Có hai biến để lưu Cấu trúc liệu giải thuật Q f r 31 trữ vị trí đầu vị trí cuối (front and rear) Cấu hình bình thường Q r f Cấu hình xoay t òn - Các phép toán hàng đợi sử dụng phép tốn số học theo modulo Kích thước hàng đợi return (N-f+r ) mod N; Kiểm t a hàng đợi rỗng return (f=r) ? 0:1; Phép toán chèn if(size()=N-1) error! else x Q[r] (r+1) mod N r Phép toán loại bỏ if(isEmpty()) Error! else x Q[f]; f (f+1) mod N; return x Cấu trúc liệu giải thuật 32 - Đối với phép toán enqueu(Q) phải để ý đến lỗi tràn hàng đợi, phép toán dequeue(Q) phải để ý đến lỗi hàng đợi rỗng 3.2 Cài đặt hàng đợi danh ách móc nối - Có thể cài đặt hàng đợi danh sách nối đơn nối đơi - Các phép tốn với hàng đợi Kiểm t a hàng đợi rỗng return (front next =rear) ? 1: 0; Phép toán chèn new node; rear next next = node; rear next = node; Phép toán loại bỏ, đưa a new node; node=front front next ; next=front next next; return node; - Đối với phép tốn enqueu(Q) khơng cần quan tâm dến lỗi tràn hàng đợi, phép toán dequeue(Q) cần để ý đến lỗi hàng đợi rỗng Ứng dụng 4.1 Bài toán: Ứng dụng hàng đợi giải tốn duyệt đồ thị theo chiều rộng, tìm số thành phần liên thông đồ thị vô hướng tìm đường hai đỉnh đồ thị 4.2 Thuật toán 4.2.1 Ý tưởng thuật toán: Cấu trúc liệu giải thuật 33 Từ đỉnh đồ thị chưa xét kết lạp vào hàng đợi, hàng đợi không rỗng thực công việc lấy phần tử khỏi hàng đợi, thực thăm đỉnh kết lạp đỉnh kề vào hàng đợi, đánh dấu đỉnh thăm Việc tìm số thành phần liên thông thực hiên cách dùng hai biến Inconnect Index[] để lưu số thành phần kiên thông đỉnh thuộc thành phần liên thông duyệt đồ thi theo chiều rộng Dùng mảng Truoc[so dinh] để lưu đỉnh xét trước từ tìm dướng hai điểm Tht tốn duyệt đồ thị theo chiều rộng dùng hàng đợi procedure BFS(v) QUEUE=ϕ; QUEUE v; (kết nạp v vào hàng đợi) chuaxet[v]=fale; while (QUEUE ≠ ϕ) p QUEUE; (lấy p từ QUEUE ) thamDinh(p); for u ϵ ke(p) if (chuaxet[u]) then QUEUE u; chuaxet[u]=fale; Index [] u (thêm u vào Index[]) Truoc[u]=p; then then then Tìm thành phần liên thông for v ϵ V chuaxet[v]=true; for v ϵ V if (chuaxet[v] ) then BFS(v); Cấu trúc liệu giải thuật 34 Tìm đườn giưa đỉnh nhập đỉnh u, v BFS(u); Đường đi: v p1=truoc[t] p2=truoc[p1] … u 4.2.2 Độ phức tạp thuật toán: - Độ phức tạp thuật toán duyệt đồ thị BFS Thuật toán loại bỏ đỉnh khỏi hàng đợi lần, thao tác dequeue(Q) thực |V| lần Với đỉnh thuật toán duyệt qua đỉnh kề thời gian xử lý đỉnh số Như vật thời gian thực câu lệnh if vòng while số nhân với số đinh kề đỉnh xét Do tổng thời gian thực việc duyệt qua tất đỉnh số nhân với số cạnh |E| Thời gian tổng cộng: O(|V|) + O(|E|) = O(|V| + |E|) - Độ phức tạp thuật tốn tìm ố thành phần liên thơng Inconnect số thành phần liên thơng Thuật tốn phải thực BFS Inconnect lần, lần gọi thời gian O(|Vi| + |Ei|) với |Vi|, |Ei| số đỉnh số cạnh thành phần liên thông Thời gian tổng cộng là: O(|V| + |E|) - Độ phức tạp thuật tốn tìm đường Thuật tốn gọi BFS lần quay ngược để tìm đường thời gian O(|V|) Thời gian tổng cộng là: O(|V| + |E|) + O(|V|) = O(|V| + |E|) hay O(|V|2) 4.3 Mơ tả cài đặt chương t ình - Sử dụng hàng đợi biểu diễn danh sách liên kết đơn - Dữ liệu nhập từ file chuẩn bị theo hình thức danh sách cạnh, dịng file in số đỉnh đồ thị - Đồ thi biểu diễn danh sách kề Cấu trúc liệu giải thuật 35 - Chương trình gồm file File head1.h khai báo cấu trúc sử dụng thao tác với hàng đợi biểu diễn danh sách liên kết đơn, file head2.h định nghĩa hàm sử dụng, file main.cpp chương trình - Giao diện chương trình chính: - Ví dụ kết tìm thành phần liên thơng đồ thị - Ví dụ kết qua tim đường đỉnh đồ thị Cấu trúc liệu giải thuật 36 THE END Cấu trúc liệu giải thuật 37 ... tốn tìm kiếm Tìm kiếm danh sách • Tìm kiếm • Tìm kiếm nhị phân • Tìm kiếm lính canh Tìm kiếm nhị phân • Tìm kiếm theo chiều rộng • Tìm kiếm theo chiều sâu • Cây nhị phân tìm kiếm Tìm kiếm. .. quan thuật tốn tìm kiếm II Các thuật tốn tìm kiếm Tìm kiếm t ên danh ách: 1.1 Tìm kiếm .5 1.2 Tìm kiếm có lính canh 1.3 Tìm kiếm nhị phân Tìm kiếm. .. trữ, thuật tốn tìm kiếm xếp xây dựng cho cấu trúc lưu trữ nhớ phụ có đặc thù khác Chúng tơi trình bày thuật tốn xếp tìm kiếm liệu lưu trữ nhớ - gọi giải thuật tìm kiếm xếp nội II Các thuật tốn tìm