Bài giảng Cấu trúc dữ liệu và giải thuật: Vector - Nguyễn Mạnh Hiển (HKI năm 2020-2021)

22 291 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Vector - Nguyễn Mạnh Hiển (HKI năm 2020-2021)

Đ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

Bài giảng Cấu trúc dữ liệu và giải thuật: Vector cung cấp cho người học các kiến thức: Cấu trúc dữ liệu là gì, vector, chèn phần tử, xóa phần tử, thời gian chạy. Mời các bạn cùng tham khảo nội dung chi tiết.

Vector Nguyễn Mạnh Hiển hiennm@tlu.edu.vn Nội dung Cấu trúc liệu gì? Vector Chèn phần tử Xóa phần tử Thời gian chạy Cấu trúc liệu gì? Cấu trúc liệu • Là cách tổ chức liệu nhớ máy tính cho thao tác xử lý liệu (tìm, chèn, xóa…) hiệu (nhanh hơn, tốn nhớ hơn) • Ví dụ cấu trúc liệu: − Vector − Danh sách liên kết − Ngăn xếp/Hàng đợi − Cây − Bảng băm Cài đặt cấu trúc liệu Mỗi cấu trúc liệu cài đặt lớp C++: template // T kiểu phần tử class tên-cấu-trúc-dữ-liệu { public: Hàm tạo (constructor); Hàm hủy (destructor); Các thao tác xử lý; // Bên gọi private: Các trường liệu; // Chỉ dùng nội Các thao tác trợ giúp; // Chỉ dùng nội }; Vector Vector • Quản lý dãy phần tử: − nằm liên tục nhớ (như mảng chiều); − kích thước thay đổi (trong kích thước mảng cố định sau khai báo) • Các thao tác chính: − Chèn xóa phần tử cuối vector − Chèn xóa phần tử vector (bao gồm đầu vector) − Lấy kích thước vector − Truy nhập phần tử dùng số Cài đặt vector Chú ý: Lớp vector thư viện chuẩn C++ dùng chữ “v” thường template size class Vector { public: capacity Hàm tạo hàm hủy; array Toán tử gán; Lấy kích thước vector; Truy nhập phần tử dùng số; Các thao tác chèn xóa; private: int size; // Kích thước vector (số phần tử) int capacity; // Dung lượng vector (sức chứa) T * array; // Con trỏ tới mảng chứa phần tử Các thao tác trợ giúp; }; Hàm tạo hàm hủy // initCapacity dung lượng ban đầu vector // có giá trị ngầm định 16 Vector(int initCapacity = 16) { size = 0; // Ban đầu chưa có phần tử capacity = initCapacity; // Khởi tạo dung lượng array = new T[capacity]; // Tạo mảng chứa phần tử } ~Vector() { delete[] array; // Xóa mảng (giải phóng nhớ) } Tốn tử gán // rhs (right-hand side) vector vế phải phép gán // this trỏ tới vector hành, tức vế trái Vector & operator=(Vector & rhs) { if (this != &rhs) { // Ngăn cản tự chép size = rhs.size; // Đặt kích thước capacity = rhs.capacity; // Đặt dung lượng delete[] array; // Xóa mảng array = new T[capacity]; // Tạo mảng có chiều dài // Sao chép phần tử từ vế phải sang vế trái for (int i = 0; i < size; i++) array[i] = rhs.array[i]; } return *this; } this rhs vector vế trái = vector vế phải Kích thước vector truy nhập phần tử // Lấy kích thước vector (số phần tử có) int getSize() { return size; } // Kiểm tra vector có rỗng hay không Nếu rỗng, trả // true; có phần tử, trả false bool isEmpty() { return (size == 0); } // Truy nhập phần tử thơng qua số index T & operator[](int index) { return array[index]; } Chèn phần tử Tăng dung lượng vector // Đây thao tác trợ giúp cho thao tác chèn // newCapacity dung lượng (phải lớn kích thước) void expand(int newCapacity) { if (newCapacity pos; i ) array[i] = array[i – 1]; pos = // Đặt phần tử vào vị trí chèn array[pos] = newElement; // Cập nhật kích thước size++; array phải dịch 8, 9, 2, sang phải } size Xóa phần tử Xóa phần tử cuối vector // Xóa phần tử void popBack() size ; // // } cuối vector { Giảm kích thước đơn vị nghĩa “quên” phần tử cuối // Xóa tất phần tử void clear() { size = 0; // Đặt kích thước nghĩa // “quên” tất phần tử } Xóa phần tử vector // pos (position) vị trí phần tử cần xóa void erase(int pos) { // Dịch phần tử nằm sau vị trí xóa sang trái để // lấp đầy chỗ trống để lại việc xóa for (int i = pos; i < size - 1; i++) array[i] = array[i + 1]; // Cập nhật kích thước size ; pos = array } phải dịch 9, 2, sang trái size 5 Thời gian chạy Phân tích thời gian chạy • • • • • • Hàm tạo, hàm hủy: O(1) Toán tử gán (operator=): O(n)  phải chép n phần tử getSize, isEmpty, operator[]: O(1) expand: O(n)  phải chép n phần tử pushBack: O(1) insert: O(n)  phải dịch n phần tử sang phải trường hợp tồi (chèn vào đầu vector) • popBack: O(1) • clear: O(1) • erase: O(n)  phải dịch n - phần tử sang trái trường hợp tồi (xóa phần tử đầu tiên) Bài tập Xét vector có kích thước s1 dung lượng c1, s1  c1 Nêu bước phải thực để tăng dung lượng vector từ c1 lên c2, c1 < c2 Sau tăng dung lượng kích thước vector bao nhiêu? Xét vector chứa phần tử sau: { 6, 5, 8, 2, 9, } Giả thiết vector chưa đầy vị trí phần tử tính từ Nêu bước phải thực để chèn giá trị X vào vị trí vector Bài tập Xét vector chứa phần tử sau: { 8, 1, 9, 3, 4, } Nêu bước phải thực để xóa phần tử vị trí vector (vị trí tính từ 0) Hỏi chèn/xóa đầu vector chèn/xóa cuối vector thao tác chạy nhanh hơn? Vì sao? Giả sử ta phải bổ sung thao tác truncate vào vector nhằm cắt bỏ phần dung lượng dư thừa Hãy đề xuất bước cụ thể để thực thao tác truncate ...Nội dung Cấu trúc liệu gì? Vector Chèn phần tử Xóa phần tử Thời gian chạy Cấu trúc liệu gì? Cấu trúc liệu • Là cách tổ chức liệu nhớ máy tính cho thao tác xử lý liệu (tìm, chèn, xóa…)... dụ cấu trúc liệu: − Vector − Danh sách liên kết − Ngăn xếp/Hàng đợi − Cây − Bảng băm Cài đặt cấu trúc liệu Mỗi cấu trúc liệu cài đặt lớp C++: template // T kiểu phần tử class tên -cấu- trúc- d? ?- liệu. .. tên -cấu- trúc- d? ?- liệu { public: Hàm tạo (constructor); Hàm hủy (destructor); Các thao tác xử lý; // Bên gọi private: Các trường liệu; // Chỉ dùng nội Các thao tác trợ giúp; // Chỉ dùng nội }; Vector

Ngày đăng: 05/11/2020, 18:12

Tài liệu cùng người dùng

Tài liệu liên quan