30/09/2018, 23:44
Loại bỏ phần tử trùng của hai mảng
Một bài giải thuật vui nữa
Cho hai mảng có m và n phần tử. Hai mảng này chứa số CMND, có trùng. Tạo ra một mảng mới với toàn bộ các số CMND, không trùng.
Phân tích time complexity và space compexity khi
- m ~ n : số lượng phần tử gần bằng nhau
- m >> n : m nhiều hơn hẳn n
Input:
- m: số phần tử mảng 1
- các phần tử mảng 1
- n: số phần tử mảng 2
- các phần tử mảng 2
Output:
mảng mới, không trùng
Ví dụ:
Input mẫu:
8
1 2 5 4 7 8 9 6
5
4 11 12 7 6
Output mẫu:
1 2 5 4 7 8 9 6 11 12
Luật bất thành văn:
- Có thể sử dụng mọi ngôn ngữ
- Phân tích cách giải quyết vấn đề
Bài liên quan
C với C++ trước:
Dùng qsort: time: (m+n)log(m+n), space: m+n
C++
Tương tự code cpp cho python:
Em dùng Python, đưa vào set mọi phần tử mảng 1 và mảng 2.
space (m+n)
time O(m+n)
mỗi mảng có phần tử trùng trong đó không anh?
Với giải thuật của em thì đâu quan trọng?
Nếu nhờ “hỗ trợ” từ ngôn ngữ thì sử dụng STL unordered_set C++ hoặc HashSet java hoặc các cấu trúc tương đương trong các ngôn ngữ khác nếu có để làm. Time complexity: O(N+M), extra space complexity: O(N+M)
Nếu tự thân vận động thì sort lại 2 mảng ban đầu, sau đó sử dụng two pointer, dùng 2 biến chỉ số chạy song song trên 2 mảng để insert vào mạng thứ 3. Time complexity: O(NlogN + MlogM), extra space complexity: O(N+M)
Ngoài ra ở cách thứ 2, nếu ai không quen dùng Two pointer (đoạn sử dụng two pointer để tạo mảng C không trùng này là O(N+M)), thì vẫn có thể làm theo một cách khác:
Space complexity vẫn là O(N+M) nhưng time complexity là O((N+M)log(N+M))
Nếu phân tích kỹ thì cả 2 cách sort rời 2 mảng và gộp 2 mảng lại sort, ở đoạn duyệt sau khi sort xong đều có thêm 1 chi phí tuyến tính O(N+M), nhưng khi N, M lớn thì nó không là gì so với NlogN, MlogM hay (N+M)log(N+M) nên có thể bỏ qua nó luôn
Bài em thì chủ yếu ở set
Hỏi vẩn vơ thôi, tại thấy có trường hợp m>>n, với trường hợp này thì space là O(m), time O(m).
lâu không làm, để nhớ lại bài nào đăng chơi câu view xem.
có cái
std::set_union
cũng hay lắm đóvới input như trên thì nó in ra:
khỏe re
có thể ko cần mảng thứ 3 vẫn được chứ nhỉ? Khi “merge” 2 mảng đã sorted lại chỉ cần nhớ phần tử cuối cùng của mảng thứ 3 là được. Merge tới đâu xuất tới đó khỏi cần mảng thứ 3.
nếu chỉ xuất không thì chỉ cần 2 mảng ban đầu là được