Tải bản đầy đủ (.pdf) (33 trang)

BÀI GIẢNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT DATA STRUCTURE AND ALGORITHMS pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (361.76 KB, 33 trang )

CẤU TRÚC DỮ LIỆU VÀ
GIẢI THUẬT
DATA STRUCTURE AND
ALGORITHMS
GV: Phạm Tuấn Hiệp
Email:

Ôn tập tốt nghiệp
Nội dung ôn tập
 Chương 1: Ôn tập Kỹ thuật lập trình
 Chương 2: Tìm kiếm, Sắp xếp
 Chương 3: Danh sách liên kết
 Chương 4: Cây
2
Ôn tập tốt nghiệp
Tài liệu học tập

Giáo trình:
 C & Data Structures, P. S. Deshpande, O. G. Kakde -
CHARLES RIVER MEDIA, INC. Hingham, Massachusetts.

Tham khảo:
 Giáo trình Cấu trúc dữ liệu 1, Trần Hạnh Nhi – Dương Anh
Đức, Trường ĐHKHTN – ĐHQG TP.HCM.

Phần mềm lập trình:
 C-Free 4.0
 Borland C++
 …
3
Chương 1: Ôn tập Kỹ thuật lập trình


4
Ôn tập tốt nghiệp
Nội dung

Con trỏ

Mảng 1 chiều

Đệ quy
5



Ôn tập tốt nghiệp
Con trỏ

Cách khai báo con trỏ

Các phép toán trên con trỏ
6
void main(){
int x=10, y=20;
int *p, *q;
p=&x;
q=&y;
cout<<x<<" "<<y<<endl;
cout<<*p<<" "<<*q<<end;
}
Cho biết kết quả in ra màn hình?
x = 10

y = 10
p = 10
q = 10
Ôn tập tốt nghiệp
Con trỏ
void main(){
int x=10, y=20;
int *p, *q;
p=&x;
q=&y;
*p=50;
*q=90;
cout<<x<<" "<<y<<endl;
cout<<*p<<" "<<*q<<end;
}
Cho biết kết quả in ra màn hình?
7
x = 50
y = 90
p = 50
q = 90
Ôn tập tốt nghiệp
Con trỏ
void main(){
int x=10, y=20;
int *p, *q;
p=&x;
q=&y;
*p=50;
*q=90;

p=q;
cout<<x<<" "<<y<<endl;
cout<<*p<<" "<<*q<<end;
}
Cho biết kết quả in ra màn hình?
8
x = 50
y = 90
p = 90
q = 90
Ôn tập tốt nghiệp
Con trỏ
Cho biết kết quả của chương trình sau:
int Test(int &a, int b, int &c) {
a ; a+=b; ++c=a+b;
return a+b+c;
}
int x=5, y=2, z=2011;
void main(){
cout<<Test(x,y,z)<<" "<<x<<" "<<y<<" "<<z<<endl;
}
9
A. 16 6 2 2011
B. 16 5 2 8
C. 16 5 2 2011
D. 16 6 2 8
Ôn tập tốt nghiệp
Nội dung

Con trỏ


Mảng 1 chiều

Đệ quy
10



Ôn tập tốt nghiệp
Mảng 1 chiều

Khai báo mảng

Các phép toán trên mảng
11
void function(char *s1, char *s2){
while (*(s1++)=*(s2++));
}
void main(){
char s2[100];
char s1[]="Giao Trinh Ngon Ngu C++";
function(s2,s1);
cout<<s2;
}
Cho biết kết quả in ra màn hình?
Giao Trinh Ngon Ngu C++
Ôn tập tốt nghiệp
Mảng 1 chiều
void main(){
float a[5]={5, 4, 3, 2, 1};

float x;
int i;
for(i=0; i<5; i++)
a[i] += a[0];
x=a[1]+a[4];
cout<<x;
}
Cho biết kết quả in ra màn hình?
12
A. 125
B. 5
C. 100
D. 25
Ôn tập tốt nghiệp
Mảng 1 chiều
Cho biết kết quả của chương trình sau:
void main(){
int a[]={5,1,12,11,8,20,14,12,7};
for(int i=4;i<=7;i++)
for(int j=i+1;j<=8;j++)
if(a[i]>a[j]){
int t=a[i]; a[i]=a[j]; a[j]=t;
}
cout<<a[6];
}
13
A. 7
B. 12
C. 8
D. 20

Ôn tập tốt nghiệp
Nội dung

Con trỏ

Mảng 1 chiều

Đệ quy
14



Ôn tập tốt nghiệp
Đệ quy

Đệ quy là sự gọi lại chính nó khi thực hiện

Thường được dùng cho các bài toán truy hồi
15
Cho hàm đệ quy sau:
int Func(int n){
if(n == 5) return 5;
else
return 2 * Func(n+1);
}
Giá trị của Func(2) là?
A. 50
B. 2
C. 5
D. 40

Ôn tập tốt nghiệp
Đệ quy
void Foo(int x){
if(x>0)
Foo(x-3);
cout<<x<<" ";
}
Cho biết kết quả in ra màn hình khi goi hàm Foo(6)?
16
A. 6 3
B. 0 3 6
C. 0 3
D. 6 3 0
Chương 2: Tìm kiếm, Sắp xếp
17
Ôn tập tốt nghiệp
Nội dung

Tìm kiếm tuyến tính, nhị phân

Các thuật toán sắp xếp

Đổi chỗ trực tiếp (Interchange sort)

Nổi bọt (Bubble sort)

Chèn trực tiếp (Insertion sort)

Chọn trực tiếp (Selection sort)


Dựa trên phân hoạch (Quick sort)
18



Ôn tập tốt nghiệp
Tìm kiếm tuyến tính (tuần tự)
19
Ý tưởng:

Bắt đầu từ phần tử đầu tiên của danh sách, so sánh lần
lượt từng phần tử của danh sách với giá trị X cần tìm
 Nếu có phần tử bằng X thì trả về vị trí tìm thấy, thuật toán
dừng lại (thành công)
 Nếu đến cuối danh sách mà không có phần tử nào bằng X,
thuật toán dừng lại (không thành công)
Ôn tập tốt nghiệp
Tìm kiếm tuyến tính (tuần tự)
20
13
1 2 n
3 5 10 13 6 9
A[0] A[n-1]
i=0 i=1i i=2 i=3
3
Tìm thấy tại
vị trí 4
19
i=4 i=5
-1

Tìm Ko thấy
Ôn tập tốt nghiệp
Tìm kiếm nhị phân
21

Điều kiện:
 Danh sách phải được sắp xếp trước

Ý tưởng:
 So sánh giá trị muốn tìm X với phần tử nằm ở vị trí giữa
của danh sách:
 Nếu bằng, tìm kiếm dừng lại (thành công)
 Nếu X lớn hơn thì tiếp tục tìm kiếm ở phần danh sách bên phải
phần tử giữa
 Nếu X nhỏ hơn thì tiếp tục tìm kiếm ở phần danh sách bên trái
phần tử giữa
Ôn tập tốt nghiệp
Tìm kiếm nhị phân
22
Left Right
36
m=(Left + Right)/2
= (0+11)/2
= 5
A[m]
m=(Left + Right)/2
= (6+11)/2
= 8
A[m]
m=(Left + Right)/2

= (9+11)/2
= 10
A[m]
Tìm thấy tại
vị trí 11
m
0 1 2 3 4 5 6 7 8 9 10 11
Ôn tập tốt nghiệp
Tìm kiếm nhị phân
23
0 1 2 3 4 5 6 7 8 9 10 11
Left Right
24
m=(Left + Right)/2
= (0+11)/2
= 5
A[m]
m=(Left + Right)/2
= (6+11)/2
= 8
A[m]
m=(Left + Right)/2
= (6+7)/2
= 6
A[m]
Tìm ko thấy
-1
m=(Left + Right)/2
= (7+7)/2
= 7

A[m]
Ôn tập tốt nghiệp
Tìm kiếm
int TimKiem(int M[],int N,int X){
int k=0;
M[N]=X;
while(M[k]!=X) k++;
if(k<N) return k;
return -1;
}
Chọn câu trả lời đúng nhất:
24
A. Hàm trả về 0 nếu không tìm thấy phần tử có giá trị X
B. Hàm trả về 1 nếu tìm thấy phần tử có giá trị X
C. Hàm trả về -1 nếu không tìm thấy phần tử có giá trị X
D. Hàm trả về 1 nếu không tìm thấy phần tử có giá trị X
Ôn tập tốt nghiệp
Tìm kiếm
Cho thuật toán (được thể hiện bằng mã giả):
B1: k = 1
B2: IF(M[k] == X && k != N)
B2.1: k++
B2.2: Lặp lại B2
B3: IF (k < N)
Thông báo tìm thấy tại vị trí k
B4: ELSE
Không tìm thấy
B5: Kết thúc
Đoạn mã trên mô tả thuật toán gì?
25

A. Tìm nhị phân phần tử có giá trị X
B. Tìm phần tử nhỏ nhất trong mảng M bao gồm N phần tử
C. Tìm tuyến tính phần tử có giá trị X
D. Tìm phần tử lớn nhất trong mảng N bao gồm M phần tử
Ôn tập tốt nghiệp
Tìm kiếm
int TimKiem(int M[],int First, int Last,int X){
if(First > Last) return -1;
int Mid = (First+Last)/2;
if(M[Mid] == X) return Mid;
if(X < M[Mid]) return TimKiem(M,First,Mid-1,X);
else return TimKiem(M,Mid+1,Last,X);
}
Chọn câu đúng nhất miêu tả hàm trên:
26
A. Hàm tìm kiếm phần tử có giá trị X trên mảng các phần tử từ chỉ số First đến chỉ
số Last
B. Hàm tìm kiếm đệ quy phần tử có giá trị X trên mảng các phần tử từ chỉ số First
đến chỉ số Last
C. Hàm tìm kiếm đệ quy phần tử có giá trị X trên mảng các phần tử từ chỉ số Last
đến chỉ số First
D. Hàm tìm kiếm không đệ quy phần tử có giá trị X trên mảng các phần tử từ chỉ
số Last đến chỉ số First
Ôn tập tốt nghiệp
Nội dung

Tìm kiếm tuyến tính, nhị phân

Các thuật toán sắp xếp


Đổi chỗ trực tiếp (Interchange sort)

Nổi bọt (Bubble sort)

Chèn trực tiếp (Insertion sort)

Chọn trực tiếp (Selection sort)

Dựa trên phân hoạch (Quick sort)
27



Ôn tập tốt nghiệp
Sắp xếp
void T(int A[], int n){
int i, j, tmp;
for(i=1; i<n; i++){
j = i;
while(j>0 && A[j-1] > A[j]){
tmp = A[j];
A[j] = A[j-1];
A[j-1] = tmp;
j ;
}
}
}
Thuật toán trên là:
28
A. Bubble sort

B. Selection sort
C. Insertion sort
D. Quick sort
Ôn tập tốt nghiệp
Sắp xếp
Cho mảng A[]={11, 16, 12, 75, 51, 54, 73, 36, 52, 98};
Cần thực hiện bao nhiêu lần để mảng A có thứ tự tăng
dần theo phương pháp sắp xếp Chèn trực tiếp (Insertion
Sort)?
29
A. 7
B. 8
C. 9
D. 10
Ôn tập tốt nghiệp
Sắp xếp
Cho mảng A[]={16, 60, 2, 25, 15, 45, 5, 30, 33, 20};
Cần thực hiện bao nhiêu lần để mảng A có thứ tự tăng
dần theo phương pháp sắp xếp Chọn trực tiếp (Selection
Sort)?
30
A. 7
B. 8
C. 9
D. 10
Ôn tập tốt nghiệp
Sắp xếp
void T(int A[], int n){
int i, j, minIndex, tmp;
for(i=0; i<n; i++){

minIndex = i;
for(j=i+1; j<n; j++)
if(A[j] < A[minIndex])
minIndex = j;
if(minIndex != i){
tmp = A[i];
A[i] = A[minIndex];
A[minIndex] = tmp;
}
}
}
Thu
ật toán trên là?
31
A. Bubble sort
B. Selection sort
C. Insertion sort
D. Quick sort
Ôn tập tốt nghiệp
Sắp xếp
Cho mảng A[]={42, 23, 74, 11, 65, 58};
Dùng phương pháp sắp xếp chèn trực tiếp
(Insertion Sort) để sắp mảng tăng dần, sau
bước thứ 4, mảng A có dạng?
32
A. 11 23 42 74 65 58
B. 11 23 42 65 74 58
C. 11 23 58 65 42 74
D. 11 23 42 74 58 65
Ôn tập tốt nghiệp

Sắp xếp
Cho mảng A[]={12, 2, 8, 5, 1, 6, 4, 15}. Các giá trị của
mảng A được sắp xếp tăng dần theo từng bước như sau:
4 2 8 5 1 6 12 15
4 2 1 5 8 6 12 15
1 2 4 5 8 6 12 15
1 2 4 5 6 8 12 15
Mảng A được sắp xếp theo thuật toán nào?
33
A. Selection Sort
B. Quick Sort
C. Insertion Sort
D. Bubble Sort
Ôn tập tốt nghiệp
Sắp xếp
Cho mảng A[]={12, 2, 8, 5, 1, 6, 4, 15}.
Dùng phương pháp sắp xếp nhanh (Quick
Sort) để sắp mảng tăng dần, sau bước thứ
2, ba vị trí đầu trong mảng là những số
nào?
34
A. 4 2 8
B. 4 2 1
C. 1 2 4
D. 2 1 4
Ôn tập tốt nghiệp
Sắp xếp
Cho mảng A[]={8, 22, 7, 9, 31, 19, 5, 13}.
Dùng phương pháp sắp xếp nổi bọt (Bubble
Sort) để sắp mảng tăng dần. Cho biết số lần

hoán vị các phần tử trong mảng?
35
A. 11
B. 12
C. 13
D. 14
Chương 3: Danh sách liên kết
36
Ôn tập tốt nghiệp
Nội dung

Danh sách liên kết

Ngăn xếp (Stack), Hàng đợi (Queue)
37



Ôn tập tốt nghiệp
Danh sách liên kết

Định nghĩa cấu trúc Node trong dslk

Các phép toán trên trên dslk

Thêm đầu

Thêm cuối

Thêm sau phần tử q


Xóa đầu

Xóa cuối

Xóa sau phần tử q

Xóa với giá trị X cho trước

Duyệt danh sách
38
Ôn tập tốt nghiệp
Danh sách liên kết
Định nghĩa cấu trúc dữ liệu của danh sách liên kết đơn được mô tả
như sau:
typedef struct Node{
int Key;
Node *pNext;
};
Trong đó khai báo Node *pNext dùng để mô tả:
39
A. Con trỏ trỏ tới phần dữ liệu
B. Vùng liên kết quản lý địa chỉ phần tử kế tiếp
C. Con trỏ trỏ tới địa chỉ vùng nhớ của phần tử trước đó
D. Con trỏ trỏ tới địa chỉ vùng nhớ của phần tử đầu tiên
Ôn tập tốt nghiệp
Danh sách liên kết
Cho danh sách liên kết đơn L gồm các phần tử sau:
5 6 -3 7 8 0 2
Cho biết kết quả của hàm sau:

int Dem(List L){
int t=0;
Node *p=L.pHead;
while(p != L.pTail){
if(p->Info > 0) t++;
p=p->pNext;
}
return t;
}
40
A. 5
B. 6
C. 7
D. 8
Ôn tập tốt nghiệp
Danh sách liên kết
Cho danh sách liên kết đơn L gồm các phần tử sau:
5 6 -3 7 8 0 2
Cho biết kết quả của hàm sau:
int Sumary(List L){
Node *p; int strong=0;
p=L.pHead;
while(p!=NULL)
strong = strong + p->Info;
return strong;
}
41
A. 5
B. 0
C. 25

D. 8
Ôn tập tốt nghiệp
Danh sách liên kết
Hàm ProcessElement thực hiện công việc gì?
void ProcessElement(List &L, Node *p){
if(L.pHead == NULL){
L.pHead = p;
L.pTail = p;
}
else{
L.pTail->pNext = p;
L.pTail = p;
}
}
42
A. Thêm phần tử p vào đầu danh sách
B. Thêm phần tử p vào cuối danh sách
C. Xóa phần tử p khỏi danh sách
D. Xóa phần tử cuối danh sách
Ôn tập tốt nghiệp
Danh sách liên kết
Cho hàm sau:
Node *Function(List L, int k){
Node *p=L.pHead;
while(p!=NULL){
if(p->data == k)
break;
p=p->pNext;
}
return p;

}
Tìm mô tả chính xác cho hàm trên?
43
A. Hàm luôn trả về con trỏ NULL
B. Hàm trả về địa chỉ của nút đầu tiên trong danh sách được tìm thấy, ngược lại hàm
trả về con trỏ NULL
C. Hàm luôn trả về địa chỉ của nút đầu tiên trong danh sách được tìm thấy
D. Hàm luôn trả về con trỏ nút tìm thấy
Ôn tập tốt nghiệp
Danh sách liên kết
Đoạn mã sau để thêm phần tử vào đầu danh sách liên kết trỏ bởi varFirst:
if(isEmpty()){
varFirst=new ListNode(element);
varFirst->data = element;
}
else{
ListNode temp=new ListNode();
temp->data=element;
temp->next=_________;
}
Xác định phần tử còn thiếu:
44
A. element
B. temp
C. varFirst
D. ListNode
Ôn tập tốt nghiệp
Danh sách liên kết
Đoạn mã sau dùng để tạo danh sách liên kết đơn gồm 2 phần tử có giá trị 18 và 32. Dòng
l

ệnh nào sau đây sẽ được bổ sung vào vị trí còn thiếu của đoạn mã?
struct NodeType{
int data;
NodeType *next;
};
void main(){
NodeType *p;
NodeType *q;
p=new NodeType;
p->data=18;
q=new NodeType;
q->data=32;
________________
q->next=NULL;
}
45
A. q=p->next;
B. p->next=q;
C. p->next=q->next;
D. p=q;
Ôn tập tốt nghiệp
Nội dung

Danh sách liên kết

Ngăn xếp (Stack), Hàng đợi (Queue)
46




Ôn tập tốt nghiệp
Ngăn xếp (stack), Hàng đợi (queue)

Định nghĩa cấu trúc Node trong stack, queue

Cách thức hoạt động của stack, queue
47
Ôn tập tốt nghiệp
Ngăn xếp (Stack) thường được gọi là cấu trúc dạng?
48
A. IFOF
B. FILO
C. LIFO
D. ILFO
Ngăn xếp (stack), Hàng đợi (queue)
Ôn tập tốt nghiệp
Thực hiện đoạn chương trình sau với hàm Push và Pop của Stack s:
IntStack s = new IntStrack();
Push(s,1);
Push(s,2);
Pop(s);
Push(s,3);
Push(s,2);
Pop(s);
Push(s,2);
printf("%d",Pop(s));
Kết quả in ra sẽ là:
49
A. 2
B. 1

C. 3
D. Lỗi do stack rỗng
Ngăn xếp (stack), Hàng đợi (queue)
Ôn tập tốt nghiệp
Thêm các ký tự A,B,C,D,E vào hàng đợi Q (theo thứ tự A,B,…),
sau đó xóa khỏi Q. Các ký tự lần lượt được xóa khỏi Q là?
50
A. C B D A E
B. A B C D E
C. E D C B A
D. E A D B C
Ngăn xếp (stack), Hàng đợi (queue)

×