ý tưởng duy nhất của tôi là phân tích các tập tin, và lần lượt các dãy IP vào chỉ ints (nhân với 10/100 nếu nó thiếu chữ số) ...
Nếu sau phương pháp này, bạn sẽ có thể muốn nhân với 256^3, 256^2, 256 và 1 tương ứng cho A, B, C và D trong một địa chỉ ABCD Điều đó có hiệu quả tái tạo địa chỉ IP dưới dạng số không dấu 32 bit.
... và đặt chúng trong danh sách, đồng thời đặt giá trị thấp hơn của dãy vào băm làm khóa với vị trí dưới dạng giá trị. Sắp xếp danh sách và thực hiện tìm kiếm nhị phân được sửa đổi một chút. Nếu chỉ mục là lẻ, -1 và tìm trong băm. Nếu nó thậm chí, chỉ cần nhìn vào băm.
Tôi khuyên bạn nên tạo một mảng liền kề (một std::vector
) chứa các cấu trúc có dải dưới và trên (và tên vị trí - được thảo luận bên dưới). Sau đó, như bạn nói bạn có thể tìm kiếm nhị phân cho một phạm vi bao gồm một giá trị cụ thể, mà không có bất kỳ phức tạp lẻ/thậm chí.
Sử dụng đầu dưới của phạm vi làm khóa trong băm là một cách để tránh không gian cho tên vị trí trong mảng, nhưng với số ký tự trung bình trong tên thành phố, kích thước có thể của con trỏ, một sự lựa chọn giữa một bảng băm dân cư thưa thớt và các danh sách chuyển dịch dài để tìm kiếm trong các thùng thay thế liên tiếp hoặc gián tiếp hơn đến các thùng chứa chiều dài tùy ý - bạn cần phải khá tuyệt vọng để làm phiền việc thử. Trong trường hợp đầu tiên, lưu trữ vị trí trong cấu trúc cùng với phạm vi giá trị IP có vẻ tốt.
Hoặc, bạn có thể tạo cây dựa trên ví dụ: các giá trị IP 0-255 riêng lẻ: mỗi cấp trong cây có thể là một mảng gồm 256 giá trị để lập chỉ mục trực tiếp hoặc một mảng được sắp xếp các giá trị được điền. Điều đó có thể làm giảm số lượng so sánh giá trị IP mà bạn có thể cần phải thực hiện (O (log2N) đến O (1)).
Nguồn
2012-03-06 11:13:23
Vui lòng chấp nhận câu trả lời nếu bạn bị thuyết phục. Điều này có thể được hoàn tác sau đó, nếu bạn tìm thấy một câu trả lời tốt hơn :-) – reddragon