Tối ưu hóa mã trong Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Hiểu độ phức tạp bộ nhớ rất quan trọng để xây dựng ứng dụng:
OutOfMemoryErrorKý hiệu giống hệt độ phức tạp thời gian.
Một số lớp độ phức tạp thường gặp:
O(1): Hằng - không phụ thuộc kích thướcO(n): Tuyến tính - tăng theo kích thước đầu vàoO(n²): Bậc hai - tăng theo bình phương kích thướcpublic int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
Dù mảng số nguyên có 10 hay 10 triệu phần tử, ta chỉ dùng bộ nhớ cho một biến max
Độ phức tạp bộ nhớ là O(1) (không đổi)
public int[] doubleValues(int[] array) {
int[] result = new int[array.length];
for (int i = 0; i < array.length; i++) {
result[i] = array[i] * 2;
}
return result;
}
n phần tử, cần thêm chỗ cho n phần tửO(n) vì bộ nhớ tăng tuyến tính theo kích thước đầu vàopublic int[][] multiplicationTable(int n) {
int[][] table = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
table[i][j] = (i + 1) * (j + 1);
}
}
return table;
}
n là 10, cần 100 ô; nếu n là 100, cần 10.000 ôO(n²)Bộ nhớ là tài nguyên hữu hạn!
Các ví dụ trước với đầu vào 10.000 phần tử:
findMax, O(1) -> chỉ thêm vài bytedoubleValues, O(n) -> khoảng 40KB bộ nhớ thêmmultiplicationTable, O(n²) -> khoảng 400MB bộ nhớ thêm
Đừng quên:

Tối ưu hóa mã trong Java