Rời rạc hóa
Giới thiệu
Rời rạc hóa là một kỹ thuật xử lý dữ liệu, về bản chất có thể xem như một dạng băm, đảm bảo sau khi băm vẫn giữ được quan hệ toàn/phần thứ tự ban đầu.
Nói một cách dễ hiểu, khi một số dữ liệu quá lớn hoặc kiểu dữ liệu không hỗ trợ nên không thể dùng trực tiếp làm chỉ số mảng để xử lý, trong khi thứ tự tương đối giữa các phần tử mới là yếu tố ảnh hưởng kết quả, ta có thể xử lý dữ liệu theo thứ hạng của chúng, tức là rời rạc hóa.
Dữ liệu cần rời rạc có thể là số nguyên lớn, số thực, chuỗi, v.v.
Cài đặt
Rời rạc một mảng và hỗ trợ truy vấn là tình huống khá phổ biến.
Cách 1
Thông thường mảng gốc có phần tử trùng nhau, và ta rời rạc các phần tử trùng thành cùng một giá trị.
Các bước:
-
Tạo bản sao của mảng gốc.
-
Sắp xếp bản sao theo thứ tự tăng dần.
-
Loại bỏ phần tử trùng lặp trong bản sao đã sắp xếp.
-
Với mỗi phần tử của mảng gốc, tìm vị trí của nó trong bản sao, vị trí chính là thứ hạng và là giá trị sau rời rạc.
1 2 3 4 5 6 7 8 | |
Các thuật toán STL dùng trong đoạn này có thể xem tại STL 算法.
Tương tự, ta cũng có thể rời rạc std::vector:
1 2 3 4 5 6 | |
Cách 2
Theo yêu cầu đề bài, đôi khi các phần tử bằng nhau cần được rời rạc thành các giá trị khác nhau theo thứ tự xuất hiện.
Khi đó dùng std::lower_bound() sẽ khó, cần đổi cách làm:
-
Tạo bản sao của mảng gốc, đồng thời lưu vị trí xuất hiện của mỗi phần tử.
-
Sắp xếp bản sao theo giá trị tăng dần; nếu giá trị bằng nhau thì theo thứ tự xuất hiện tăng dần.
-
Gán giá trị rời rạc trở lại mảng gốc.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Độ phức tạp
Với cách 1, bỏ trùng có độ phức tạp \(O(n)\), sắp xếp là \(O(n \log n)\), cuối cùng \(n\) lần tìm kiếm là \(O(n \log n)\).
Với cách 2, độ phức tạp sắp xếp là \(O(n \log n)\).
Vì vậy tổng độ phức tạp thời gian của cả hai cách đều là \(O(n \log n)\).
Độ phức tạp bộ nhớ là \(O(n)\).
Bài tập
Last updated on this page:, Update history
Found an error? Want to help improve? Edit this page on GitHub!
Contributors to this page:GavinZhengOI, PlanariaIce
All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply