1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập cấu trúc dữ liệu và giải thuật có lời giải

21 1,2K 5

Đ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

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 143 KB

Nội dung

ĐỀ CƯƠNG ÔN TẬP MÔN CTDL & TT CÓ LỜI GIẢIPHẦN I... Phân tích giải thuật sẽ đánh giá các giải thuật và tìm ra giải thuật tốt nhất... Có thể thừa hoặc thiếu bộ nhớ khi xó

Trang 1

ĐỀ CƯƠNG ÔN TẬP MÔN CTDL & TT CÓ LỜI GIẢI

PHẦN I LÝ THUYẾT CHƯƠNG I

1.1 Các khái niệm cơ bản

- Mô hình dữ liệu : là mô hình toán học cùng với các phép toán có thể thực hiện trên

các đối tượng của mô hình

- Kiểu dữ liệu trừu tượng : là một mô hình dữ liệu được xét cùng với một số xác định

các phép toán

- Giải thuật : là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác

trên một số đối tượng nào đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong muốn

- Cấu trúc dữ liệu : Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong MTĐT, được gọi là cấu trúc dữ liệu.

- Kiểu dữ liệu :

+ Mỗi kiểu DL trong ngôn ngữ lập trình thường đại diện cho một loại dữ liệu trong thực tế

+ Trong ngôn ngữ lập trình, một kiểu dữ liệu T được xác định bởi một bộ <V, O> trong đó :

V : tập các giá trị hợp lệ mà một đối tượng kiểu T có thể lưu trữ

O : tập các thao tác xử lý có thể thi hành trên đối tượng kiểu T

- Mối quan hệ giữa CTDL và GT : Giải thuật tác động trên dữ liệu lưu trữ trong các cấu

trúc để cho ra kết quả mong muốn Trong lập trình, chúng quan hệ với nhau theo ràng buộc sau:

Giải thuật + cấu trúc dữ liệu = chương trình

1.2 Phân biệt CTLT trong và CTLT ngoài

- CTLT trong : được lưu trữ trong bộ nhớ trong Ví dụ: mảng, bản ghi…

- CTLT ngoài : được lưu trữ trong bộ nhớ ngoài Ví dụ: tệp tin, bảng…

1.3 Đệ quy

- Khái niệm : Một đối tượng được gọi là đệ quy nếu nó bao gồm chính nó như là một bộ

phận hoặc nó được định nghĩa dưới dạng của chính nó

- Giải thuật đệ quy : là giải thuật có chứa lời giải đệ quy Lời giải đệ quy là lời giải của

bài toán T được thực hiện bởi lời giải của bài toán T’ có dạng như T (cỡ của T’< T)

- Đặc điểm của giải thuật đệ quy : Có 3 đặc điểm

- Trong giải thuật đệ quy bao giờ cũng có lời gọi đến chính nó

- Sau mỗi lời gọi đệ quy, kích thước của bài toán được thu nhỏ hơn trước

- Có một trường hợp suy biến: bài toán được giải quyết theo một cách khác hẳn và giải thuật cũng kết thúc

- Ưu – nhược điểm của GT đệ quy :

+ ưu điểm : thuận lợi cho việc biểu diễn bài toán, đồng thời làm gọn chương trình+ nhược điểm : không tối ưu về mặt thời gian (so với sử dụng vòng lặp), gây tốn bộ nhớ

Trang 2

- Viết thuật toán tính n!, tính dãy fibonaci

int TinhFB (int n){

if(n==1 || n==2) return 1;

else return (TinhFB(n-1)+TinhFB(n-2));

}

1.4 Sự cần thiết phân tích giải thuật

- Một bài toán có thể có nhiều giải thuật khác nhau Phân tích giải thuật sẽ đánh giá các giải thuật và tìm ra giải thuật tốt nhất Các tiêu chuẩn đánh giá:

+ Giải thuật đúng đắn: để kiểm tra tính đúng đắn của giải thuật ta có thể cài đặt giải thuật đó và cho thực hiện trên máy với một số bộ dữ liệu mẫu rồi lấy kết quả thu đc

so sánh với kết quả đã biết

+ Giải thuật đơn giản: cần 1 giải thuật dễ viết chương trình để nhanh chóng có được kết quả

+ Độ phức tạp của giải thuật : là hiệu quả của giải thuật Tính hiệu quả thể hiện qua 2 mặt là thời gian và không gian

1.5 Các bước cơ bản từ bài toán đến chương trình <2 bước>

- Bước 1: Thiết kế: nhằm xác định bài toán cần giải quyết và xây dựng mô hình toán họccho bài toán

- Bước 2: Mã hoá: Sử dụng ngôn ngữ lập trình cụ thể để viết chương trình ứng với cách làm của giai đoạn trc nó

CHƯƠNG II 2.1 Các khái niệm cơ bản

- Danh sách

+ Khái niệm : Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn

biến động các phần tử thuộc cùng một lớp đối tượng nào đó Có thể cài đặt danh sách bởi mảng và bởi con trỏ, tương ứng ta có danh sách kế tiếp và danh sách móc nối (danh sách liên kết)

+ Hình ảnh :

+ Nguyên tắc hoạt động :

+ Ví dụ :

- Ngăn xếp

+ Khái niệm : ngăn xếp là một danh sách tuyến tính trong đó phép bổ sung một

phần tử vào ngăn xếp và phép loại bỏ một phần tử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp

+ Hình ảnh :

Trang 3

+ Nguyên tắc hoạt động :

+ Ví dụ :

- Hàng đợi

+ Khái niệm : hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một

phần tử vào hàng đợi được thực hiện ở một đầu còn phép loại bỏ một phần tử ra khỏi hàng đợi được thực hiện ở đầu kia

+ Hình ảnh :

+ Nguyên tắc hoạt động :

+ Ví dụ :

2.3 Phân biệt ngăn xếp và hàng đợi

- Việc thêm vào, lấy ra một phần tử từ ngăn xếp đều được thực hiện ở một đầu, dođó ngăn xếp hoạt động theo nguyên tắc LIFO, thích hợp với các ứng dụng có trình tự truy xuất ngược với trình tự lưu trữ

- Việc thêm vào, lấy ra một phần tử từ hàng đợi được thực hiện ở hai đầu khác nhau, do đó hàng đợi hoạt động theo nguyên tắc FIFO, thích hợp với các ứng dụng có trình tự truy xuất và trình tự lưu trữ như nhau

2.2 Phân biệt mảng và danh sách liên kết

Vùng nhớ của các phần tử trong mảng

được sắp xếp liên tục nhau

Vùng nhớ của các phần tử trong danh sách liên kết được sắp xếp tùy ý (do hệ điều hành) Các phần tử lưu 1 con trỏ trỏ tới phần tử tiếp theo

Truy cập tới phần tử trong mảng là truy

cập trực tiếp dựa vào chỉ số (ví dụ: a[0],

a[1], a[2],…, a[n])

Cần phải duyệt tuần tự khi muốn truy cập tới phần tử trong danh sách liên kết

 Kích thước của mảng là hằng số,

không thay đổi khi chạy chương

trình

 Sử dụng mảng không tối ưu được bộ

nhớ Có thể thừa hoặc thiếu bộ nhớ

khi xóa hoặc chèn phần tử vào mảng

 Kích thước của danh sách liên kết cóthể thay đổi khi chạy chương trình

 Sử dụng danh sách liên kết tối ưu được bộ nhớ Vùng nhớ được cấp phát thêm khi cần chèn thêm phần tửmới, vùng nhớ được free khi xóa phần tử

Trang 4

CHƯƠNG III 3.1 Các khái niệm cơ bản

- Cây tổng quát : cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó có 1 nút

đặc biệt được gọi là gốc, các nút còn lại được chia thành những tập rời nhau T1, T2 , ,

Tn theo quan hệ phân cấp trong đó Ti cũng là một cây Mỗi nút ở cấp i sẽ quản lý một sốnút ở cấp i+1 Quan hệ này người ta còn gọi là quan hệ cha-con

- Cây nhị phân : là một cây, trong đó số con tại mỗi đỉnh trên cây tối đa là 2 con và

được sắp thành cây con trái và cây con phải

- Cây tìm kiếm nhị phân : là 1 cây nhị phân t/m các đk:

+ All khoá tại các đỉnh của cây con bên trái đều có giá trị đi trước nhỏ hơn các khoá tại đỉnh gốc

+ Khoá tại gốc đi trc nhỏ hơn all các khoá ở các đỉnh của cây con bên phải

+ Cây con bên trái và cây con bên phải cũng là cây TKNP

- Các dạng cây nhị phân đặc biệt :

+ Cây lệch trái + Cây lệch trái + Cây zic-zắc

+ Cây nhị phân hoàn chỉnh

+ Cây nhị phân đầy đủ

3.2 Các nguyên tắc duyệt cây đa phân và cây nhị phân

- Nguyên tắc duyệt cây đa phân (cây tổng quát, cây)

+ Duyệt theo thứ tự trước

Nếu cây T rỗng: Không làm gì

Nếu T khác rỗng: Trình tự thăm các cây như sau:

Nếu cây T rỗng: Không làm gì

Nếu T khác rỗng: Trình tự thăm:

1 Thăm các cây con T1, T2,…,T(k) của T theo thứ tự sau

2 Thăm gốc T

- Nguyên tắc duyệt cây nhị phân

+ Duyệt tiền tự – thứ tự trước: duyệt nút gốc, duyệt tiền tự con trái rồi duyệt tiền tự con phải

+ Duyệt trung tự – duyệt theo thứ tự giữa: duyệt trung tự con trái rồi đến nút gốc sau đó là duyệt trung tự con phải

+ Duyệt hậu tự – duyệt theo thứ tự sau: Duyệt hậu tự con trái rồi duyệt hậu tự con phải sau đó là nút gốc

Trang 5

CHƯƠNG IV 4.1 Định nghĩa đồ thị

- Đồ thị là một cấu trúc rời rạc dùng để mô tả một tập hợp các đối tượng rời rạc có mối

quan hệ n-m với nhau (n,m>0) Ký hiệu đồ thị G là G=<V,E>, trong đó:

+ V là tập các đỉnh

+ E là tập các cạnh/cung

4.2 Các khái niệm

- Đồ thị có hướng : nếu E là tập các cặp (u,v) khác (v,u), gọi là các cung

- Đồ thị vô hướng : nếu E gồm các cặp (u,v) = (v, u), gọi là các cạnh

- Đồ thị liên thông : nếu có đường đi giữa mọi cặp đỉnh phân biệt của đồ thị

- Đồ thị đơn : nếu giữa hai đỉnh u, v bất kỳ có nhiều nhất 1 cạnh/cung

- Đồ thị đa : nếu giữa hai đỉnh u, v bất kỳ có thể có nhiều hơn 1 cạnh/cung

- Đỉnh kề : nếu e = (u, v) là một cạnh thuộc E thì ta nói u, v kề nhau, và e là liên thuộc

với u và v

- Đường đi : một đường đi P = (V1, V2, …., Vp) mà cạnh (V(i-1), V(i)) thuộc E,

với i = 2… p;

- Chu trình : P được gọi là chu trình nếu V1 = Vp

- Bậc của một đỉnh trên đồ thị : bậc của v (ký hiệu: deg(v)) là số cạnh liên thuộc với v

CHƯƠNG V 5.1 Tập hợp

- Định nghĩa tập hợp : Tập hợp là một cấu trúc rời rạc được nói là chứa các phần tử của

nó Tập hợp thường dùng để gom nhóm các phần tử có các tính chất chung lại với nhau, nhưng nó cũng có thể chứa các phần tử chẳng có mối quan hệ gì với nhau

- Các phương pháp mô tả tập hợp : có 3 cách mô tả tập hợp

+ Cách 1: Dùng biểu đồ Ven là một đường cong khép kín, các điểm trong đường cong đó chỉ các phần tử của tập hợp

+ Cách 2: Liệt kê tất cả các phần tử của tập hợp A

Trang 6

5.2 Hàm băm

- Tư tưởng hàm băm :

+ Phân chia tập hợp đã cho thành một số cố định các lớp(giả sử N lớp được đánh số từ 0 -> N-1)

+ Sử dụng một mảng T có chỉ số chạy từ 0 đến N-1 để chứa các phần tử trong tập hợp, mỗi thành phần T[i] là một “rổ” đựng các phần tử thuộc lớp thứ i, các phần

tư trong mỗi lớp được tổ chức thành một danh sách liên kết, T[i] là con trỏ trỏ tới phần tử đầu tiên trong lớp thứ i T chính là bảng băm mở

- Tác dụng hàm băm : Phân chia các phần tử của tập hợp vào trong các lớp Nếu x là

giá trị khóa của môt phần tử nào đó của tập hợp thì h(x) là chỉ số nào đó của mảng T, h(x) được gọi là giá trị băm của x, ta nói x thuộc lớp h(x);

- Tiêu chí lựa chọn :

+ Hàm băm phải cho phép tính được dễ dàng và nhanh chóng giá trị băm của mỗi khóa

+ Phân bố đều các khóa vào các lớp

Trang 7

PHẦN II BÀI TẬP

I Bài tập về danh sách, ngăn xếp, hàng đợi

1 Danh sách

Dạng cài đặt

Theo mảng

#define N 100 Typedef int item;

typedef struct{

}List;

Theo con trỏ

Typedef int item;

typedef struct Node{

};

typedef Node *List;

Danh sách kế tiếp

#include <stdio.h>

#include <stdlib.h>

#define N 100;

typedef int item;

//Cai dat cau truc mang

//Ham kiem tra danh sach day

int Isfull (List L)

Trang 8

int x;

scanf("%d", &x);

return x;

}

//Ham nhap du lieu

void Input (List *L)

//Ham hien thi du lieu

void Output (List L)

//Ham them phan tu x vao vi tri thu k

int Insert_k (List *L, item x, int k)

//Ham xoa phan tu o vi tri thu k

int Del_k (List *L, item *x, int k)

Trang 9

//Ham tim kiem phan tu co gia tri x

int Search (List L, item x)

typedef int item;

//Cai dat danh sach

typedef struct Node

{

item Data;

Node *next;

};

typedef Node *List;

//Khoi tao danh sach rong

void Init (List &L)

{

L=NULL;

}

//Kiem tra danh sach rong

int Isempty (List L)

{

return (L==NULL);

}

//Tao mot node chua du lieu x

Node *Make_Node (Node *P, item x)

{

P = (Node *) malloc (sizeof (Node)); P->next = NULL;

P->Data = x;

Trang 10

return P;

}

//Tinh do dai danh sach

int len (List L)

//Them phan tu co gia tri x vao vi tri dau

void Insert_first (List &L, item x)

//Them phan tu co gia tri x vao vi tri k

void Insert_k (List &L, item x, int k)

//Them phan tu o vi tri cuoi

//Xoa phan tu o vi tri dau

void Del_frist (List &L, item &x)

{

x = L->Data;

L = L->next;

}

Trang 11

//Xoa phan tu o vi tri thu k

void Del_k (List &L, item &x, int k)

//Xoa phan tu o vi tri cuoi

//Nhap du lieu cho danh sach

void Input (List &L)

//Hien thi du lieu

void Output (List L)

Trang 12

Các thao tác dùng con trỏ

//tao cau truc stack

typedef int item;

//khoi tao ngan xep rong 1

void Init(stack &s)

{

s.Top=NULL;

}

//kiem tra danh sach rong

int empty (stack s)

//them 1 phan tu vao dinh

void Push(stack &s, item x)

Trang 13

//Xoa 1 phan tu o dinh

int Pop(stack &s)

Trang 14

int front, rear;

item Data;

Node * Next;

};

Các thao tác dùng con trỏ

//Cai dat 1 node

//Khoi tao queue rong

void Init(Queue &Q)

{

Q.Front = Q.Rear = NULL;

Q.count = 0;

}

//Kiem tra queue rong

int Isempty (Queue Q)

Node *P = (Node*) malloc(sizeof(Node));

P->Next = NULL; P->Data = x;

return P;

}

//Them phan tu vao cuoi queue

void Push(Queue &Q, item x)

Node * Front, *Rear; int count;

};

Trang 15

//Xoa phan tu o dau queue

int Pop(Queue &Q)

//Them phan tu x o vi tri thu k

//Xoa phan tu x o vi tri thu k

Trang 16

Vẽ cây nhị phân biểu diễn biểu thức toán học, đưa biểu thức toán học về

dạng tiền tố, hậu tố

Dạng cài đặt cây đa phân bằng con trưởng và em liền kề

struct Node *EldestChild;

struct Node *Nextsibling;

Dạng cài đặt cây TKNP bằng con trỏ

typedef struct Node

typedef Node *SearchTree;

Trình bày ý tưởng và viết các hàm cho cây đa phân

Tìm con trưởng, em kề

 Ý tưởng

 Cài đặt

Theo con trỏ

typedef int item;

typedef struct Node{

item data;

Node *left, *right;} Node;

Node *BTree;

Trang 17

Tìm cha của đỉnh k

Ý tưởng: Duyệt lần lượt các đỉnh trên cây, xuất phát từ gốc (i=1), kiểm tra

xem con trưởng j của i có = k hay không?

- Nếu bằng thì i chính là cha cần tìm

- Ngược lại, kiểm tra em liền kề của con trưởng j xem có bằng k hay ko?

+ Nếu bằng nhau thì i chính là cha cần tìm+ Nếu không ktra j là em liền kề của j cũ

Cứ tiếp tục như vậy cho đến khi kiểm tra hết các con của i mà không có con nào = k thì duyệt đỉnh i tiếp theo trên cây Ngược lại chỉ cần 1 con j của i = k thì dừng tìm kiếm và kl i chính là đỉnh cha cần tìm

Cài đặt:

int Parent (Tree T, int k){

int i=0; int j; int found=0;

while(i<N && (found!=1)){

j=T.Elems[i].EldestChild;

if(j==k){

return i;

found = 1;

}else{

j=T.Elems[j].NextSibling;

while(j!==-1 && (found!=1)){

if(j==k){

return i;

found = 1;

}else j=T.Elems[j].NextSibling;} i++ }}

Duyệt cây theo thứ tự trước

Ý tưởng:

Nếu cây T rỗng: Không làm gì

Nếu T khác rỗng: Trình tự thăm các cây như sau:

Preorder (C);

c = NextSibling;

}}

Trang 18

Duyệt theo thứ tự giữa

Ý tưởng:

Nếu cây T rỗng: Không làm gì cả

Nếu T khác rỗng: Trình tự thăm:

1 Thăm cây con T1 của T theo thứ tự giữa

Inorder(c);

c = NextSibling(c);

}visit(T);

while(c!=$){

Inorder(c);

c = NextSibling(c);

}}

Duyệt theo thứ tự sau

Ý tưởng:

Nếu cây T rỗng: Không làm gì

Nếu T khác rỗng: Trình tự thăm:

1 Thăm các cây con T1, T2,…,T(k) của T theo thứ tự sau

Postorder(c);

c = NextSibling(c);

}visit(T);

}

Trình bày ý tưởng và viết các hàm cho cây nhị phân

Ý tưởng

Cài đặt

Trình bày ý tưởng và viết các hàm cho cây TKNP

Nhập dữ liệu

Ngày đăng: 05/12/2018, 09:18

TỪ KHÓA LIÊN QUAN

w