Sau khi thành thạo for, while, List và Hàm, học viên nên tiếp tục học các kỹ thuật xử lý dữ liệu dưới đây. Đây là những kỹ thuật xuất hiện rất nhiều trong các kỳ thi lập trình và phỏng vấn.
Mục đích: Tính tổng một đoạn trong danh sách rất nhanh.
A = [2, 4, 1, 5, 3]
preSum = [0]
for x in A:
preSum.append(preSum[-1] + x)
print(preSum)
# Tổng từ chỉ số 1 đến 3
print(preSum[4] - preSum[1])Ứng dụng:
Mục đích: Đếm số lần xuất hiện của từng số.
A = [2,4,2,3,2,1]
dem = [0] * 10
for x in A:
dem[x] += 1
print(dem)
print("Số 2 xuất hiện:", dem[2])Ứng dụng:
Mục đích: Tìm tổng lớn nhất hoặc nhỏ nhất của một đoạn liên tiếp.
A = [2,4,1,5,3]
k = 3
tong = sum(A[:k])
lonNhat = tong
for i in range(k, len(A)):
tong = tong - A[i-k] + A[i]
lonNhat = max(lonNhat, tong)
print(lonNhat)
Ứng dụng:
Mục đích: Duyệt hai đầu của danh sách để giảm số lần lặp.
A = [1,2,3,5,7,9]
L = 0
R = len(A)-1
while L < R:
s = A[L] + A[R]
if s == 10:
print(A[L], A[R])
break
elif s < 10:
L += 1
else:
R -= 1
Ứng dụng:
Mục đích: Tìm kiếm cực nhanh trên danh sách đã sắp xếp.
A = [2,4,6,8,10,12]
x = 8
L = 0
R = len(A)-1
while L <= R:
mid = (L+R)//2
if A[mid] == x:
print("Tìm thấy")
break
elif A[mid] < x:
L = mid + 1
else:
R = mid - 1
Ứng dụng:
Mục đích: Lưu dữ liệu theo dạng khóa và giá trị.
A = [2,4,2,3,2,1]
dem = {}
for x in A:
dem[x] = dem.get(x,0)+1
print(dem)
Ứng dụng:
Mục đích: Sắp xếp dữ liệu.
A = [5,2,8,1,3]
A.sort()
print(A)Ứng dụng:
Mục đích: Luôn chọn phương án tốt nhất ở hiện tại.
tien = 6800
for to in [5000,2000,1000,500,200,100]:
print(to, ":", tien // to)
tien %= toỨng dụng:
Mục đích: Duyệt đồ thị theo chiều sâu.
graph = {
1:[2,3],
2:[4],
3:[],
4:[]
}
def dfs(u):
print(u)
for v in graph[u]:
dfs(v)
dfs(1)
Ứng dụng:
Mục đích: Duyệt đồ thị theo từng tầng.
from collections import deque
graph = {
1:[2,3],
2:[4],
3:[],
4:[]
}
q = deque([1])
while q:
u = q.popleft()
print(u)
for v in graph[u]:
q.append(v)
Ứng dụng:
Mục đích: Lưu kết quả đã tính để không tính lại.
n = 10
dp = [0]*(n+1)
dp[1]=1
for i in range(2,n+1):
dp[i]=dp[i-1]+dp[i-2]
print(dp[n])
Ứng dụng:
Mục đích: Cập nhật nhanh giá trị trên một đoạn.
A = [0,0,0,0,0]
diff = [0]*6
diff[1] += 3
diff[4] -= 3
for i in range(1,5):
diff[i] += diff[i-1]
print(diff[:-1])
Ứng dụng:
Gợi ý: Nếu mục tiêu là thi học sinh giỏi hoặc thi lập trình, hãy ưu tiên học thật chắc Prefix Sum, Sliding Window, Two Pointers, Dictionary và Binary Search trước khi chuyển sang các thuật toán nâng cao.
Các thuật toán và kỹ thuật quan trọng trong Python, ứng dụng khi đi thi học sinh giỏi, cấp quốc gia