发新话题
打印

有何好项目或题材可推荐?

本主题由 君子乾乾 于 2008-5-4 01:49 加入精华

跑题太远了

压缩这类属于纯数学问题。软件实现是其次的。
大牛们由实力就发明支持4进制的computer吧。量子计算。还刷什么单,直接本诺贝尔奖了
支持 (0)  反对 (0)

TOP

顶一下
男儿最怕入错行
支持 (0)  反对 (0)

TOP

引用:
原帖由 x_uy_u_n 于 2008-4-24 14:59 发表
不才刚想发一帖阐述比例算法在压缩那里的应用.某大牛动不动就人身攻击,有时候说别人的时候自己却忘记想自己.首先压缩数据是不可能绝对的,因为那最终将会变成零,有个叫信息熵的东西.大牛还说把知识学死了这么一说.在压 ...
不过你的金属棒举例比较歹毒,有故意把人绕进去的嫌疑...

What does it take to make our world different?
支持 (0)  反对 (0)

TOP

我为43791这个数字写的愚蠢的代码

CString str;
double x;
for(int i=1;i<10000;i++)
{
  x = 1.0/i;
  str.Format("%d",x);
  if(str.Find("43791")!=-1)
  {
   str.Format("%d,%d",i,x);
   MessageBox(str);
  }
}
MessageBox("end");

运行结果如下,如果有兴趣可以拷到编译器中试下
   
结果显示算出了两个得数,其中分子为1,分母为4349和8698,加在一起还是5位,而且不包括最后截取值用到的记录单位,还是没能达到压缩的目的。不过这是在  x = 1.0/i;不变的前提下,而且是在一个普通程序员的1分钟代码的情况下,所以我相信,一定会有人做出终极的算法,就像在古代相信将来铁制重好几吨的东西可以飞上天一样。
其实我倒觉得一个人有愚蠢的想法并不可怕,可怕的是想都不敢去想。
附件: 您所在的用户组无法下载或查看附件
本帖最近评分记录
  • enthappy 活力 +10 我很赞同 2008-4-24 23:16
支持 (0)  反对 (0)

TOP

引用:
原帖由 卡斯罗 于 2008-4-24 21:28 发表
我为43791这个数字写的愚蠢的代码

CString str;
double x;
for(int i=1;i
很高兴与你讨论,我不太懂你用的语言,请问1/4349或者1/8698 怎么还原成43791???
支持 (0)  反对 (0)

TOP

标准的c++呀,拷到vc编译器中看弹出的messagebox和数字就行了,不过算法的确愚蠢
支持 (0)  反对 (0)

TOP

引用:
原帖由 卡斯罗 于 2008-4-23 18:05 发表
题材好多的,但主要还是能实现的吧,我想过做一个压缩算法,可以把所有文件压成4字节,原理是设一个分母,一个分子,所除得的二进制多位数小数就是该文件的硬盘表示01,但后来想算了,太难实现了,我是做不了,放弃了 ...
你说的这种方法是算术编码,问题是要表示足够多的信息,你的分子分母(暂且假设可以找到)的精度需要非常高,也就是需要很多字节。4个字节精度是有限的。
走别人的路,让别人无路可走
支持 (0)  反对 (0)

TOP

如果还不是很明白,这里详细介绍一下。

算术编码的原理是,把信息看成是一个一维空间,归一化后到0-1的区间。那么信息的任何可能形态,就是0到1的一个小数。

譬如一句话‘I'm a fool who invent a thing already exist',这里面有30个左右的字符,每个字符有256种可能性,那么这个空间就有 256^30 种可能性, 对应0-1之间256^30个均匀区间(格子),现在这句话肯定是放在某一个格子中的,这个格子假设(我这里只是为了说明而胡乱假设的)是从0.342123242343254354353 46546到0.342123242343254354353 76435之间,那么,就可以仅仅用前面相同的数字0.342123242343254354353 表示这个信息。从而可能重现数据。实现一种分格办法,让信息出现概率越高的,占有越大的空间,那么出现概率越高的话需要的小数点后数字越少,达到压缩目的。这里补充,按照码员或码元组合的概率分配bit是压缩的基本思想,算术压缩如此,huffman压缩如此,lzw也是如此。
走别人的路,让别人无路可走
支持 (0)  反对 (0)

TOP

回头说你的想法,首先,不是所有小数都是有理小数(可以分子分母化),这是高中数学告诉我们的。所以对于某个信息,你可能找不到对应的分子分母。

其次,无论你使用分子分母也好,小数也好,你要表示小数点后任意精度的一个数字,4个字节是不可能做到的。因为4个字节,假设分母分子各占2个字节,那么,分子分母的组合一共只有65536种,也就是说,只能表示65536个数。如果把信息到分子分母的变化看成一个函数,那么这个函数是一个多重影射的函数,多个输入值对应65536个输出结果,反过来说某个输出结果可能对应多个输入,这是什么意思?这个意思就是说输入变化可能你还原不了。为什么是可能?因为65536种变化,多少可以表示一些信息,或许某些就是一一映射的。


ok,科普结束。如果不想看信息论,建议先看看高中数学。
走别人的路,让别人无路可走
支持 (0)  反对 (0)

TOP

引用:
原帖由 卡斯罗 于 2008-4-24 21:28 发表
结果显示算出了两个得数,其中分子为1,分母为4349和8698,加在一起还是5位,而且不包括最后截取值用到的记录单位,还是没能达到压缩的目的。不过这是在  x =1.0/i;不变的前提下,而且是在一个普通程序员的1分钟代码的情况下,所以我相信,一定会有人做出终极的算法,就像在古代相信将来铁制重好几吨的东西可以飞上天一样。
其实我倒觉得一个人有愚蠢的想法并不可怕,可怕的是想都不敢去想。
引用:
原帖由 卡斯罗 于 2008-4-23 18:05 发表 [url=redirect.php?goto=findpost&pid=349901&ptid=80562][/url]
题材好多的,但主要还是能实现的吧,我想过做一个压缩算法,可以把所有文件压成4字节,原理是设一个分母,一个分子,所除得的二进制多位数小数就是该文件的硬盘表示01,但后来想算了,太难实现了,我是做不了,放弃了 ...


坦白滴说,基本没细看你的思路

猜,1,结果4字节,就是压缩结果——“所除得的二进制多位数小数就是该文件的硬盘表示01”,一个分母,一个分子,这两个是根据被压缩的文件用一定方法构造出来的。解压时根据4字节结果逆运算(假定可逆)
2,结果4字节,保存分母和分子(假定4个字节总是可以作到的),压缩来源——“所除得的二进制多位数小数就是该文件的硬盘表示01”

至于是哪一种,确实没去想,因为“可以把所有文件压成4字节”这个结果真的很强悍,借用别人的一个例子打个比喻,O活在欧氏平面空间中,你活在三维空间中,突然你说两点的距离不是直线,请允许我表达一下内心的感受,就是可怕

当然可怕还是有原因的,因为一个事物越简单,它的对立面就越复杂。任何文件不论长短都压成4字节,存储复杂度是常量,很简单(假定能实现)。必然的,它的解压相当复杂,(假定它能实现)。但这样一个压缩解压的方案是很极端的,计算复杂度必然相当高,即使你完成了理论证明(假定总有人可以证明),那也是可信不可用的。

以上全假设可以实现(额全知全能的神啊),不谈现有的任何压缩理论,因为你的理论可能是全新的,新到可能需要一个体系(比如平面空间不够,要三维空间或现有计算机体系不够,要DNA计算机体系或什么未来的)去支撑。

另外,任何一种解决方案都有其适用性,不可能适合解决所有问题,可能大部分用户会选择其他表现平衡一些的方案。

最后,铁当然能造飞机,但是飞机不光是铁就能飞的,问题还在于,你手里的这东西是不是块铁
What does it take to make our world different?
支持 (0)  反对 (0)

TOP

发新话题