Các thành phần tĩnh (static member) trong lớp (class)
1. Thành phần dữ liệu tĩnh Các thuộc tính trong lớp được khai báo bằng từ...
Kết quả sẽ mở trong tab mới, giới hạn trong website này.
Truy cập nhanh
Tìm kiếm gần đây
1. Cấu trúc dữ liệu là gì? Cấu trúc dữ liệu (data structure) là cách thức tổ chức dữ liệu sao cho phù hợp với bài toán và có thể dùng máy tính để xử lý các dữ liệu đó một cách hiệu quả. Các tiêu chuẩn của một cấu trúc dữ liệu: Phải biểu […]
Cấu trúc dữ liệu (data structure) là cách thức tổ chức dữ liệu sao cho phù hợp với bài toán và có thể dùng máy tính để xử lý các dữ liệu đó một cách hiệu quả.
Các tiêu chuẩn của một cấu trúc dữ liệu:
Có nhiều loại cấu trúc dữ liệu nhưng có thể chia thành 2 loại: cấu trúc dữ liệu tuyến tính (linear) và phi tuyến tính (non-linear).
Giải thuật là tên gọi khác của thuật toán. Thuật toán (algorithm) là tập hợp hữu hạn các thao tác được định nghĩa rõ ràng nhằm giải quyết một bài toán cụ thể nào đó.
Một thuật toán phải đảm bảo 5 tính chất sau:
– Tính chính xác: quá trình tính toán hay các thao tác máy tính thực hiện là chính xác.
– Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ tự nhất định.
– Tính khách quan: được viết bởi nhiều người trên máy tính nhưng kết quả phải như nhau.
– Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có đầu vào tương tự nhau.
– Tính kết thúc: hữu hạn các bước tính toán.
Các bạn có thể đọc thêm bài Thuật toán là gì? Các phương pháp biểu diễn thuật toán để hiểu rõ hơn về thuật toán.
Thuật toán và cấu trúc dữ liệu có mối quan hệ chặt chẽ với nhau. Cuốn sách “Algorithms + Data Structures = Programs” là một trong những cuốn sách kinh điển của nhà khoa học máy tính Niklaus Wirth viết vào năm 1976 nói lên điều đó.
Thật vậy, bất kỳ một chương trình nào cũng cần có dữ liệu để tính toán, xử lý. Nhiệm vụ tính toán, xử lý sẽ được giao cho thuật toán. Để chương trình hoạt động tốt, ổn định thì thuật toán phải xử lý tốt và chính xác trên dữ liệu. Do đó, những dữ liệu này cần được lưu trữ, tổ chức một cách hợp lý với thuật toán.
Rõ ràng, cấu trúc dữ liệu đóng vai trò quan trọng trong việc kết hợp và đưa ra cách giải quyết bài toán. Cấu trúc dữ liệu cũng hỗ trợ cho các thuật toán thao tác, xử lý hiệu quả hơn.
Với một bài toán, chúng ta có thể có nhiều thuật toán để giải quyết bài toán đó. Nhưng một câu hỏi đặt ra là thuật toán nào tốt hơn thuật toán nào? Để trả lời câu hỏi này, cần xem xét thế nào là một thuật toán hiệu quả?
Một thuật toán hiệu quả thì chi phí sử dụng tài nguyên như bộ nhớ, thời gian sử dụng CPU,… thấp. Người ta thường phân tích độ phức tạp thuật toán để đánh giá sự hiệu quả của thuật toán. Có hai phương pháp đánh giá độ phức tạp của thuật toán là:
Cài thuật toán rồi chọn các bộ dữ liệu thử nghiệm. Chạy thuật toán rồi thống kê các thông số (thời gian chạy thuật toán, dung lượng bộ nhớ,…) khi chạy thuật toán với các bộ dữ liệu đó.
Ưu điểm: Dễ thực hiện.
Nhược điểm:
Trong nghiên cứu khoa học, phương pháp này được sử dụng rất nhiều.
Đánh giá độ phức tạp thuật toán theo hướng xấp xỉ tiệm cận qua các khái niệm O(). Hiểu đơn giản là xấp xỉ số lần thực hiện các phép toán của thuật toán. Số lần thực hiện phép toán càng ít thì thuật toán càng ít phức tạp (càng tốt) và ngược lại.
Ưu điểm: Ít phụ thuộc ngôn ngữ lập trình cũng như phần cứng hơn.
Nhược điểm: Cách tính phức tạp, cần có kiến thức toán học.
Người ta sử dụng các ký hiệu BigO bên dưới để đánh giá độ phức tạp thuật toán theo độ phức tạp tăng dần.
for (int i=1;i<=n;i++) {
x=x+1;
}
thực hiện n lần phép toán, độ phức tạp thuật toán là O(n).
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++ ){
x=x+1;
}
}
thực hiện n*n lần phép toán, độ phức tạp thuật toán là O(n2).