---
# System prepended metadata

title: 4. Median of Two Sorted Arrays

---

# 4. Median of Two Sorted Arrays

## Tóm tắt đề
Cho 2 dãy $A, B$ với độ dài $m, n$ đã được sắp xếp. Tính trung vị của dãy sắp xếp gộp bởi 2 dãy này.

## Yêu cầu
Thuật toán phải có độ phức tạp là $\mathcal{O}(\log (m + n))$.

## Lời giải

Không mất tính tổng quát, giả sử $m \le n$.

Có nhiều cách giải, chúng ta sẽ đi từ cách hiển nhiên nhất đến cách nhanh nhất.

### $\mathcal{O}((m + n) \log (m + n))$

Gộp 2 dãy lại, sort rồi in ra trung vị.

### $\mathcal{O}(m + n)$

Đặt $k = \lceil{\frac{m + n}{2}} \rceil$. Ta cần tìm nhanh $k$ phần tử nhỏ nhất trong 2 dãy này.

1 nhận xét hiển nhiên: vì 2 dãy đã được sắp xếp, nên $k$ phần tử nhỏ nhất này được tạo bởi $i$ phần tử đầu tiên của $A$ và $k - i$ phần tử đầu tiên của $B$.

Ta sẽ lấy $i$ phần tử đầu tiên của $A$, và $k - i$ phần tử đầu tiên của $B$, rồi kiểm tra xem đó có đúng là $k$ phần tử nhỏ nhất của mảng ban đầu hay không. Tức là phần tử lớn nhất trong $k$ phần tử được chọn phải $\ge$ phần tử nhỏ nhất trong $m + n - k$ phần tử còn lại. Hay chúng ta có thể viết: $\max(A_i, B_{k - i}) \le \min(A_{i + 1}, B_{k - i + 1})$.

![](https://hackmd.io/_uploads/Sy1jJcFyp.png)

Nếu $(m + n)$ chẵn, thì đáp án là trung bình cộng của $\max(A_i, B_{k - i})$ và $\min(A_{i + 1}, B_{k - i + 1})$.

Nếu lẻ, thì đáp án chính là $\max(A_i, B_{k - i})$.

Như vậy chúng ta đã có thuật toán $\mathcal{O}(m + n)$.

### $\mathcal{O(\log (m + n))}$

Để đạt được độ phức tạp này, chúng ta cần tận dụng triệt để điều kiện cả 2 dãy đã được sắp xếp, $A_i \le A_{i + 1}$ và $B_i \le B_{i + 1} \ \forall i$.

Thế nên, nếu cách chia ở $i$ không thoả mãn, tức là $\max(A_i, B_{k - i}) > \min(A_{i + 1}, B_{k - i + 1})$, thì chỉ có 2 khả năng xảy ra:

1. Nếu $A_i > B_{k - i + 1}$, thì $k$ phần tử nhỏ nhất không chứa $A_i$ trở về sau, hay nói cách khác, phải giảm $i$ xuống.
2. Nếu $B_{k - i} > A_{i + 1}$, thì $k$ phần tử nhỏ nhất không chứa $B_{k - i}$ trở về sau, hay nói cách khác chúng ta phải tăng $i$ lên.

Bởi 2 dấu hiệu này mà chúng ta có thể tìm nhanh được vị trí $i$ bằng chặt nhị phân. Do đó độ phức tạp cuối cùng là $\mathcal{O}(\log(m + n))$.

### Lời giải
https://leetcode.com/problems/median-of-two-sorted-arrays/submissions/