3 回答

TA貢獻1798條經驗 獲得超7個贊
2N
N
16
0 to 2^16 -1
2^16 * (2^16 -1)
2^16 * (2^16 -1)
2^32 - 2^16
32
Cantor配對函數:
(a + b) * (a + b + 1) / 2 + a; where a, b >= 0
兩個最大的16位整數(65535,65535)的映射將是8589803520,正如您所看到的,這不能適合32位。
a >= b ? a * a + a + b : a + b * b; where a, b >= 0
現在(65535,65535)的映射將是4294967295,正如您所看到的,這是一個32位(0到2^32-1)整數。這就是這個解決方案理想的地方,它只是利用了空間中的每一個點,所以沒有什么能獲得更高的空間效率。
signed 16
-(2^15) to 2^15 -1
a
b
0 to 2^15 - 1
.
Cantor配對函數:
兩個最大16位有符號整數(32767,32767)的映射將是2147418112,這只是缺少有符號32位整數的最大值。
(32767,32767)=>1073741823,小得多。
Cantor配對函數:
A = a >= 0 ? 2 * a : -2 * a - 1; B = b >= 0 ? 2 * b : -2 * b - 1; (A + B) * (A + B + 1) / 2 + A;
(-32768,-32768)=>8589803520,即64。16位輸入的64位輸出可能是不可原諒的!
Szudzik函數:
A = a >= 0 ? 2 * a : -2 * a - 1; B = b >= 0 ? 2 * b : -2 * b - 1; A >= B ? A * A + A + B : A + B * B;
(-32768,-32768)=>4294967295,對于無符號范圍是32位,對于有符號范圍是64位,但是更好。
A = a >= 0 ? 2 * a : -2 * a - 1; B = b >= 0 ? 2 * b : -2 * b - 1; C = (A >= B ? A * A + A + B : A + B * B) / 2; a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1; (-32768, 32767) => -2147483648 (32767, -32768) => -2147450880 (0, 0) => 0 (32767, 32767) => 2147418112 (-32768, -32768) => 2147483647
2
-1
.
16
32
public static long PerfectlyHashThem(int a, int b) { var A = (ulong)(a >= 0 ? 2 * (long)a : -2 * (long)a - 1); var B = (ulong)(b >= 0 ? 2 * (long)b : -2 * (long)b - 1); var C = (long)((A >= B ? A * A + A + B : A + B * B) / 2); return a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1; } public static int PerfectlyHashThem(short a, short b) { var A = (uint)(a >= 0 ? 2 * a : -2 * a - 1); var B = (uint)(b >= 0 ? 2 * b : -2 * b - 1); var C = (int)((A >= B ? A * A + A + B : A + B * B) / 2); return a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1; }
2N
4N
2
2N
).

TA貢獻2019條經驗 獲得超9個贊
int combine(short A, short B) { return A<<16 | B; } short getA(int C) { return C>>16; } short getB(int C) { return C & 0xFFFF; }
添加回答
舉報