|
|
1
16
使现代化 我忍不住要为第一个问题想出我自己的解决方案,尽管它不做压缩。下面是一个使用第三方分解算法pyecm的Python解决方案。 这个解决方案可能比叶夫根尼的方案效率高几个数量级。计算y的合理值需要几秒钟而不是几小时,甚至几周/年。对于x=2^32-1和y=256,我的核心duo 1.2 ghz需要1.68秒。
对第一个问题的答复 你说你想压缩数字,但从你的例子来看,那些序列比未分解的数字要长。如果没有您遗漏的系统的更多细节(序列概率/是否有可编程客户端?),则无法压缩这些数字。你能详细说明一下吗? 这是一个数学解释,解释了为什么当前对问题第一部分的回答永远无法解决第二个问题。这与背包问题无关。
这是香农的熵算法。它告诉你需要代表序列{x0,x1,x2,…,xn-1,xn}的理论最小位数,其中p(Xi)是看到令牌席席的概率。
当我们将它插入香农算法时,它将告诉我们表示流所需的最小位数。
毫不奇怪,熵是32。 我们需要32位来表示一个整数,其中每个数字的可能性相等。减少这个数字的唯一方法,是增加一些数字的概率,减少其他数字的概率。您应该更详细地解释流。 对第二个问题的答复 正确的方法是在与HTTP通信时使用base64。显然Java在标准库中没有这个功能,但我找到了一个指向免费实现的链接: http://iharder.sourceforge.net/current/java/base64/ 下面是“伪代码”,它在Python中工作得非常好,并且应该不难转换为Java(我的Java已经生锈了):
如果您可以控制web服务器和web客户端,并且可以毫无问题地解析整个HTTP请求,则可以升级到base85。根据维基百科, url encoding allows for up to 85 characters
这里是逆运算:
如您所见,基数越高,表示数字所需的符号就越少。在base64中,需要大约11个符号来表示一个长的。在base85处,它变为约10个符号。 |
|
|
2
6
我认为base64是最好的解决方案,因为有处理它的标准函数,而这种想法的变体并没有带来太多改进。这里的其他人对此作出了更详细的回答。
原始答复: 你是说像这样的?
|
|
|
3
5
听起来好像你想压缩随机数据——由于信息论的原因,这是不可能的。(见 http://www.faqs.org/faqs/compression-faq/part1/preamble.html 问题9.)在数字的串联二进制表示形式上使用Base64,然后使用它。 |
|
|
4
4
这个问题使许多加密功能成为可能(即使用128位密钥的RSA,长度是它的一半。)wiki页面包含一些很好的资源,可以帮助您解决问题。 所以,你的脑筋急转弯确实是脑筋急转弯。。。如果你能有效地解决这个问题,我们可以将你的数学技能提升到平均水平以上! |
|
|
5
3
更新后的完整故事
进一步打包URL的一种方法是您提到的Base64。
更新 只是重申问题无法解决。对于Y=64,不能在乘法器+余数中写入87681,其中每一个都低于64。换句话说,您不能用低于64的乘法器写出任何数字87617..87681。每个数字都有一个超过64的基本项。87616可以写在64以下的基本术语中,但是你需要那些+65,所以剩下的将超过64。 因此,如果这只是一个脑筋急转弯,它是无法解决的。除了使用乘法和余数之外,是否还有其他可以实现的实际用途? 是的,这确实应该是一个评论,但我在某个时候失去了评论的能力P 我相信最接近的解决方案是叶夫根尼的。扩展Yevgeny的解决方案以消除余数的限制也很容易,在这种情况下,它将能够找到乘法器小于Y且余数尽可能小的解决方案,即使大于Y。
如果限制数组中的每个数字必须低于y,则没有解决方案。给定足够大的x和足够小的y,你将在一个不可能的情况下结束。例如y为2,x为12,得到2*2*2+4,因为2*2*2*2等于16。即使你允许abs(n)在y以下的负数也不行,因为在上面的例子中你需要2*2*2*2-4。 我认为这个问题是NP完全的,即使你把问题限制在已知答案的输入上,最后一项小于y。这听起来很像[背包问题][1]。当然,我可能错了。 编辑: 如果没有更准确的问题描述,就很难解决问题,但一种变体可能以以下方式工作:
|
|
|
6
2
OP写道:
我以前也曾走过这条路,为了节省你的时间,我会告诉你,学习所有的数学很有趣: http://en.wikipedia.org/wiki/Kolmogorov_complexity 简而言之,通过更改符号,可以轻松压缩某些字符串:
其他人不能:
编辑: 如果您试图为一组唯一的数据创建RESTful URL,为什么不使用散列,比如MD5?然后将散列作为URL的一部分,然后根据散列查找数据。还是我遗漏了一些明显的东西? |
|
7
1
您选择的原始方法
两种压缩弹簧的方法立即浮现在脑海中,这两种方法都可以从数字表示中节省10%以上的空间。 64位数字的范围为(无符号):
在这两种情况下,您都需要将所使用的20个字符(不带逗号)减少到更小的值。
第一种方法是简单地将base64编码的数字BCD化(实际上是一个稍微修改过的base64)
将其转换为BCD将把两个数字(或一个符号和一个数字)存储到一个字节中,立即将空间减少50%(10字节)。将其编码为base 64(即每3个字节转换为4个base64字符),将前9个字节转换为12个字符,第10个字节转换为2个字符,总共14个字符,这节省了30%。 唯一更好的方法是只对二进制表示进行base64编码。这更好,因为BCD有少量损耗(每个数字只需要大约3.32位来存储[log] 10] ,但BCD使用4)。
如果你愿意 压缩,有73个字符可用于URL编码:
当然,这是最大值导致的最大压缩。在量表的另一端(1位),这种编码实际上会导致 更多
|
|
|
8
1
更新: 我现在用另一种方式处理大素数的情况。这样,无论哪种方法都可以得到结果。
这里是我提出的一些递归代码。我更愿意用一些函数式语言编写它,但Java是必需的。我没有费心将数字转换成整数,但这应该没那么难(是的,我很懒;)
|
|
|
9
1
本机Python解决方案
我推荐的标准模块是
以下代码应适用于任何普通的Python安装:
|
|
|
10
1
Wrt原始算法请求:最后一个数字的大小是否有限制(超过此限制后,它必须存储在32b整数中)?
与目前给出的大多数答案相比有点简单,但它实现了原始帖子的预期功能。。。有点脏,但希望有用:) |
|
|
11
0
这不是模数吗?
允许
|
|
|
12
0
只需设置x:=x/n,其中n是 最大的 |
|
|
13
0
就像我在上面的评论一样,我不确定我是否完全理解这个问题。但是假设整数(n和给定的y),这应该适用于您所述的情况:
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 2 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 2 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 2 年前 |