|
|
1
271
Cantor pairing function
考虑到其简单、快速和节省空间,它确实是其中一个更好的,但Wolfram发表了一些更好的东西
by Matthew Szudzik, here
Cantor配对函数的局限性(相对而言)是编码结果的范围并不总是保持在
康托尔配对函数 :
进入 Szudzik函数 :
现在考虑到我们通常处理语言/框架中各种大小的数字的签名实现,让我们考虑一下
康托尔配对函数 :
现在 Szudzik函数 :
让我们考虑负整数。这超出了我所知道的最初问题,但只是为了帮助未来的游客。 康托尔配对函数 :
Szudzik函数 :
现在所有这些,虽然输出一直是正的。在签名世界中, 如果我们能把一半的输出转移到负轴上,那将更节省空间 你可以对Szudzik这样做:
我做什么:在施加重量后
查看结果,了解签名范围内的任何输入
这是一个C#实现。
由于中间计算可能超过以下限制
我提供的关于替代解决方案的链接很好地描绘了利用空间中每个点的函数图。 |
|
|
2
260
你在找一个双射词
三点意见:
|
|
3
57
如果A和B可以用2个字节表示,则可以将它们组合在4个字节上。把A放在最重要的一半,把B放在最不重要的一半。 在C语言中,这给出了(假设sizeof(short)=2,sizeof(int)=4):
输入
铸造
这
您可以将其与签名类型一起使用,至少是getA和getB,并且可以返回签名类型
您可能想使用
|
|
|
4
16
这有可能吗?
还是我的逻辑有缺陷? |
|
|
5
10
让号码
那么,结果是
|
|
|
6
9
正整数的标准数学方法是使用素数分解的唯一性。
缺点是图像往往跨越相当大的整数范围,因此当涉及到在计算机算法中表示映射时,您可能会在为结果选择合适的类型方面遇到问题。
你可以修改这个来处理负面
例如
|
|
|
7
6
尽管Stephan202的答案是唯一真正通用的,但对于有界范围内的整数,你可以做得更好。例如,如果你的范围是0..10000,那么你可以这样做:
结果可以容纳在一个整数中,范围可达整数类型基数的平方根。这比Stephan202更通用的方法更有效。它的解码也相当简单;对于初学者来说,不需要平方根:) |
|
|
8
5
|
|
|
9
4
我不明白你的意思:
我如何在这个论坛上写(大于)、(小于)个字符? |
|
|
10
4
这是基于@nawfal给出的方法将@DoctorJ的代码扩展到无界整数。它可以编码和解码。它适用于普通数组和numpy数组。
|
|
11
3
检查这个: http://en.wikipedia.org/wiki/Pigeonhole_principle 。如果A、B和C属于同一类型,则无法完成。如果A和B是16位整数,C是32位整数,那么你可以简单地使用移位。 哈希算法的本质是,它们不能为每个不同的输入提供唯一的哈希。 |
|
|
12
3
构建映射并不难: 1 2 3 4 5 use this mapping if (a,b) != (b,a)
1 0 1 3 6 10
2 2 4 7 11 16
3 5 8 12 17 23
4 9 13 18 24 31
5 14 19 25 32 40
1 2 3 4 5 use this mapping if (a,b) == (b,a) (mirror)
1 0 1 2 4 6
2 1 3 5 7 10
3 2 5 8 11 14
4 4 8 11 15 19
5 6 10 14 19 24
0 1 -1 2 -2 use this if you need negative/positive
0 0 1 2 4 6
1 1 3 5 7 10
-1 2 5 8 11 14
2 4 8 11 15 19
-2 6 10 14 19 24
弄清楚如何得到任意a,b的值有点困难。 |
|
|
13
3
让我们有两个数字B和C,将它们编码为单个数字A A=B+C*N 哪里 B=A%N=B C=A/N=C |
|
|
14
1
为了将两个对象映射到另一个单独的集合,映射的集合必须具有预期组合数量的最小大小: 假设是32位整数,则有2147483647个正整数。在顺序无关紧要且重复的情况下选择其中两个,得到2305843008139952128个组合。这不适合32位整数集。 但是,您可以将此映射调整为61位。使用64位整数可能是最简单的。将高位字设置为较小的整数,低位字设置为较大的整数。 |
|
|
15
1
更简单的方法怎么样:给定两个数字,A和B让str是连接:'A'+';B然后让输出为hash(str)。我知道这不是一个数学答案,但一个简单的python(内置哈希函数)脚本应该能完成这项工作。 |
|
|
16
1
假设你有一个32位整数,为什么不把a移到前16位的一半,把B移到另一半呢?
除了尽可能节省空间和计算成本外,一个非常酷的副作用是,你可以对压缩数进行向量数学运算。
|
|
|
17
1
如果你想要更多的控制,比如为第一个数字分配X位,为第二个数字分配Y位,你可以使用以下代码:
我总共使用了32位。这里的想法是,如果你想让第一个数字最多10位,第二个数字最多12位,你可以这样做:
现在您可以存储在
要设置num A和num B的值:
现在
要获取num b:
编辑:
感谢来源:
https://www.geeksforgeeks.org/extract-k-bits-given-position-number/
|
|
|
18
1
我们可以在O(1)空间和O(N)时间中将两个数字编码为一个。
即使是两位数的整数,比如56和45,56*100+45=5645。我们可以通过做5645/100和5645%100再次获得单个数字 但是对于大小为n的数组,例如a={4,0,2,1,3},假设我们想对3和4进行编码,所以:
概括起来,我们得到
但我们也需要注意我们改变的价值;所以它最终会变成
您可以通过除法并找到结果数的模来单独获得每个数字。 |
|
|
19
0
给定正整数A和B,设D=A的位数,E=B的位数 结果可以是D、0、E、0、a和B的串联。 示例:A=300,B=12。D=3,E=2,结果=30203012。 这利用了以0开头的唯一数字是0的事实, 优点:易于编码,易于解码,人类可读,可以先比较有效数字,无需计算即可进行比较,简单的错误检查。 缺点:结果的大小是一个问题。但没关系,为什么我们无论如何都要在计算机中存储无界整数。 |
|
|
20
0
将以下两个非负整数合并 你可以简单地将它们的数字交织成一个。 示例:12345和678:
结果为1020364758。 您可以使用任何基数(例如基数2或基数16)进行此操作。结果最多是最大数字的两倍,这意味着例如将两个16位数字组合在一起总是适合32位。 如果我们也想允许负整数,我们可以通过将绝对值乘以2来编码一个或两个,如果数字为负,则加1。解码时,模数2将指示符号。 我们可以将这种方法扩展到小数,例如,如果我们想合并1234.5和6.78:
结果为10203046.5708。(这在编程中可能不是很有用,除非你使用定点数。) 请注意,我们如何利用前导零在整数部分不重要的优势,就像尾随零在小数部分不重要一样。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |