Bỏ qua

Hướng Dẫn Ghi Nhớ Lâu & Hiểu Sâu Về Đặc Tính Mảng (Arrays) + Ví Dụ Python

1. Tổng Kết Nhanh: Mảng Là Gì?

  • Mảng = dãy giá trị cùng kiểu, lưu liền nhau trong RAM.
  • Chỉ số mảng (Index) luôn bắt đầu từ 0 (phần lớn ngôn ngữ, kể cả Python).

2. Các Đặc Tính Cần Nhớ (và Cách Nhớ Lâu)

2.1. Truy xuất (Đọc) phần tử bất kỳ: O(1)

  • Ý nghĩa: Bạn muốn lấy phần tử thứ i, chỉ cần truy cập array[i] là xong, không cần duyệt từ đầu đến đó.
  • Cách nhớ:
  • RAM: Random Access Memory → Truy cập bất kỳ chỗ nào cũng NHANH như nhau.
  • Tưởng tượng: Mảng như dãy ngăn kéo, biết số ngăn là mở ngay được!
  • Ví dụ Python:
    arr = [10, 20, 30, 40]
    print(arr[0]) # 10
    print(arr[2]) # 30
    

2.2. Ghi đè (Overwrite) phần tử: O(1)

  • Ý nghĩa: Gắn giá trị mới vào vị trí nào cũng cực nhanh.
  • Ví dụ Python:
    arr[1] = 99  # arr giờ là [10, 99, 30, 40]
    

2.3. Thêm/Xoá ở CUỐI mảng (nếu còn chỗ): O(1)

  • Ý nghĩa: Thêm hoặc xoá phần tử cuối cùng thì cũng như truy cập bình thường, rất nhanh.
  • Ví dụ Python:
    arr.append(50)  # Thêm 50 vào cuối: [10, 99, 30, 40, 50]
    arr.pop()       # Xoá cuối: [10, 99, 30, 40]
    

2.4. Thêm/Xoá ở GIỮA hoặc ĐẦU mảng: O(n)

  • Ý nghĩa:
  • Nếu muốn chèn 1 giá trị vào giữa, phải DỜI các phần tử phía sau ra sau 1 vị trí.
  • Nếu xoá 1 giá trị ở giữa, phải DỜI các phần tử phía sau lên trước 1 vị trí.
  • Cách nhớ:
  • Tưởng tượng mảng như đoàn tàu ghế liền nhau, muốn chèn/xoá ở giữa phải dịch chuyển cả đoàn ghế phía sau.
  • Ví dụ Python:
    arr.insert(1, 77)  # Chèn 77 vào index 1: [10, 77, 99, 30, 40]
    arr.pop(2)         # Xoá phần tử ở index 2: [10, 77, 30, 40]
    

2.5. Kích thước cố định (Static array) vs. động (Dynamic array/Python list):

  • Static array: Kích thước cố định, muốn thêm vượt quá thì lỗi (C, Java).
  • Python list: Thực chất là dynamic array, có thể tự động mở rộng.
  • Cách nhớ:
  • Python rất "thoải mái", nên bạn không bị lỗi khi thêm quá số lượng ban đầu.

3. Mẹo giúp NHỚ LÂU:

  • Vẽ lại sơ đồ mảng & địa chỉ: Tự vẽ các ô vuông, đánh số index, thử thêm/xoá/chèn và quan sát việc phải dịch chuyển phần tử nào.
  • Áp dụng ví dụ thực tế:
  • Nghĩ về dãy số ghế trong rạp chiếu phim: Muốn chèn thêm ghế ở giữa phải lùi hết các ghế sau ra.
  • Tự code lại các thao tác cơ bản của mảng:
  • Viết vòng lặp truy xuất, chèn, xoá để cảm giác được O(1) và O(n).
  • Ghi nhớ các phép toán với chú thích Big O:
  • Đọc/gán phần tử: O(1)
  • Thêm/xoá cuối: O(1)
  • Chèn/xoá giữa: O(n)

4. Tổng hợp Bảng Đặc Tính Array

Phép toán Độ phức tạp (Big O) Lý do
Truy xuất (arr[i]) O(1) Trực tiếp
Gán (arr[i] = x) O(1) Trực tiếp
Thêm/Xoá ở cuối O(1) Nếu còn chỗ
Chèn/Xoá ở đầu/giữa O(n) Phải dời phần tử

5. Nhớ lâu bằng cách ĐẶT CÂU HỎI & CODE NGAY

  • Tại sao truy xuất phần tử bất kỳ lại nhanh?
  • Vì biết chính xác địa chỉ trong RAM dựa trên index.
  • Chèn/xoá ở giữa tại sao lại chậm?
  • Vì phải dịch chuyển nhiều phần tử phía sau.
  • Python list có khác gì array truyền thống?
  • Python list là dynamic array, tự động mở rộng & co lại khi thêm/xoá phần tử.

6. Thực hành: Duyệt mảng & thao tác

arr = [5, 6, 7]
# Đọc từng phần tử
for i in range(len(arr)):
    print(f'Index {i} value {arr[i]}')

# Chèn 4 vào đầu mảng
arr.insert(0, 4) # [4, 5, 6, 7]

# Xoá phần tử cuối
arr.pop()        # [4, 5, 6]

Ghi nhớ: - Mảng = dãy giá trị liền nhau, truy xuất cực nhanh (O(1)), chèn/xoá giữa thì chậm (O(n)). - Biết chọn đúng cấu trúc dữ liệu sẽ giúp code vừa nhanh vừa tiết kiệm bộ nhớ.

Bạn càng thực hành code, tự vẽ, tự đặt câu hỏi càng nhớ lâu!

Bình luận