Tổng hợp tất cả các kiến thức về CTDLGT có trong buổi phỏng vấn Android dev của Fsoft. Ôn xong tài liệu này, bạn nhất định sẽ pass phỏng vấn FPT software. ...........................................................................................................
CẤU TRÚC DỮ LIỆU Cấu trúc liệu gì? Cấu trúc liệu cách lưu trữ, tổ chức liệu cách logic để liệu sử dụng cách hiệu Cấu trúc liệu thường với thuật toán Mỗi thuật toán phù hợp với loại cấu trúc liệu cụ thể Việc chọn ctdl phù hợp giúp tăng hiệu chương trình Cấu trúc liệu + giải thuật = chương trình Stack (ngăn xếp) Ngăn xếp (stack) hoạt động theo nguyên tắc “vào sau trước - LIFO” Ngăn xếp container chứa phần tử Có hai thao tác với ngăn xếp push pop Push thêm phần tử vào cuối ngăn xếp Pop trả phần tử cuối ngăn xếp loại bỏ khỏi ngăn xếp Ta tưởng tượng ngăn xếp chồng sách Push đặt sách lên chồng sách (chỉ đặt lên cùng), pop lấy sách khỏi chồng sách (chỉ lấy sách cùng) Hàng đợi (queue) Hàng đợi cấu trúc liệu để chứa đối tượng làm việc theo chế “vào trước trước FIFO” Một đối tượng thêm vào cuối hàng đợi lấy đầu hàng đợi Ta tưởng tượng hàng đợi (queue) việc xếp hàng mua vé xem phim Người đến sau phải đứng cuối hàng, người đến trước mua vé trước Mảng (array) - Mảng gồm tập phần tử, phần tử truy xuất sử dụng index - Mảng có kích thước cố định - Khơng thể thực thêm xóa phần tử kích thước cố định - Về chất array vùng nhớ gồm nhiều phần tử nằm liền kề - Đặc điểm: truy xuất phần tử nhanh nhờ index (độ phức tạp O(1)) Linked list - Đối với array việc thêm phần tử khơng thể ta thêm phần tử việc tạo mảng có kích thước lớn hơn, copy mảng cũ vào mảng thêm phần tử vào sau mảng cũ Nhưng việc tốn nhiều thời gian Do người ta sáng tạo Linked List - Mỗi phần tử Linked List có trỏ trỏ tới phần tử phía sau Khi muốn thêm phần tử ta việc tạo phần tử cho phần tử trỏ tới phần tử đầu danh sách Việc xóa phần tử tương tự, ta việc cho Linked List trỏ tới phần tử thứ Cả thêm xóa phần tử có độ phức tạp O(1) - Linked List nên dùng cần lưu trữ danh sách có số phần tử khơng cố định (không biết trước số lượng phần tử) - Linked List có loại là: Single-Linked List Double-linked List Phần tử Single chứa trỏ trỏ đến phần tử Phần tử Double chứa trỏ, trỏ phía trước phía sau Bảng băm (hash table) - Bảng băm dùng để lưu phần tử có dạng (key, value) - Key đưa vào hàm băm (hash function) để tạo giá trị băm (có thể gọi index) - Dựa vào giá trị băm (index), phần tử đưa vào bucket Trong hình key tên người, index số 00, 01, 02,…, giá trị số điện thoại 521-8976,… Key “John Smith” sau băm tạo giá trị băm 02, “Lisa Smith” tạo giá trị băm 01 - Khi truy xuất phần tử, ta sử dụng key Từ key ta suy index, từ index ta lấy giá trị - Tuy nhiên có trường hợp, key có giá trị băm (người ta gọi hash collision) Khi bucket chứa > phần tử ta phải duyệt qua tất phần tử bucket để tìm phần tử ứng với key Hình thể bucket chứa nhiều phần tử (1 bucket Linked List chứa phần tử) Hai key “John Smith” “Sandra Dee” tạo giá trị băm (index) 152 - Gọi n số phần tử Hashtable k số bucket Giá trị n/k nhanh đệ quy) Do cần có đủ nhớ Ví dụ dùng quy hoạch động để giải tốn: Tìm số Fibonacci thứ n Bước 1: Tìm kết sở F[1] = 1, F[2] = Bước 2: Tìm cơng thức truy hồi F[i] = F[i-1] + F[i-2] Bước 3: Tính F[n] sử dụng công thức truy hồi Giải thuật: Chia để trị Tham lam (Greedy algorithm) - Thuật toán tham lam thuật tốn ln chọn lựa chọn tối ưu cục với mong muốn tìm lựa chọn tối ưu tồn cục Tại bước, thuật tốn ln chọn lựa chọn tốt - Nhưng khơng có nhìn tổng qt nên thuật tốn khơng cho phương án tối ưu Thuật toán Greedy bao gồm thành phần chính: Một tập ứng viên mà giải pháp thực tạo Một hàm lựa chọn (selection fuction) để chọn ứng viên tốt cho giải pháp Một hàm thực thi (feasibility function) sử dụng để xác định ứng viên có đóng góp cho giải pháp thực thi Một hàm mục tiêu (objective function) dùng để xác định giá trị phương pháp phần giải pháp Một hàm giải pháp (solution function) dùng để xác định giải pháp kết thúc CÁC THUẬT TOÁN SẮP XẾP https://viblo.asia/p/cac-thuat-toan-sap-xep-co-ban-Eb85ooNO52G Thuật toán Quick sort - Chọn phần tử phần tử chốt gọi pivot - Chia mảng thành phần: phần bên trái gồm phần tử nhỏ pivot, phần bên phải gồm phần tử lớn pivot - Thực quick sort phần trái phải - Cuối ta mảng xếp là: LpR (L phần bên trái, p phần tử chốt pivot, R phần bên phải) Thuật toán Merge sort - Là kiểu thuật toán chia để trị - Đầu tiên chia đôi mảng thành dãy con: dãy bên trái dãy bên phải - Thực thuật toán mergeSort() dãy (tức xếp dãy này) - Trộn (merge) dãy xếp để thu dãy xếp Thuật toán Heap Sort - Đầu tiên đưa mảng A cần xếp dạng heap (đống): phần tử thứ i cha phần tử thứ 2*i + 2*i + - Thực hốn đổi vị trí node heap (bản chất nhị phân) cho node cha lớn node -> node gốc có giá trị lớn - Thực đưa node gốc cuối dãy - Thực vun đống với node lại Sau lần vun đống ta đưa node gốc cuối dãy Thực vun đống đến node cuối -> Khi dãy xếp theo thứ tự từ bé đến lớn CÁC THUẬT TỐN TÌM KIẾM https://maitroisang.wordpress.com/2017/10/18/cac-thuat-toan-sap-xep-va-tim-kiem/ Tìm kiếm tuyến tính - Mảng khơng cần xếp trước - Kiểm tra phần tử mảng đến tìm thấy duyệt hết phần tử mảng không tìm thấy Tìm kiếm nhị phân - Mảng xếp tăng dần - Đầu tiên so sánh phần tử cần tìm x với phần tử nằm mảng - Nếu x nhỏ nằm nửa bên trái Nếu x lớn nằm nửa bên phải - Khi xác định x nằm nửa ta lặp lại thuật tốn với nửa Như số lần kiểm tra giảm nhiều ko phải công kiểm tra phần tử thuộc nửa cịn lại Tìm kiếm nội suy - Là cải tiến thuật tốn tìm kiếm nhị phân - Thay chia đơi mảng (so sánh phần tử cần tìm với phần tử nằm mảng), thuật tốn tính phần tử theo cơng thức sau: , x phần tử cần tìm - Sử dụng cơng thức giúp thu gọn khoảng tìm kiếm ... sau: - Bài tốn lớn phân thành toán Việc phối hợp kết toán cho ta kết tốn lớn - Cần có kết sở Từ kết sở sinh kết toán lớn - Cần công thức truy hồi: công thức phối hợp kết toán để tạo kết toán lớn... quy Một hàm gọi đệ quy gọi đến Đệ quy giống búp bê Nga Bên búp bê lại chứa khác giống hệt Hoặc tưởng tượng đệ quy giống ta xem ta livestream Ta thấy ta hình, hình lại có hình khác giống hệt, Một... Do cần có đủ nhớ Ví dụ dùng quy hoạch động để giải tốn: Tìm số Fibonacci thứ n Bước 1: Tìm kết sở F[1] = 1, F[2] = Bước 2: Tìm cơng thức truy hồi F[i] = F[i-1] + F[i-2] Bước 3: Tính F[n] sử dụng