Skip to content

Commit 1b5250f

Browse files
committed
hmm
1 parent fbb2373 commit 1b5250f

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed
File renamed without changes.
File renamed without changes.
File renamed without changes.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
**K-way merge** (trộn K dãy) là một kỹ thuật trong khoa học máy tính dùng để hợp nhất **K danh sách hoặc K luồng dữ liệu đã được sắp xếp** thành một danh sách duy nhất cũng được sắp xếp. Đây là một bước quan trọng trong các thuật toán xử lý dữ liệu lớn như **external sorting**, **merge sort đa đường**, hay khi trộn nhiều file log đã sắp xếp.
2+
3+
Dưới đây là phần giải thích đầy đủ và có hệ thống:
4+
5+
---
6+
7+
## 1. Vấn đề đặt ra
8+
9+
Bạn có **K danh sách đã được sắp xếp theo thứ tự tăng dần**, ví dụ:
10+
11+
* L1: 1, 9, 17
12+
* L2: 2, 3, 20
13+
* L3: 4, 8, 15
14+
* … đến LK
15+
16+
Yêu cầu: trộn K danh sách này thành một danh sách duy nhất vẫn theo thứ tự tăng dần.
17+
18+
Nếu trộn hai danh sách (2-way merge) thì dễ. Nhưng khi số danh sách tăng lên K, hiệu quả trở thành vấn đề.
19+
20+
---
21+
22+
## 2. Ý tưởng chính
23+
24+
Để tìm phần tử tiếp theo nhỏ nhất, ta chỉ cần nhìn **phần tử đầu tiên** của mỗi danh sách (vì từng danh sách đã được sắp xếp).
25+
26+
Tuy nhiên, nếu K lớn, mỗi lần tìm phần tử nhỏ nhất bằng cách quét tất cả K phần tử đầu là O(K), và tổng thời gian sẽ là O(N*K) — rất chậm.
27+
28+
---
29+
30+
## 3. Tối ưu hóa bằng Min-Heap (bảo đảm hiệu suất tốt)
31+
32+
Giải pháp chuẩn cho K-way merge là sử dụng **min-heap** (priority queue):
33+
34+
1. Đưa phần tử đầu của mỗi danh sách vào một min-heap.
35+
2. Lặp lại cho đến khi heap rỗng:
36+
37+
* Lấy phần tử nhỏ nhất từ heap (O(log K)).
38+
* Đẩy phần tử tiếp theo của danh sách mà phần tử đó thuộc về vào heap (nếu còn).
39+
40+
### Độ phức tạp:
41+
42+
* Có tổng cộng N phần tử.
43+
* Mỗi phần tử được push và pop một lần.
44+
* Chi phí mỗi thao tác là log K.
45+
46+
=> **Tổng thời gian = O(N log K)**
47+
=> Đây là mức tối ưu trong thực tế.
48+
49+
---
50+
51+
## 4. Ứng dụng thực tế
52+
53+
* **External Merge Sort** (sắp xếp dữ liệu lớn hơn bộ nhớ): chia file thành nhiều “run” đã sắp xếp rồi dùng K-way merge để hợp nhất.
54+
* Hệ thống log phân tán: hợp nhất log từ nhiều máy đã sắp xếp theo timestamp.
55+
* Các thuật toán streaming, database engines, hệ thống tìm kiếm (search engines).
56+
57+
---
58+
59+
## 5. Minh họa nhỏ
60+
61+
Giả sử K = 3:
62+
63+
Heap ban đầu: [1 (L1), 2 (L2), 4 (L3)]
64+
Lấy ra 1 → thêm phần tử tiếp theo của L1 (9)
65+
Heap: [2, 4, 9]
66+
Lấy ra 2 → thêm 3
67+
Heap: [3, 4, 9]
68+
Lấy ra 3 → thêm 20
69+
Heap: [4, 9, 20]
70+
… tiếp tục cho đến khi trộn xong.
71+
72+
---
73+
74+
Nếu bạn muốn, tôi có thể cung cấp:
75+
76+
* Mã minh họa (Python, Java, C++, v.v.)
77+
* So sánh với 2-way merge
78+
* Phân tích chi tiết hơn về hiệu suất bộ nhớ hoặc external sorting.
79+

0 commit comments

Comments
 (0)