Data Structures và Algorithms quan trọng như nào

  • Phuong Dang
  • 22/Apr/2022
  1. Yếu tố nào tạo nên source code tốt?
  2. Data structures (Cấu trúc dữ liệu) là gì?
  3. Algorithm (Giải thuật/Thuật toán) là gì?
  4. Kết luận.
Niklaus Wirth đã từng nói Programs = Data Structures + Algorithms, đây là 2 yếu tố được đánh giá quan trọng nhất trong lập trình và tạo nên thứ gọi là "tư duy lập trình". Thậm chí 2 yếu tố này được cho rằng sẽ phân định được "đẳng cấp" của một developer. Các công ty lớn khi tuyển dụng họ sẽ quan tâm đến ứng viên có kinh nghiệm với Data Structures + Algorithms hơn là một ứng viên rất thuộc Java syntax.

1. Yếu tố nào tạo nên source code tốt?

Với mình ngoài yếu tố phải "chạy đúng" thì source code tốt cần đảm bảo ít nhất những yếu tố sau:

  • Readable: Source code cần phải rõ ràng mạch lạc, tuân thủ rules/conventions.
  • Scalable: Source code cần phải phân bổ cấu trúc hợp lý để dễ dàng cho việc bảo trì và mở rộng sau này.
  • Good performance: Source code có thể execute với một hiệu năng tốt. Giải quyết một bài toán sử dụng tài nguyên (Memmory) ít nhất có thể để đạt được tốc độ (Speed) cao nhất có thể.
Để đạt được tiêu chí thứ 3, chúng ta cần phải biết và áp dụng được Data Structures + Algorithms.

2. Data structures (Cấu trúc dữ liệu) là gì?

Một computer program là tập hợp nhiều câu lệch để thực hiện một nhiệm vụ cụ thể. Thông thường thì computer program sẽ cần phải lưu trữ, truy xuất và tính toán trên tệp dữ liệu nào đó. Ví dụ với một "phần mềm quản lý sinh viên", thì chúng sẽ phải quản lý (tạo mới, sửa, xoá...) thông tin sinh viên.

Cụ thể chúng ta có thể chia nhỏ data structures thành 2 phần là datastructure:

  • Data là những dữ liệu được lưu trữ, truy xuất và tính toán bởi computer program.
    Trong ví dụ "phần mềm quản lý sinh viên", ta có thể hiểu data là "Sinh viên"
  • Structure là cách thức tổ chức và sắp xếp dữ liệu trong máy tính theo một cấu trúc để giúp computer program có thể truy xuất, cập nhật một cách hiệu quả.
    Trong ví dụ "phần mềm quản lý sinh viên", ta có thể hiểu rằng chúng ta cần quản lý nhiều "Sinh viên" vì vậy chúng ta sẽ cần tổ chức data ở dạng List (danh sách).

Về mặt khái niệm ta có thể hiểu rằng:

Data structures là một tập hợp dữ liệu có cấu trúc.

Trong thực tế có rất nhiều data structures (Arrays, Stacks, Queues, Linked List...) và sẽ tuỳ thuộc vào yêu cầu bài toán mà chúng ta lựa chọn sử dụng data structure một cách hợp lý. Đến đây các bạn cũng không cần phải lo lắng làm sao để học hết được nhiều data structures thế. Bởi vì chỉ cần nắm được 6-8 common data structures cũng đủ để các bạn làm việc hiệu quả rồi.

3. Algorithm (Giải thuật/Thuật toán) là gì?

Bên trên chúng ta đã đề cập đến việc một computer program sẽ lưu trữ, truy xuất và tính toán trên tệp dữ liệu nào đó. Vậy câu hỏi đặt ra là làm thế nào để lưu trữ, truy xuất và tính toán một cách hiệu quả. Để đạt được tính "hiệu quả" đó chúng ta cần lựa chọn một phương pháp phù hợp, đó chính là Algorithm.

Về mặt khái niệm ta có thể hiểu rằng:

Algorithm là một phương pháp để giải quyết một bài toán nào đó. Nó bao gồm nhiều câu lệch để thực thi trên data structure đầu vào (Input) và cho ra một data structure mong đợt (Output).

Ví dụ: Thuật toán tìm số lớn nhất.

Winzone.vn the algorithm find max number.

Thực tế có rất rất nhiều algorithms được định nghĩa sẵn và chính các bạn cũng có thể tạo ra thuật toán của riêng mình được. Tuy nhiên bạn cũng không cần quá lo lắng, vì nếu không phải nghiên cứu chuyên sâu thì chúng ta chỉ cần nắm được một số loại thuật toán phổ biến: sắp xếp, tìm kiếm, merge là có thể làm việc hiệu quả.

3.1 Thế nào là một thuận toán tốt.

Việc đánh giá hiệu quả của một thuật toán không thể dùng trực quan để phán đoán. Chúng ta sẽ phải dùng Big O notation để so sánh mức độ hiệu quả của nhiều thuật toán khi giải quyết cùng 1 vấn đề. Topic này chúng ta sẽ cùng tìm hiểu chi tiết trong một bài viết khác nhé. Tuy nhiên có thể tóm tắt rằng một thuận toán tốt sẽ phụ thuộc vào 2 yếu tố:

  • Memory (Space Complexity): Dung lượng bộ nhớ mà thuật toán sẽ sử dụng dựa trên số lượng dữ liệu đầu vào.
  • Speed (Time Complexity): Số lượng câu lệch cần phải thực thi ~ thời gian thực thi của thuật toán dựa trên số lượng dữ liệu đầu vào.
Lý tưởng nhất là thuật toán sẽ sử dụng ít bộ nhớ nhất mà vẫn đạt được tốc độ nhanh nhất. Tuy nhiên trong thực tế đôi khi ta không đạt được điều đó. Vì vậy tuỳ tình huống, bài toán thực tế mà developer cần phải cân nhắc bù trừ để cân bằng giữa 2 yếu tố trên. Sẽ có lúc thì mục tiêu speed ưu tiên cao hơn memory và ngược lại.

4. Kết luận

Chúng ta thường nói lập trình bằng ngôn ngữ nào không quan trọng, mà quan trọng là có "tư duy lập trình" tốt. Nếu tư duy tốt thì việc tiếp cận một ngôn ngữ mới thực sự đơn giản. Và đứng trên cương vị người phỏng vấn, thì bản thân mình cũng đã nhiều lần tạo điều kiện cho các bạn ứng viên có tư duy lập trình tốt mặc dù tại thời điểm đó các bạn chưa đáp ứng được yêu cầu tuyển dụng.

Một lần nữa khẳng định 2 yếu tố này cực kỳ quan trọng. Hi vọng bài viết này cung cấp đến cho các bạn một cái nhìn cơ bản về Data Structures và Algorithms. Và là bước đệm để các bạn tiếp tục tìm hiểu và thực hành với rất nhiều Data Structures và Algorithms sau này.