CHÀO! Bài học hôm nay sẽ hơi khác so với các bài còn lại. Nó sẽ khác ở chỗ nó chỉ liên quan gián tiếp đến Java. Điều đó nói rằng, chủ đề này rất quan trọng đối với mọi lập trình viên. Chúng ta sẽ nói về các thuật toán . Thuật toán là gì? Nói một cách đơn giản, đó là một số chuỗi hành động phải được hoàn thành để đạt được kết quả mong muốn . Chúng tôi sử dụng các thuật toán thường xuyên trong cuộc sống hàng ngày. Ví dụ, mỗi sáng bạn có một nhiệm vụ cụ thể: đi học hoặc đi làm, đồng thời phải:
- mặc quần áo
- Lau dọn
- đã nuôi
- Thức dậy bằng đồng hồ báo thức.
- Đi tắm và tắm rửa sạch sẽ.
- Làm bữa sáng và một ít cà phê hoặc trà.
- Ăn.
- Nếu bạn không ủi quần áo vào buổi tối hôm trước, thì hãy ủi chúng.
- Mặc quần áo.
- Rời khỏi nhà.
- Mua hoặc tải xuống phiên bản 1961 của Từ điển quốc tế mới thứ ba của Webster.
- Tìm mọi tên từ danh sách của chúng tôi trong từ điển này.
- Trên một tờ giấy, viết trang từ điển có tên.
- Sử dụng các mảnh giấy để sắp xếp tên.
for
vòng lặp thông thường thực hiện nhiệm vụ này
int[] numbers = new int[100];
// ...fill the array with numbers
for (int i: numbers) {
System.out.println(i);
}
Độ phức tạp của thuật toán này là gì? Tuyến tính, tức là O(n). Số lượng hành động mà chương trình phải thực hiện phụ thuộc vào số lượng số được truyền cho nó. Nếu trong mảng có 100 số thì sẽ có 100 hành động (câu lệnh để hiển thị chuỗi trên màn hình). Nếu có 10.000 số trong mảng thì phải thực hiện 10.000 thao tác. Thuật toán của chúng tôi có thể được cải thiện theo bất kỳ cách nào không? Không. Dù thế nào đi chăng nữa, chúng ta sẽ phải thực hiện N lượt đi qua mảng và thực hiện N câu lệnh để hiển thị các chuỗi trên bàn điều khiển. Hãy xem xét một ví dụ khác.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
Chúng tôi có một khoảng trống LinkedList
để chèn một số số. Chúng ta cần đánh giá độ phức tạp của thuật toán khi chèn một số vào LinkedList
ví dụ của chúng ta và mức độ phụ thuộc của nó vào số lượng phần tử trong danh sách. Câu trả lời là O(1), tức là độ phức tạp không đổi . Tại sao? Lưu ý rằng chúng tôi chèn từng số vào đầu danh sách. Ngoài ra, bạn sẽ nhớ lại rằng khi bạn chèn một số vào một LinkedList
, các phần tử không di chuyển đi đâu cả. Các liên kết (hoặc tài liệu tham khảo) được cập nhật (nếu bạn quên cách LinkedList hoạt động, hãy xem một trong những bài học cũ của chúng tôi ). Nếu số đầu tiên trong danh sách của chúng ta là x
, và chúng ta chèn số y vào đầu danh sách, thì tất cả những gì chúng ta cần làm là:
x.previous = y;
y.previous = null;
y.next = x;
Khi chúng tôi cập nhật các liên kết, chúng tôi không quan tâm có bao nhiêu số đã có trongLinkedList
, dù là một hay một tỷ. Độ phức tạp của thuật toán là hằng số, tức là O(1).