Xin chào! Bài giảng hôm nay sẽ khác một chút so với những bài còn lại. Nó sẽ khác ở chỗ nó chỉ liên quan gián tiếp đến Java. Tuy nhiên, 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, đây là một chuỗi hành động nhất định phải được thực hiện để đạt được kết quả mong muốn . Chúng ta thường sử dụng các thuật toán trong cuộc sống hàng ngày. Ví dụ, mỗi buổi sáng bạn phải đối mặt với một nhiệm vụ: đến trường hoặc nơi làm việc, đồng thời:
- mặc quần áo
- Lau dọn
- Ăn uống đầy đủ
- Thức dậy với đồng hồ báo thức.
- Đi tắm, rửa mặt.
- Chuẩn bị bữa sáng, pha cà phê/trà.
- Ăn.
- Nếu bạn chưa ủi quần áo từ tối, hãy ủi chúng.
- Mặc quần áo.
- Rời khỏi nhà.
- Mua hoặc tải xuống trên Internet “Từ điển tên cá nhân Nga” ấn bản năm 1966.
- Tìm mọi tên trong danh sách của chúng tôi trong từ điển này.
- Viết ra một tờ giấy trang nào của từ điển có tên đó.
- Đặt tên theo thứ tự bằng cách sử dụng các ghi chú trên một tờ giấy.
for
thực hiện nhiệm vụ này
int[] numbers = new int[100];
// ..заполняем массив числами
for (int i: numbers) {
System.out.println(i);
}
Độ phức tạp của thuật toán được viết là gì? Tuyến tính, O(N). Số lượng hành động mà chương trình phải thực hiện phụ thuộc vào chính xác có bao nhiêu số được truyền vào nó. Nếu mảng có 100 số thì sẽ có 100 thao tác (xuất ra màn hình), nếu mảng có 10.000 số thì cần 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? KHÔNG. Trong mọi trường hợp, chúng ta sẽ phải thực hiện N đi qua mảng và thực hiện N đầu ra cho bảng điều khiển. Hãy xem 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 ô trống LinkedList
để chèn một số số vào. Chúng ta cần ước tính độ phức tạp của thuật toán chèn một số vào LinkedList
ví dụ của mình và nó phụ thuộc như thế nào vào số lượng phần tử trong danh sách. Câu trả lời là O(1) - độ phức tạp không đổi . Tại sao? Xin lưu ý: mỗi lần chúng tôi chèn một số vào đầu danh sách. Ngoài ra, như bạn nhớ, khi chèn số vào LinkedList
các phần tử, chúng không bị dịch chuyển đi đâu cả - các liên kết được xác định lại (nếu bạn đột nhiên quên cách LinkedList hoạt động, hãy xem một trong những bài giảng cũ của chúng tôi ). Nếu bây giờ số đầu tiên trong danh sách của chúng ta là số х
và chúng ta chèn số y vào đầu danh sách thì tất cả những gì cần làm là:
x.previous = y;
y.previous = null;
y.next = x;
Đối với việc định nghĩa lại tham chiếu này, việc hiện tại có bao nhiêu con số không quan trọng đối với chúng tôiLinkedList
- ít nhất một, ít nhất một tỷ. Độ phức tạp của thuật toán sẽ không đổi - O(1).
GO TO FULL VERSION