Kiểu dữ liệu set C++
Ở phần 2, bọn mình đã ôn lại những cấu trúc dữ liệu rất cơ bản như Array, LinkedList, Stack and Queue rồi. Ở phần này, tụi mình sẽ tìm hiểu thêm về các cấu trúc dữ liệu hay ho nhưng ít dùng hơn như HashTable, Set, Graph và Tree! Show Mình sẽ giải thích sơ về độ phức tạp, ứng dụng của chúng, cũng như những bài toán các bạn hay gặp với các cấu trúc dữ liệu này nhé.
Đây là phần 3 trong series bài viết 3 phần:
HashTable (Bảng băm) – CTDL bá đạo diệu kìĐộ phức tạp Độ phức tạp O(1) tạo nên sự bá đạo của HashTable. Nguồn bigocheatsheet.comKhi đưa 1 phần tử vào HashTable, ta phải chỉ định 1 key (ví dụ lưu sinh viên thì key là mã số sinh viên). Khi cần truy cập 1 phần tử từ HashTable dựa theo key, độ phức tạp của việc tìm 1 phần tử là O(1). Đây là thứ tạo nên sự bá đạo của HashTable. Khi lưu 1 phần tử vào HashTable, ta sẽ đưa key vào hash function (hàm băm). Hash function này sẽ tính ra một index để lưu phần tử đó vào. Khi cần tìm phần tử đó, ta cũng dựa vào key để tính ra index. Dù hashtable có 1000 hay 1 triệu phần tử thì hàm băm cũng chỉ chạy 1 lần, khi đã có index thì thời gian truy cập chỉ là O(1). Độ phức tạp (nâng cao) Do vậy, nếu để ý, các bạn sẽ thấy worse case vẫn là O(n), nếu toàn bộ phần tử của hashtable được lưu hết vào chung 1 bucket. Trên thực tế, việc implement hashtable khá phức tạp (thuật toán hash ra sao, làm sao để các phần tử phân bố cân bằng vào bucket). Nhiều nơi tuyển senior họ sẽ hỏi sâu hơn, các bạn nên tìm hiểu thêm nhé! (Ông bạn mình đi PV tại ByteDance – TikTok bị hỏi luôn). Các phần tử được lưu vào nhiều bucket, dựa theo index từ hash functionỨng dụng Các ngôn ngữ phổ biến như Java, C# đều có class Hashtable (hoặc tên khác là HashMap, Dictionary). JavaScript thì gần đây mới có Map, trước toàn phải dùng object. Một số bài toán hay gặp
Set – Nơi các phần tử không đụng hàngSet là một tập hợp chức nhiều phần tử không theo thứ tự, mà mỗi phần tử trong đó không được trùng nhau. Độ phức tạp và ứng dụng Set thật ra không phải là một cấu trúc dữ liệu, mà nó chỉ là abstract data type. Có rất nhiều cách để implement 1 set như dùng HashYable, Linked List, Tree v…v, mỗi cách sẽ có độ phức tạp riêng. Do đặc tính lưu các phần tử không trùng nhau của mình, set thường được dùng để lưu trữ các IP/các trang web đã truy cập. Do tìm kiếm 1 phần tử trong Set chỉ có độ phức tạp O(n) nên ta có thể dùng để blacklist/whitelist IP dựa theo danh sách có sẵn luôn. Một số bài toán hay gặp
Graph – Đồ thị không kì dịĐồ thị là một cấu trúc dữ liệu khá phức tạp, nhiều nơi tách hẳn ra 1 môn môn “Lý thuyết đồ thị” luôn! Nói đơn giản, một đồ thị là một tập hợp gồm nhiều điểm (vertical), các điểm này nối với nhau bằng các cạnh (edge). Ứng dụng Tuy vậy, ở những mảng khác, đồ thị được dùng để giải quyết rất rất nhiều vấn đề hay ho:
Một số bài toán hay gặp
Tree – Cây gì không lá không quả, nhưng vẫn hữu dụngTree (Cây) cũng là một dạng đồ thị:
Tree có 2 biến thể phổ biến và được dùng nhiều nhất:
Ngoài ra, Tree cũng còn có khá nhiều biến thể như Trie, Red-Black Tree,… mình cũng chỉ nghe nói chứ chưa dùng bao giờ. Tree có rất nhiều biến thểỨng dụng
Cá nhân mình đi làm cũng không cần phải implement Tree. Tuy vậy, trong quá trình phỏng vấn thì gặp những câu hỏi bắt sử dụng Tree khá nhiều. Do vậy các bạn cũng nên ôn nhé! Một số bài toán hay gặp
Tạm kếtSau 3 phần của series này, các bạn đã ôn lại được kha khá kiến thức về các cấu trúc dữ liệu hay dùng rồi đấy! Có thể bạn sẽ không áp dụng 100% số đó trong công việc, nhưng chúng sẽ rất hữu ích khi bạn đi phỏng vấn, hoặc cần optimize một số đoạn code. Đấy là mới chỉ nói về cấu trúc dữ liệu, còn về thuật toán thì còn bao la hơn nữa (qui hoạch động, chia để trị, tham lam, quay lui ….). Nếu quan tâm thì bạn cứ để lại comment, nếu có nhiều bạn quan tâm thì mình sẽ làm tiếp về tụi nó nhé. |