Tôi có một bộ số uint32
, có thể có hàng triệu mục trong tập hợp. 50-70% trong số đó là liên tiếp, nhưng trong luồng đầu vào chúng xuất hiện theo thứ tự không thể đoán trước.Cấu trúc dữ liệu để xây dựng và tra cứu tập hợp các dãy số nguyên
tôi cần phải:
Compress bộ này thành dãy để đạt được không gian đại diện hiệu quả. Đã thực hiện điều này bằng cách sử dụng thuật toán tầm thường, vì phạm vi tính toán chỉ một lần tốc độ không quan trọng ở đây. Sau khi số chuyển đổi này có phạm vi kết quả thường là trong khoảng 5 000-10 000, nhiều trong số đó là một mục duy nhất, tất nhiên.
Kiểm tra thành viên của một số số nguyên, thông tin về phạm vi cụ thể trong tập hợp là không bắt buộc. Cái này phải rất nhanh - O (1). Đã suy nghĩ về minimal perfect hash functions, nhưng chúng không chơi tốt với các phạm vi. Bitsets rất không hiệu quả. Các cấu trúc khác, như cây nhị phân, có độ phức tạp của O (log n), điều tồi tệ nhất với chúng là việc triển khai thực hiện nhiều bước nhảy có điều kiện và bộ vi xử lý không thể dự đoán chúng cho hiệu suất kém.
Có cấu trúc dữ liệu hoặc thuật toán chuyên biệt trong dãy số nguyên để giải quyết tác vụ này không?
Bạn có thể cụ thể hơn một chút về những hoạt động bạn cần không? Từ những gì tôi đã đọc, bạn có một tập hợp các phạm vi từ trước, và từ chúng bạn muốn hỗ trợ hoạt động "phạm vi nào, nếu có, chứa số nguyên đã cho?" Điều này có đúng không? – templatetypedef
@templatetypedef: Tôi chỉ cần có/không có câu trả lời cho "là số này trong bộ?" cho đặt trước. Câu hỏi chính là làm thế nào để làm điều đó trong O (1) với các yêu cầu không gian thực tế. – actual
Một suy nghĩ khác - bạn có cân nhắc sử dụng một thứ gì đó giống như một biểu đồ quyết định nhị phân không? Tôi nhớ rằng Don Knuth đã từng nói về việc sử dụng các biểu đồ quyết định nhị phân không bị đè nén để mã hóa các hàm hầu hết là 0 (trong trường hợp của bạn, bạn có một hàm từ 32 bit cho dù số đó có mặt không, và phần lớn thời gian không phải là). Điều này sẽ cung cấp cho bạn thời gian tra cứu O (1) của bạn (vì mỗi lần tra cứu mất tối đa 32 bước), mặc dù tôi không chắc chắn về hiệu quả của không gian. – templatetypedef