Cách thành ngữ nhất để chuyển đổi tập hợp số nguyên thành một tập hợp dải ô là gì?Chuyển đổi bộ số nguyên thành phạm vi
Ví dụ: với tập hợp {0, 1, 2, 3, 4, 7, 8, 9, 11}, tôi muốn nhận {{0,4}, {7,9}, {11,11}}.
Giả sử chúng tôi đang chuyển đổi từ std::set<int>
thành std::vector<std::pair<int, int>>
. Tôi xử lý các phạm vi bao gồm cả hai bên, vì nó thuận tiện hơn trong trường hợp của tôi, nhưng tôi cũng có thể làm việc với phạm vi kết thúc mở nếu cần.
Tôi đã viết chức năng sau, nhưng tôi cảm thấy muốn phát minh lại bánh xe. Xin vui lòng cho biết có thể có một cái gì đó trong STL hoặc tăng cho việc này.
typedef std::pair<int, int> Range;
void setToRanges(const std::set<int>& indices, std::vector<Range>& ranges)
{
Range r = std::make_pair(-INT_MAX, -INT_MAX);
BOOST_FOREACH(int i, indices)
{
if (i != r.second + 1)
{
if (r.second >= 0) ranges.push_back(r);
r.first = i;
}
r.second = i;
}
ranges.push_back(r);
}
Tôi không thể nhìn thấy một kỹ thuật là lớn hơn O (n) cho loại điều. Sự gia tăng tốc độ duy nhất là tích hợp điều này vào sắp xếp của bạn (nếu bạn đang làm một) – dangerstat
@dangerstat: điều này sẽ xuất hiện một câu hỏi khác: nếu có tồn tại một cấu trúc dữ liệu lưu trữ danh sách các Ranges (một số loại cây tôi đoán?). Hiện tại tôi sử dụng lệnh std :: set để lưu trữ thông tin về các mục của danh sách được đánh số được chọn. –
một bộ là nội bộ một cây – Manuel