- vừa được xem lúc

Kỹ Thuật Sliding Window Trong Lập Trình

0 0 3

Người đăng: Cường Múa Code

Theo Viblo Asia

1. Giới Thiệu Về Sliding Window

Sliding Window là một kỹ thuật tối ưu hóa thuật toán, thường được sử dụng để giảm độ phức tạp của các bài toán liên quan đến xử lý mảng hoặc chuỗi. Thay vì sử dụng hai vòng lặp lồng nhau để duyệt tất cả các trường hợp có thể, kỹ thuật Sliding Window giúp ta tận dụng thông tin từ lần duyệt trước để tính toán hiệu quả hơn.

2. Khi Nào Dùng Sliding Window?

Kỹ thuật này thường được áp dụng khi bài toán yêu cầu:

  • Tìm tổng, trung bình, hoặc một tính chất nào đó của một dãy con liên tiếp trong mảng/chuỗi.
  • Xác định độ dài tối đa/tối thiểu của một dãy con thỏa mãn điều kiện nào đó.
  • Tối ưu hóa các bài toán có cách giải brute-force (O(n^2)) xuống (O(n)).

3. Các Loại Sliding Window

a) Fixed Window (Cửa sổ cố định)

Đây là dạng cơ bản nhất, khi cửa sổ có kích thước cố định k. Ví dụ: Tìm tổng lớn nhất của một dãy con có độ dài k trong mảng.

Ví dụ: Tìm tổng lớn nhất của một dãy con có độ dài k

public int MaxSumSubarray(int[] nums, int k) { int maxSum = 0, windowSum = 0; for (int i = 0; i < k; i++) { windowSum += nums[i]; } maxSum = windowSum; for (int i = k; i < nums.Length; i++) { windowSum += nums[i] - nums[i - k]; maxSum = Math.Max(maxSum, windowSum); } return maxSum;
}

Độ phức tạp: O(n)

b) Dynamic Window (Cửa sổ động)

Dạng này cửa sổ có kích thước thay đổi, thường được sử dụng khi cần tìm dãy con ngắn nhất/dài nhất thỏa mãn một điều kiện nào đó.

Ví dụ: Tìm dãy con ngắn nhất có tổng >= target.

public int MinSubArrayLen(int target, int[] nums) { int left = 0, sum = 0, minLength = int.MaxValue; for (int right = 0; right < nums.Length; right++) { sum += nums[right]; while (sum >= target) { minLength = Math.Min(minLength, right - left + 1); sum -= nums[left]; left++; } } return minLength == int.MaxValue ? 0 : minLength;
}

Độ phức tạp: O(n)

4. Khi Nào Không Nên Dùng Sliding Window?

  • Khi phần tử không được sắp xếp và yêu cầu truy cập ngẫu nhiên.
  • Khi bài toán yêu cầu kiểm tra nhiều tổ hợp không liên tiếp.
  • Khi không có một quy tắc cụ thể nào để mở rộng hoặc thu hẹp cửa sổ.

5. Kết Luận

Kỹ thuật Sliding Window giúp tối ưu hóa đáng kể các bài toán liên quan đến mảng và chuỗi, giảm độ phức tạp từ O(n^2) xuống O(n). Việc hiểu và áp dụng đúng kỹ thuật này sẽ giúp software engineer tối ưu hóa hiệu suất chương trình một cách đáng kể.

Bạn đã từng sử dụng Sliding Window trong bài toán nào chưa? Chia sẻ kinh nghiệm của bạn nhé!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Nhập môn lý thuyết cơ sở dữ liệu - Phần 1 : Tổng quan

# Trong bài viết này mình sẽ tập trung vào chủ đề tổng quan về Cơ sở dữ liệu. Phần 1 lý thuyết nên hơi chán các bạn cố gắng đọc nhé, chắc lý thuyết mới làm bài tập được, kiến thức còn nhiều các bạn cứ

0 0 112

- vừa được xem lúc

Cấu trúc dữ liệu và giải thuật: Danh sách liên kết đơn (Singly Linked List)

Danh sách liên kết là 1 cấu trúc dữ liệu được sử dụng để lưu trữ 1 tập hợp các dữ liệu. Danh sách liên kết có các tính chất sau:.

0 0 54

- vừa được xem lúc

Bạn đang lưu dữ liệu dạng cây vào CSDL theo cách nào?

Dữ liệu dạng cây (tree data structure) là dạng dữ liệu rất thường thấy ở các ứng dụng. Những chỗ bạn từng bắt gặp có dùng cấu trúc dạng cây có thể là:.

0 0 82

- vừa được xem lúc

Sự khác nhau giữa biến tham chiếu kiểu List và ArrayList trong Java là gì?

1. Đặt vấn đề.

0 0 47

- vừa được xem lúc

8 kiểu cấu trúc dữ liệu mà mọi lập trình viên cần phải biết.

Trong lĩnh vực Khoa học máy tính, cấu trúc dữ liệu được định nghĩa là những cách để tổ chức và lưu trữ dữ liệu trong máy tính để chúng ta có thể thực hiện các hoạt động trên dữ liệu được lưu trữ đó mộ

0 0 32

- vừa được xem lúc

Data structures: Arrays

Tổng quan:. Tiếp theo trong series Data structures and Algorithms, hôm nay mình sẽ giới thiệu đến các bạn một loại Cấu trúc dữ liệu đơn giản và hay gặp nhất, đó là Array.

0 0 47