Bài 2: Mảng hai chiều

Nội dung lý thuyết

1. Mảng hai chiều

Mảng hai chiều dùng để lưu trữ một bảng số liệu hình chữ nhật, ví dụ như hình chữ nhật khung dữ liệu ở Hình 1aHình 1b. Mảng hai chiều còn gọi là ma trận.

Bảng điểm tổng kết các môn học

Mảng hai chiều là mảng một chiều mà trong đó mỗi phần tử là một mảng một chiều. Hầu hết các ngôn ngữ lập trình bậc cao đều có sẵn kiểu mảng hai chiều. Nếu cần thiết, có thể tạo ra mảng có hơn hai chiều hay còn gọi là mảng nhiều chiều.

Khai báo mảng hai chiều

Khai báo mảng hai chiều là cung cấp đủ các thông tin:

  • tên biến mảng

  • kiểu dữ liệu

  • kích thước (gồm hai số nguyên dương, mỗi số xác định kích thước một chiều của hình chữ nhật)

Cấu trúc mảng hai chiều

Trong bộ nhớ, mảng hai chiều được tổ chức tương tự như mảng một chiều, tức là lưu trữ thành một khối các ô nhớ liên tục.
Độ lớn của mảng: số hàng × số cột × độ dài kiểu dữ liệu

Truy cập ngẫu nhiên

Các thông tin trong khai báo mảng giúp máy tính xác định dung lượng bộ nhớ cần cho mảng.

  • Để truy cập một phần tử, cần biết hai chỉ số: chỉ số hàng và chỉ số cột.

  • Ví dụ: bangDiem[3][1] là phần tử ở hàng thứ 3, cột thứ 1 trong mảng Hình 1b.

  • Các chỉ số luôn đi kèm để định vị chính xác phần tử.

Thời gian thực hiện việc đọc/gán giá trị cho một phần tử là hằng số, không phụ thuộc kích thước mảng.

2. Sử dụng danh sách làm mảng hai chiều trong Python

Python có sẵn kiểu danh sách (list) rất linh hoạt, có thể dùng để tạo mảng một chiều, hai chiều.

Danh sách lồng nhau được khai báo và sử dụng như mảng hai chiều.
Cú pháp:

1. Khai báo danh sách rỗng làm mảng hai chiều:

Ten_danh_sach = []

2. Khai báo danh sách với cấu trúc “[]” chứa danh sách con:

Ten_danh_sach = [ [...], [...], ..., [...] ]

Ví dụ: matranThuc = [[7.5, 6.5, 5.5, 0.5, 0.9, 0.1], [6.5, 8.5, 8.0, 8.0, 0.4, 4.5]]

→ Tạo mảng hai chiều 2 hàng, 5 cột.

Trong bộ nhớ máy tính, mảng hai chiều n hàng × m cột được lưu thành dãy n×m số liên tiếp, hàng trước đến hàng sau: hàng 0 → hàng 1 → ...

Thời gian thực hiện các phép toán của mảng

  • Phép chèn thêm/xoá phần tử ở đầu/cuối mảng: thời gian thực hiện không vượt quá một hằng số.

  • Nếu mảng có độ dài bao nhiêu cũng cần dịch chuyển dữ liệu nếu không đủ chỗ.

  • Trường hợp không còn chỗ, phải di chuyển sang vùng nhớ mới, thời gian tỷ lệ với độ dài danh sách.

Dịch chuyển tạo chỗ trống khi chèn thêm vào giữa mảng

→ Trung bình cần khoảng n/2 thao tác dịch chuyển để thêm vào giữa mảng.