Bài giảng Cấu trúc dữ liệu và giải thuật - Các cấu trúc dữ liệu cơ bản trình bày những nội dung chính sau: Các khái niệm cơ bản, mảng và mảng động, con trỏ và cấu trúc liên kết, danh sách tuyến tính. Mời các bạn tham khảo.
REVIEW • Dùng định lý thợ để đưa tiệm cận chặt cho công thức đệ quy sau a) 𝑇 𝑛 = 3𝑇 b) 𝑇 𝑛 = 5𝑇 𝑛 𝑛 +𝑛 + 𝑛2 Chapter Các cấu trúc liệu Nội dung • Các khái niệm • Mảng mảng động • Con trỏ cấu trúc liên kết • Danh sách tuyến tính 2.1 CÁC KHÁI NIỆM CƠ BẢN 2.1 Khái niệm • Xử lý liệu máy tính xét cho xử lý với bit • Một kiểu liệu (data type): tập giá trị nhóm phép tốn thực giá trị • Chỉ cách sử dụng nhóm bit phép tốn thực nhóm bit • VD Kiểu số ngun char số bit : bit phép toán +, -, *, /, % Khái niệm • Các kiểu liệu dựng sẵn (Built-in data types): xây dựng sẵn ngơn ngữ lập trình Type Macintosh Metrowerks CW (Default) Linux on a PC IBM PC Windows XP Windows NT ANSI C Minimum char 8 8 int 32 32 32 16 short 16 16 16 16 long 32 32 32 32 long long 64 64 64 64 Ngơn ngữ lập trình C Khái niệm • Chuẩn IEEE754/85: Type Dấu (sign) Mũ Độ lệch mũ (Exponent) (Exponent Bias) Tổng cộng (bit) Giá trị (fraction) Half (IEEE 754-2008) 15 10 16 Single 127 23 32 Double 11 1023 52 64 Quad 15 16383 112 128 v (1) sign 2 exponent exponent bias (1 fraction) Khái niệm • Kiểu liệu trừu tượng (Abstract DataType - ADT) gồm: • Tập giá trị • Tập phép tốn thực giá trị • Cách biểu diễn cụ thể bị bỏ qua xét đến ADT • Làm trừu tượng hóa kiểu liệu, khơng phụ thuộc ngơn ngữ lập trình cụ thể • Cài đặt ADT biểu diễn ADT ngơn ngữ lập trình cụ thể • Xét đến biểu diễn cụ thể cho ADT • Các kiểu liệu dựng sẵn cài đặt ADT tương ứng ngơn ngữ lập trình cụ thể Khái niệm • Cấu trúc liệu (data structure): Gồm kiểu liệu cách liên kết chúng • Cấu trúc liệu mơ tả cách tổ chức lưu trữ liệu máy tính để sử dụng cách hiệu • Hai vấn đề cấu trúc liệu: • Các thao tác mà hỗ trợ, • Cách cài đặt thao tác Khái niệm • Thay đổi cấu trúc liệu khơng làm thay đổi tính xác chương trình Tuy nhiên làm thay đổi hiệu chương trình • Tốt nên chọn cấu trúc liệu cho hiệu cao từ thiết kế chương trình! Danh sách tuyến tính • Danh sách tuyến tính (linear list) tập hợp đối tượng có kiểu, gọi phần tử Các phần tử danh sách tn theo thứ tự tuyến tính • VD Danh sách sinh viên theo thứ tự tên • Các phép tốn • • • • • Chèn thêm phần tử Xóa phần tử Tìm kiếm Kiểm tra rỗng … • Cài đặt danh sách tuyến tính • Dùng mảng • Cấu trúc liên kết Danh sách tuyến tính • Cài đặt dùng mảng: sử dụng mảng chiều • Tìm kiếm dễ dàng (tuần tự tìm kiếm nhị phân) • Duyệt phần tử dễ dàng sử dụng số: • Chèn xóa KHƠNG dễ dàng • Số lượng phần tử biến động => Phải khai báo số lượng phẩn tử tối đa dùng mảng động Danh sách tuyến tính • Chèn thêm phần tử vào danh sách: • Dịch chuyển phần tử đứng sau từ vị trí cần thêm xuống vị trí • Thêm phần tử vào • Tăng số lượng phần tử thêm • Trung bình cần 𝑛/2 dịch chuyển thêm • Thời gian thực Ο 𝑛 123 125 135 155 i i+1 161 166 167 168 169 n 177 n+1 178 165 Danh sách tuyến tính • Xóa phần tử khỏi danh sách: • Chuyển phần tử đứng sau lên trước vị trí • Giảm số lượng phần tử 123 125 135 • Trung bình cần 𝑛/2 dịch chuyển xóa phần tử • Thời gian thực Ο 𝑛 155 i 161 i+1 166 167 168 n-1 n 169 177 178 Danh sách tuyến tính • Cài đặt danh sách tuyến tính dùng mảng: • Ưu điểm: • Thời gian truy cập phần tử nhanh Ο(1) • Tìm kiếm phần tử nhanh (tìm kiếm nhị phân) • Nhược điểm: • Chèn xóa phần tử nhiều thời gian (trung bình Ο(𝑛)) • Cần phải biết trước số lượng phần tử tối đa danh sách lãng phí nhớ cho phần tử chưa dùng đến mảng Danh sách tuyến tính • Cài đặt dùng cấu trúc liên kết: danh sách liên kết đơn (singly linked list ) typedef struct list { node DATA_TYPE item; A struct list *pNext; } LIST; next data pHead A B C NULL Cài đặt dùng danh sách liên kết • Tìm kiếm: tìm kiếm phần tử x danh sách Phương pháp: duyệt phần tử danh sách so sánh với x Thực vòng lặp đệ quy LIST *search_list(LIST *l, DATA_TYPE x) { if (l == NULL) return(NULL); if (l->item == x) return(l); else return( search_list(l->next, x) ); } • Giống tìm kiếm danh sách liên kết đơn Cài đặt dùng danh sách liên kết • Chèn vào giữa: thêm phần tử vào danh sách Current A B C Cấp phát nhớ để lưu trữ phần tử Cho trỏ phần tử trỏ vào phần tử sau Cho trỏ phần tử trỏ vào phần tử Cài đặt dùng danh sách liên kết void insert_list(LIST *&Current, DATA_TYPE x) { LIST *p; /* temporary pointer */ p = (LIST*)malloc( sizeof(LIST) ); p->item = x; p->pNext = Current->pNext; Current->pNext = p; } Cài đặt dùng danh sách liên kết • Chèn vào đầu danh sách insert_list (Head, x) pHead A B C Cấp phát nhớ để lưu trữ phần tử Cho trỏ phần tử trỏ vào phần tử đầu Cho pHead trỏ vào phần tử Cài đặt dùng danh sách liên kết • Chèn vào cuối danh sách insert_list (Last, x) Last A NULL C Cấp phát nhớ để lưu trữ phần tử Cho trỏ phần tử trỏ vào NULL Cho trỏ phần tử cuối trỏ vào phần tử Cài đặt dùng danh sách liên kết • Xóa: xóa phần tử khỏi danh sách • Phương pháp giống với xóa phần tử danh sách liên kết đơn • Kiểm tra danh sách rỗng: kiểm tra xem danh sách có chứa phần tử hay khơng bool isEmpty(LIST *Head) { if(Head==NULL) return true; return false; } Cài đặt dùng danh sách liên kết • Cài đặt danh sách tuyến tính dùng danh sách liên kết: • Ưu điểm: • Chèn xóa nhanh cần thao tác với vài trỏ • Khơng cần biết trước số lượng phần tử danh sách, cần lưu trữ phần tử cấp phát nhớ (danh sách đầy nhớ máy hết) • Nhược điểm: • Không cho phép truy nhập trực tiếp phần tử • Theo tác tìm kiếm nhiều thời gian (cỡ Ο(𝑛)) • Cần nhớ để lưu thêm trỏ Ứng dụng • VD1 Biểu diễn đa thức Ứng dụng • typedef struct poly{ float heSo; float soMu; struct poly *nextNode; } POLY; • Các thao tác: • • • • • • • • Nhập đa thức Hiển thị Cộng Trừ Nhân Tính giá trị đa thức Chia … ...Chapter Các cấu trúc liệu Nội dung • Các khái niệm • Mảng mảng động • Con trỏ cấu trúc liên kết • Danh sách tuyến tính 2.1 CÁC KHÁI NIỆM CƠ BẢN 2.1 Khái niệm • Xử lý liệu máy tính xét... cho ADT • Các kiểu liệu dựng sẵn cài đặt ADT tương ứng ngôn ngữ lập trình cụ thể Khái niệm • Cấu trúc liệu (data structure): Gồm kiểu liệu cách liên kết chúng • Cấu trúc liệu mô tả cách tổ chức... tả cách tổ chức lưu trữ liệu máy tính để sử dụng cách hiệu • Hai vấn đề cấu trúc liệu: • Các thao tác mà hỗ trợ, • Cách cài đặt thao tác Khái niệm • Thay đổi cấu trúc liệu khơng làm thay đổi