Vâng, tôi sẽ nói rằng biết một cái gì đó về độ phức tạp tính toán là điều bắt buộc đối với bất kỳ lập trình viên nghiêm túc nào. Miễn là bạn không phải đối phó với các tập dữ liệu khổng lồ, bạn sẽ không biết sự phức tạp, nhưng nếu bạn muốn viết một chương trình giải quyết các vấn đề nghiêm trọng, bạn cần nó.
Trong trường hợp cụ thể của bạn, ví dụ về việc tìm các thành phần được kết nối của bạn có thể đã hoạt động cho các biểu đồ có thể nói lên tới nút. Tuy nhiên, nếu bạn đã thử một biểu đồ với nút thì thuật toán của giảng viên có thể đã quản lý được điều đó trong 1 giây, trong khi thuật toán của bạn sẽ có (tùy thuộc vào mức độ phức tạp của nó) mất 1 giờ, 1 ngày hoặc thậm chí là 1 vĩnh cửu.100.000100100.000
Một lỗi khá phổ biến mà sinh viên mắc phải trong khóa học thuật toán của chúng tôi là lặp đi lặp lại qua một mảng như thế này:
while array not empty
examine first element of array
remove first element from array
Đây có thể không phải là mã đẹp nhất nhưng trong một chương trình phức tạp, một cái gì đó như thế này có thể xuất hiện mà không có lập trình viên nhận thức được nó. Bây giờ, vấn đề với chương trình này là gì?
Giả sử chúng ta chạy nó trên tập dữ liệu gồm phần tử. So với chương trình sau, chương trình cũ sẽ chạy chậm hơn.50.000100.00050.000
while array not empty
examine last element of array
remove last element from array
Tôi hy vọng bạn đồng ý rằng có kiến thức để làm cho chương trình của bạn chạy nhanh hơn lần có lẽ là một điều quan trọng đối với một lập trình viên. Hiểu được sự khác biệt giữa hai chương trình đòi hỏi một số kiến thức cơ bản về lý thuyết phức tạp và một số kiến thức về các chi tiết của ngôn ngữ bạn đang lập trình.50.000
Trong ngôn ngữ mã giả của tôi, "loại bỏ một phần tử khỏi một mảng" sẽ dịch chuyển tất cả các phần tử sang bên phải của phần tử được loại bỏ một vị trí từ bên trái. Điều này làm cho việc loại bỏ phần tử cuối cùng thành thao tác vì để thực hiện điều đó, chúng ta chỉ cần tương tác với 1 phần tử. Loại bỏ phần tử đầu tiên là vì để loại bỏ phần tử đầu tiên, chúng ta cần chuyển tất cả các phần tử khác sang một vị trí bên trái.O ( n ) n - 1Ô ( 1 )Ô ( n )n - 1
Một bài tập rất cơ bản về độ phức tạp là chứng minh rằng chương trình đầu tiên sẽ thực hiện hoạt động trong khi chương trình thứ hai chỉ sử dụng thao tác. Nếu bạn cắm bạn sẽ thấy một chương trình hiệu quả hơn nhiều so với chương trình kia.nn=100.00012n2nn = 100.000
Đây chỉ là một ví dụ về đồ chơi nhưng nó đòi hỏi sự hiểu biết cơ bản về độ phức tạp để phân biệt sự khác biệt giữa hai chương trình và nếu bạn thực sự đang cố gắng gỡ lỗi / tối ưu hóa một chương trình phức tạp hơn có lỗi này thì cần phải tìm hiểu nhiều hơn ra lỗi ở đâu Bởi vì một lỗi như loại bỏ một phần tử khỏi một mảng theo kiểu này có thể được ẩn rất tốt bởi sự trừu tượng trong mã.
Có một sự hiểu biết tốt về sự phức tạp cũng giúp ích khi so sánh hai cách tiếp cận để giải quyết vấn đề. Giả sử bạn đã tự mình đưa ra hai cách tiếp cận khác nhau để giải quyết vấn đề các thành phần được kết nối: để quyết định giữa chúng, sẽ rất hữu ích nếu bạn có thể (nhanh chóng) ước tính độ phức tạp của chúng và chọn phương án tốt hơn.