Tôi muốn lọc một cách hiệu quả một danh sách các số nguyên cho các bản sao theo cách mà chỉ tập hợp kết quả cần được lưu trữ.
Một cách này có thể được nhìn thấy:
- chúng tôi có một loạt các số nguyên với N lớn (nói 2 40 )
- chúng ta có một hàm với, được cho là có nhiều va chạm (hình ảnh được phân bố đồng đều trong S )
- sau đó chúng ta cần lưu trữ , đó là { f ( x ) | x ∈ S }
Tôi có một ước tính khá chính xác (xác suất) về những gì là, và do đó có thể phân bổ cấu trúc dữ liệu trước (nói | f [ S ] | ≈ 2 30 ).
Tôi đã có một vài ý tưởng, nhưng tôi không chắc đâu là cách tiếp cận tốt nhất:
- một bitet nằm ngoài câu hỏi vì bộ đầu vào không vừa với bộ nhớ.
- một bảng băm, nhưng (1) nó yêu cầu một số chi phí bộ nhớ, giả sử 150% của và (2) bảng phải được khám phá khi được xây dựng đòi hỏi thêm thời gian vì chi phí bộ nhớ.
- một loại "trên đường bay", tốt nhất là với độ phức tạp (loại không so sánh). Về điều đó, tôi không chắc sự khác biệt chính giữa loại xô và flashsort là gì .
- một mảng đơn giản với cây tìm kiếm nhị phân, nhưng điều này đòi hỏi thời gian .
- có thể sử dụng các bộ lọc Bloom hoặc cấu trúc dữ liệu tương tự có thể hữu ích trong việc thư giãn (với các kết quả dương tính giả) của vấn đề.
Một số câu hỏi về stackoverflow dường như giải quyết vấn đề này ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-looking-trùng lặp ), nhưng dường như không có gì phù hợp với yêu cầu của tôi.