二进制数组中如何使用最简便的方法表示1的个数和所处的位置

来源:百度知道 编辑:UC知道 时间:2024/06/17 19:15:41
这个二进制数组足够长M,假设M=1000,其中有N个1,假设N=100,如何用另外几组简单的数据表示出这N个1的具体位置和N的值。
可以简单的设想使用一组数据来表示N的值,这个数有10位就足够了,2^10=1024>1000,因为1的数量不会多于1000。
使用另外一组数据来表明1000位中N个1的具体位置,这才是问题的关键!请各位才子设计比较好的表示方法!
感谢大家的参与
但是问题没有得到有效的解决。我的目的在于缩短在通讯传输过程中需要传输的数据长度,以减少传输错误。简单的说,能把1000位二进制数据中的1的个数和位置用100位或者更短的长度的二进制表示出来才是理想的结果!
特别感谢jeff8888 - 经理 五级和WYlslrt - 助理 三级
避免积分的浪费,把它送给jeff8888 - 经理 五级吧

你是在做数据压缩算法吗?

有很多的算法都可以的,最简单的就是游程编码了。当然我们可以改进一下,比如:1000011100111111000000...
可以表示为:(1,1),(0,4),(1,3),(0,2),(1,6),(0,6),...[这里暂且称(1,1)、(0,4)各为一"节"],即:1个1,4个0,3个1,2个0,6个1,6个0...

这时需要根据这个数据流的特点来选择表达方式,如果不太可能出现一长段的0或1,可以用一个字节来表示两个节,高四位和低四位分别存储一节的信息,比如(1,1)表示为1001,即头一位表示0或者1,后三位表示连续的个数,
再如:
(0,4) 表示为: 0100
(1,3) 表示为: 1011
(0,2) 表示为: 0010
(1,6) 表示为: 1110
(0,6) 表示为: 0110

所以上例中的数据流可以表示为:10010100/10110010/11100110/(这里用"/"表示字节间的分隔,只为了看起来方便)

经过这样一编码,就把整个数据流无损的保存下来了,至于是否压缩以及压缩率就看数据的情况了,极端情况下,不但没压缩,反而还增加了数据量。

这里就不把具体的编码过程用代码方式写在这儿了,仅提供算法思路。另外,对于要判断某位是否为1,或者哪些位为1,只要顺序扫描以上编码就可以容易地得到了。

上面没有说得特别详细,主要是不能确定这是否是你关心的问题,如果是,或者你想要更具体的方法,可以另外再联系。

简言之,你可以把数组转换成十进制的数字来表示。需要的时候再转换成二进制。

楼主是这个目的吗?

需要的时候再算回去,不就知道哪一位上是一哪一位不是一了吗?要是懂位运算的话,甚至都可以直接按位处理直接看那一位是不是一。
直接表示的数组可以,能够算出来位置的为什么就不可以?