Từ giao diện thông tin lý thuyết, bạn có 2^64
giá trị để ánh xạ vào 2^63-1
giá trị.
Như vậy, lập bản đồ là tầm thường với các nhà điều hành mô đun, vì nó luôn luôn có một kết quả không âm:
y = 1 + x % 0x7fffffffffffffff; // the constant is 2^63-1
Điều này có thể khá đắt tiền, vì vậy những gì khác là có thể?
Toán đơn giản 2^64 = 2 * (2^63 - 1) + 2
cho biết chúng ta sẽ có hai ánh xạ giá trị nguồn cho một giá trị đích ngoại trừ trong hai trường hợp đặc biệt, trong đó ba trường hợp sẽ chuyển sang một giá trị. Hãy coi đây là hai giá trị 64 bit đặc biệt, gọi chúng là x1
và x2
, mỗi giá trị đó chia sẻ mục tiêu với hai giá trị nguồn khác. Trong biểu thức mod
ở trên, điều này xảy ra bằng cách "gói". Giá trị mục tiêu y=2^31-2
và y=2^31-3
có ba ánh xạ. Tất cả những người khác có hai.Vì chúng ta phải sử dụng một cái gì đó phức tạp hơn so với mod
, hãy tìm cách để ánh xạ các giá trị đặc biệt ở bất kỳ nơi nào chúng ta muốn với chi phí thấp. 7] đến y
ở [1..7], thay vì không gian 64 bit.
Một khóa học dễ dàng là có các giá trị x
trong [1..7] bản đồ cho chính chúng, sau đó sự cố giảm để ánh xạ x
trong [-8..0] đến y
trong [1..7]. Lưu ý có 9 giá trị nguồn ở đây và chỉ có 7 mục tiêu như được thảo luận ở trên.
Có nhiều chiến lược rõ ràng. Tại thời điểm này, bạn có thể thấy gazzilion. Tôi sẽ mô tả chỉ một điều đặc biệt đơn giản.
Hãy để y = 1 - x
cho tất cả các giá trị ngoại trừ trường hợp đặc biệt x1 == -8
và x2 == -7
. Các chức năng toàn bộ băm do đó trở thành
y = x <= -7 ? S(x) : x <= 0 ? 1 - x : x;
Đây S(x)
là một chức năng đơn giản mà nói nơi x1
và x2
được ánh xạ. Chọn S
dựa trên những gì bạn biết về dữ liệu. Ví dụ: nếu bạn cho rằng giá trị mục tiêu cao không có khả năng, hãy ánh xạ chúng thành 6 và 7 với S(x) = -1 - x
.
Việc lập bản đồ cuối cùng là:
-8: 7 -7: 6 -6: 7 -5: 6 -4: 5 -3: 4 -2: 3 -1: 2
0: 1 1: 1 2: 2 3: 3 4: 4 5: 5 6: 6 7: 7
Lấy logic này lên đến khoảng 64-bit, bạn phải
y = (x <= Long.MIN_VALUE + 1) ? -1 - x : x <= 0 ? 1 - x : x;
Nhiều loại khác điều chỉnh có thể xảy ra trong khuôn khổ này.
Không, codomain băm dài một lần nữa - nhưng nó phải> 0. Tôi sẽ cập nhật các bài để làm cho nó chính xác hơn. – eold
Lưu ý rằng trong ví dụ "xấu xí" 0 va chạm với 7. – Hounshell
Ví dụ "xấu xí" ánh xạ từ MIN_VALUE đến 0. Và việc nhận 0 là không tốt. –