Tôi đang cố gắng triển khai bộ nhớ cache LFU (Ít nhất được sử dụng thường xuyên) bằng STL thuần túy (Tôi không muốn sử dụng Boost!).Làm cách nào để triển khai bộ nhớ cache LFU bằng STL?
Yêu cầu là:
- truy cập liên tưởng đến bất kỳ yếu tố sử dụng một
Key
như vớistd::map
. - Khả năng phát hành mục ưu tiên thấp nhất (sử dụng thuộc tính
UsesCount
). - Khả năng cập nhật mức độ ưu tiên (
UsesCount
) của bất kỳ mục nào.
Những vấn đề là:
- Nếu tôi sử dụng
std::vector
như container các mặt hàng (Key
,Value
,UsesCount
),std::map
như một container của vòng lặp để vector để truy cập kết hợp vàstd::make_heap
,std::push_heap
vàstd::pop_heap
khi thực hiện hàng đợi ưu tiên trong vectơ, các vòng lặp trong bản đồ không hợp lệ sau các hoạt động đống. - Nếu tôi sử dụng
std::list
(hoặcstd::map
) thay vìstd::vector
trong cấu hình trước,std::make_heap
, v.v. không thể được biên dịch vì các trình vòng lặp của chúng không hỗ trợ số học. - Nếu tôi muốn sử dụng
std::priority_queue
, tôi không có khả năng cập nhật mức độ ưu tiên của mục.
Các câu hỏi là:
- Tôi có thiếu một cái gì đó rõ ràng như thế nào vấn đề này có thể được giải quyết?
- Bạn có thể chỉ cho tôi một số việc thực thi C++/STL thuần túy của bộ đệm LFU đáp ứng các yêu cầu trước đó làm ví dụ không?
Cảm ơn thông tin chi tiết của bạn.
"các vòng lặp trong bản đồ không hợp lệ sau hoạt động đống" - sửa lỗi này bằng cách thực hiện theo cách khác xung quanh - đặt dữ liệu vào 'map', nơi nó sẽ không được di chuyển ngay cả khi các phần tử khác được chèn vào/xóa. Sau đó, đặt các trình vòng lặp bản đồ trong vectơ của bạn và tạo một heap ra khỏi nó. Bạn có lẽ vẫn còn thiếu khả năng cập nhật hiệu quả mức độ ưu tiên của một mục, vì vậy đây không phải là câu trả lời. –
Cảm ơn bạn cho một ý tưởng khác mà không vượt qua tâm trí của tôi. Nhưng nếu tôi có 'std :: vector' của các trình lặp' std :: map', làm thế nào tôi có thể định nghĩa toán tử so sánh của chúng, nó sẽ nhìn vào bên trong đối tượng pointee ở thuộc tính 'UsesCount', để có thể sửa heap bằng cách sử dụng' std :: make_heap' sau khi chèn mục hoặc cập nhật 'UsesCount'? – Blackhex
sử dụng một hàm so sánh như: 'toán tử bool() (MapIter a, MapIterB) {return a-> second.UseCount < b-> giây.UseCount; } ' – Useless