1.Hãy nêu vai trò tổ chưc dữ lieu trong máy tính. Bộ nhớ máy vi tính chưa bộ mã nào, Các hệ cơ số đếm trong máy tính, Cách chuyển đổi cơ số trong máy tính sang cơ số thập phân.2, Hãy nêu mối lien hệ cấu truc dữ liệu và giải thuật trong Công nghệ lập trình. Vai trò chương trình của máy tính đóng vai trò gì trong xử lý thong tin.3. Hãy đưa các khái niêm các kiểu dữ liệu trong cấu truc dữ liệu máy tính.4. Anh (Chị) hiểu thế nào kiểu dữ liệu tĩnh và dộng (Cho Ví dụ) chi tiết từng loại bằng C++7.Nêu các ví dụ nguyên tắc cài đặt hàm tìm kiếm bằng mã giả đê thực hiện tìm kiếm theo thuật toán tuyến tính.8. Nêu các ví dụ nguyên tắc cài đặt hàm tìm kiếm bằng mã giả đê thực hiện tìm kiếm theo thuật toán nhị phân.(Binary Search)9. Hãy nêu 5 giải thuật sắp xếp căn bản, nêu ý tưởng của từng loại. Cho ví dụ ít nhất hai giải thuật (Viết bằng NN C++)10. Hãy nêu độ phức tạp của 5 loại thuật toán sắp xếp căn bản, theo Anh (Chị) loại nào có tốc đọ tìm kiếm nhanh nhất, loại nào chậm nhất.
Trang 1CÁC VẤN ĐỀ CẦN QUAN TÂM CÂU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
1.Hãy nêu vai trò tổ chưc dữ lieu trong máy tính Bộ nhớ máy vi tính chưa bộ mã nào, Các hệ cơ số đếm trong máy tính, Cách chuyển đổi cơ số trong máy tính sang cơ số thập phân.
Vai trò tổ chức dữ liệu trong máy tính: Nhằm mục đích khai thác hiệu quả các dữ liệu trong máy tính
Bộ nhớ máy tính chứa bộ mã:
Các hệ cơ số đếm trong máy tính: Hệ nhị phân (cơ số 2), hệ thập phân (cơ số 10), hệ thập lục phân (cơ số 16)
Cách chuyển đổi cơ số trong máy tính sang cơ số thập phân:
Bảng quy tắc: binary (nhị phân), hex (thập lục phân), decimal (thập phân)
Trang 2- Chuyển từ nhị phân sang thập phân:
- Chuyển từ thập lục phân sang thập phân:
Để chuyển đổi từ hex sang decimal đầu tiên ta chuyển hex sang binary, sau đó lại từ binary
ta chuyển về decimal
Lấy số FEED làm ví dụ:
Từ hex sang binary:
FEED (hex) = 1111 1110 1110 1101 (binary)
Từ binary sang decimal:
1*(2^15) + 1*(2^14) + 1*(2^13) + 1*(2^12) + 1*(2^11) + 1*(2^10) +1*(2^9) + 0*(2^8) + 1*(2^7) +1*(2^6) +1*(2^5) + 0*(2^4) +1*(2^3) +1*(2^2) + 0*(2^1) + 1*(2^0) = 65261Như vậy:
FEED (hex) = 1111111011101101 (binary) = 65261 (decimal)
Cách 2:
Tính luôn FEED= (15x16^3)+(14x16^2)+(14x16^1)+(13x16^0)=(15x4096)+
(14x256)+(14x16)+(13x1)=61440+3584+224+13=65261
Trang 32, Hãy nêu mối lien hệ cấu truc dữ liệu và giải thuật trong Công nghệ lập trình Vai trò chương trình của máy tính đóng vai trò gì trong xử lý thong tin.
Mối liên hệ: Các cấu trúc dữ liệu và các giải thuật được xem như là 2 yếu tố quan trọng nhất trong lập trình, đúng như câu nói nổi tiếng của Niklaus Wirth: Chương trình = Cấu trúc dữ liệu + Giải thuật (Programs = Data Structures + Algorithms)
Vai trò chương trình của máy tính trong xử lý thông tin: Chương trình máy tính giúp ta
xử lý thông tin một cách nhanh hơn, chính xác hơn, tiết kiệm được nhân lực Xử lý các bài toán lớn một cách dễ dàng hơn
3 Hãy đưa các khái niêm các kiểu dữ liệu trong cấu truc dữ liệu máy tính.
- Tên loại dữ liệu (Cho Ví dụ)
- Miền giá trị dữ liệu (Cho Ví dụ)
- Kích cỡ lưu trữ
- Tập các lệnh thao tác dữ liệu (Cho Ví dụ)
Nhiều ngôn ngữ định nghĩa sẵn các kiểu dữ liệu thông dụng như:
integer: rất thông dụng, được dùng để biểu diễn các số nguyên
char: biểu diễn các ký tự đơn lẻ
string: biểu diễn chuỗi các kí tự, hay còn gọi là chuỗi, để tạo thành câu hay cụm từ
Ví dụ: trong C++, kiểu integer thông dụng có tên là int và chiếm 2 byte; kiểu string là một dãycác char, với kí tự NULL hoặc '/0' ở vị trí chuỗi kết thúc – dãy có thể dài hơn chuỗi nó lưu trữ
Trang 4• Được gắn kết với một con trỏ (tại
thời điểm biên dịch chưa có).
• Phát sinh lúc thực thi
• Không xác định giá trị ban đầu
• Được giải phóng khỏi bộ nhớ khi cần
Trang 65 Hãy liệt kê các loại dữ liệu dung trong C++ (Cho Ví dụ)
-Các kiểu dữ liệu trong C++:
Kiểu cơ sở :số nguyên ,số thực, kiểu logic
4 unsigned short Số nguyên dương 2 bytes
Trang 78 unsigned long Số nguyên dương 4 bytes
1 Boolean Gồm 2 giá trị: true hoặc false
hoặc: int a[] = {3, 6, 2, 10, 17};
Phát sinh ngẫu nhiên <time.h>
- Khởi tạo phát sinh ngẫu nhiên
srand((unsigned int)time(NULL));
Trang 8- Phát sinh giá trị ngẫu nhiên
Khai báo theo con trỏ
char *<Tên chuỗi>;
Trang 9unsigned char ngay;
unsigned char thang;
int nam;
};
typedef struct ttDate DATE;
Biến cấu trúc kiểu tĩnh
<tên biến>.thành phần cấu trúc
VD:
DATE d;
d.nam = 2012;
Biến cấu trúc kiểu con trỏ
<tên biến>thành phần cấu trúc
VD:
DATE *d;
dnam = 2012;
Trang 106 Nêu các giải thuật tìm kiếm(Search) trong công nghệ lập trình Cho ít nhất hai ví
dụ của các giải thuật này (Mô tả bằng C++)
Các giải thuật tìm kiếm
Có 2 giải thuật thường được áp dụng: Tìm tuyến tính và tìm nhị phân
Trang 11int Mid=(First + Last)/2;
Nguyên tắc cài đặt hàm tìm kiếm
Nếu có xuất hiện phần tử có giá trị x thì trả về vị trí tìm được
Ngược lại thì trả về -1
Giải thuật
Bước 1:
i = 1; // bắt đầu từ phần tử đầu tiên của dãy
Bước 2: So sánh a[i] với x, có 2 khả năng :
Bước 3:
Ngược lại: Lặp lại Bước 2
Trang 128 Nêu các ví dụ nguyên tắc cài đặt hàm tìm kiếm bằng mã giả đê thực hiện tìm kiếm theo thuật toán nhị phân.(Binary Search)
mid = (left+right)/2; // lấy mốc so sánh
So sánh a[mid] với x, có 3 khả năng :
a[mid] = x: Tìm thấy Dừng
a[mid] > x: //tìm tiếp x trong dãy con aleft amid -1,right =mid - 1;
a[mid] < x: //tìm tiếp x trong dãy con amid +1 aright,,left = mid + 1;
Các giải thuật sắp xếp cơ bản
Đổi chổ trực tiếp – Interchange Sort
Chọn trực tiếp – Selection Sort
Chèn trực tiếp – Insertion Sort
Nổi bọt – Bubble Sort
Quick Sort
Trang 13Ý Tưởng
Đổi chổ trực tiếp – interchange sort
-giải thuật là 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úngbằng cách đổi chỗ phần tử này với phần tử tương ứng trong cặp nghịch thế Lặp lại xử lýtrên với các phần tử tiếp theo trong dãy
Giải thuật
Bước 1 : i = 1;// bắt đầu từ đầu dãy
Bước 2 : j = i+1;//tìm các phần tử a[j] < a[i], j>i
Bước 3 :
Trong khi j <= N thực hiện
Nếu a[j]<a[i]: Hoán vị a[i], a[j];
j = j+1;
Bước 4 : i = i+1;
Nếu i < N: Lặp lại Bước 2
Ngược lại: Dừng
Chọn trực tiếp – Selection Sort
-Chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu dãyhiện hành; lúc này dãy hiện hành chỉ còn N-1 phần tử cần sắp xếp, bắt đầu từ vị trí thứ 2; lặplại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử
Giải thuật
Bước 1: i = 1;
Bước 2: Tìm phần tử a[vtmin] nhỏ nhất trong dãy hiện hành từ a[i] đến a[N]
Bước 3: Hoán vị a[vtmin] và a[i]
Bước 4:
i = i+1
Trang 14Nếu i < N thì lặp lại Bước 2 Ngược lại: Dừng.
Nổi bọt – Bubble Sort
Xuất phát từ cuối dãy, đổi chỗ các cặp phần tử kế cận để đưa phần tử nhỏ hơn trong cặp phần
tử đó về vị trí đúng đầu dãy hiện hành, sau đó sẽ không xét đến nó ở bước tiếp theo, do vậy ởlần xử lý thứ i sẽ có vị trí đầu dãy là i Lặp lại xử lý trên cho đến khi không còn cặp phần tửnào để xét
Giải thuật
Bước 1: i = 1;
Bước 2: j = N;
Trong khi (j > i) thực hiện:
Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]
j = j-1;
Bước 3: i = i+1;
Nếu i >N-1: Hết dãy Dừng
Ngược lại: Lặp lại Bước 2
Chèn trực tiếp – Insertion Sort
Cho dãy ban đầu a 1 , a 2 , ,a n , ta có thể xem như đã có đoạn gồm một phần tử a 1 đã được sắp,
sau đó thêm a 2 vào đoạn a 1 sẽ có đoạn a 1 a 2 được sắp; tiếp tục thêm a 3 vào đoạn a 1 a 2 để có đoạn
a 1 a 2 a 3 được sắp; tiếp tục cho đến khi thêm xong a N vào đoạn a 1 a 2 a N-1 sẽ có dãy a 1 a 2 a N
được sắp
Giải thuật
Bước 1: i = 2; // giả sử có đoạn a[1]đã được sắp
Trang 15Bước 2: x = a[i];
Tìm vị trí pos thích hợp trong đoạn [1 i-1] để chèn a[i] vào
Bước 3: Dời chỗ các phần tử từ pos đến i-1 sang phải 1 vị trí để dành chỗ cho a[i]
Bước 4: a[pos] = x; // có đoạn a[1] a[i] đã được sắp
Cách “chia”: ½ dãy bên trái chứa các giá trị nhỏ hơn ½ dãy bên phải
Thực hiện việc sắp xếp trên từng dãy con (đệ qui)
Nếu (L<j) Phân hoạch dãy aL … aj
Nếu (i<R) Phân hoạch dãy ai … aR
Giải thuật phân hoạch dãy a L , a L+1 , … a R thành 2 dãy con
Bước 1.1:
Trang 16Chọn tùy ý một phần tử a[k] trong dãy, L≤k≤R
x=a[k], i=L, j=R
Bước 1.2:
Phát hiện và hiệu chỉnh cặp a[i] và a[j] nằm sai chỗ:
Bước 1.2a: Trong khi (a[i]<x) i++
Bước 1.2b: Trong khi (a[j]>x)
Bước 1.2c: Nếu (i≤j): Hoán vị a[i] và a[j]; i++,
j Bước 1.3:
Nếu i<j: Lặp lại bước 1.2
Ngược lại: Dừng phân hoạch
10 Hãy nêu độ phức tạp của 5 loại thuật toán sắp xếp căn bản, theo Anh (Chị) loại nào có tốc đọ tìm kiếm nhanh nhất, loại nào chậm nhất.
trong đó O biểu diễn độ phức tạp của thuật toán đi kèm với một giá trị n biểu diễn kích thước của số lần chạy tối đa mà thuật toán đó dựa vào để xử lý trên dữ liệu
Đổi chổ trực tiếp – interchange sort O(n2)
Chọn trực tiếp – selection sort O(n^2)
Nổi bọt – bubble sort O(n^2)
Chèn trực tiếp – insertion sort O(n^2)
Quick sort
Chi phí trung bình O(n*log 2 n)
Chi phí cho trường hợp xấu nhất O(n 2
Vì tốc độ sắp xếp có thể thay đổi rất nhiều tùy theo đặc điểm của dữ liệu, nên để các kết quả thống kê chính xác dựa trên kinh nghiệm đòi hỏi việc chạy các thuật toán nhiều lần trên các dữ liệu khác nhau và tính trung bình Thông thường tập dữ liệu kiểm tra được tạo ngẫu nhiên.quick sort có lẽ là thuật toán nhanh nhất, nhưng nếu sử dụng nó để sắp xếp một tập 20 phần tử thì cũng giống như vác đại bác ra bắn ruồi
Trang 17Tùy vào bài toán nhưng nhìn chung thì Bubble sort là giải pháp cực kì không hiệu quả
11 Hãy đưa ra khái niệm danh sách lien kết đơn, nêu cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn.
Khái niệm
Danh sách liên kết đơn: gồm một chuỗi các phần tử (node) Trong đó mỗi phần tử chứa dữ liệu
và địa chỉ để liên kết đến phần tử tiếp theo Các phần tử kết dính với nhau bằng “sợi dây liênkết”
Tổ chức dữ liệu động
Biến động
<kiểu dữ liệu> *tên biến;
Vd: int *a; float *y;
Chứa địa chỉ của một đối tượng dữ liệu
Được cấp phát hoặc giải phóng bộ nhớ tùy thuộc vào người lập trình
Kích thước có thể thay đổi
Trang 18Trước khi tạo lập Sau khi tạo lập
void CreateEmptyList(LIST &list)
30
Trang 19TH danh sách đã có phần tử
Có 2 TH thêm pNew vào danh sách :
+Thêm vào đầu danh sách
l
pTai l pHead
pTai l pHead
Trang 20+Thêm vào cuối danh sách
Chèn node vào DSLK đơn
Chèn vào sau node p
Trang 21 Chèn vào trước node p
+Cách 1
pPre
+
Cách 2:
Bước 1 Chèn pNew vào sau p
Bước 2 Hoán vị giá trị pNew và p
List
pTai l pHead
pNew
p
List
pTai l pHead
Trang 22Xóa một nút trong danh sách
Xóa nút đầu của danh sách Ảnh hưởng pHead
Xóa nút cuối của danh sách Ảnh hưởng pTail
NODE *pDel = list.pTail
NODE *pPrev = “Tìm node trước pTail
List
Cần xóa
pTai l
Trang 23Cần xóa
pTai l pHead
Trang 24LƯU ĐỒ THUẬT TOÁNViết lưu đồ chương trình cho phép nhập vào một số nguyên dương N In ra màn mình cho biết số đảo ngược của số N ( Ví dụ: N=12345 sẽ có số đảo là 54321 )
KẾT THÚC
Xuất sdn
Trang 26Kiểm tra mảng đã cho có đối xứng không
Mảng không đối xứng
Trang 27In ra tổng bình phương các phần tử mà giá trị của nó là số nguyên tố
Trang 28Xuất ra mảng con tăng có chiều dài lớn nhất.
Trang 29Kiểm tra mảng đã cho có phải là một mảng tăng dần hay không
Trang 31Viết hàm tính tổng các phần tử mà giá trị của nó là số nguyên tố
Trang 32Bắt đầu
j=0
j*17<=14 0
k=0
k*40<=14 0
Viết lưu đồ cho Chương trình sau: Trong kho có một số hàng cùng loại đựng trong các hộp
có khối lượng 16kg, 17kg và 40 kg Hãy viết lưu đồ chương trình, khi biết người giữ kho có thể xuất 140 kg hàng mà không cần tháo dỡ một hộp nào không ?
- Kết quả sau khi chạy sẽ là:
+ 2 hộp 16kg
+ 4 hộp 17kg
+ 1 hộp 40kg