【问题标题】:Encoding system sorted by the number of 1按数字1排序的编码系统
【发布时间】:2014-12-24 00:04:56
【问题描述】:

我想到了一个编码系统。 arr[(encoded code)]=(decoded code) 关注:

  • arr 是一个二进制非负整数数组,小于 2^16 (pow(2, 16))。

  • arr[0]=0

  • 每个arr[1...16] 都有一个 1。(1、10、100、1000...)
  • 每个arr[17...136] 有两个1。 (11、101、110、1001...)
  • 每个arr[137...696] 都有三个1。 (111、1011、1101、1110……)

  • ...arr[(sum of 16C(n-1))...(sum of (16Cn))-1] 中的每个二进制文件都有n 1s。

  • 每个arr[65519...65534] 都有十五个 1。
  • arr[65535] 是 2^16-1 (1111 1111 1111 1111)。

我没有决定如何在每个部分中排序,这没关系。 (但是,节应按 1 的数量排序。)合适的编码-解码算法将决定如何排序。 (例如,如果算法没问题,它可以是arr[1]=4arr[2]=2arr[3]=8。)

我想制作一个编码函数和解码函数而不在这个表中搜索。有什么好的解决方法和排序方法吗?

【问题讨论】:

  • 将其转换为二叉树算不算“在表中搜索”?
  • @Jongware 是的,但如果你的想法实际上比制作这张桌子要小,那也没关系。

标签: algorithm data-structures


【解决方案1】:

让我们让C(i, j) 成为长度为i 的二进制字符串的计数,恰好是j 1s。这是众所周知的choose函数,计算为i! / (j! * (i-j)!)

让我们按如下方式对它们进行排序。首先是C(16, 0),没有1s。然后是C(16, 1) 和一个1。然后是C(16, 2) 和两个1s,依此类推。在一个组中,我们按字典顺序排序。因此,在C(16, 2) 组中,我们将C(15, 2) 与两个尾随1s 和一个前导0 放在一起,然后将C(15, 1) 与一个前导1 和一个尾随1 放在某处。

现在给定一个二进制字符串,在它之前有哪些?如果这个有i ,则所有1s 较少的那些是C(16, 0) + C(16, 1) + ... + C(16, i-1)。然后对于字符串中的每个1,我们知道有多少匹配到那个位置,在那里有一个0,其余的1s 稍后。这是以前的一组。这些都是以前的,所以把它们加起来,我们就知道这个位置了。这个计算最多需要 16 个步骤来计数,1s 更少,@987654347 最多需要16 步骤@s 在二进制数中最多 32 步。

那另一种方式呢?我们首先继续减去f(16, 0)f(16, 1),等等,直到我们找出二进制数中必须有多少1s。然后我们从左边开始,继续找出每个数字之前是否需要足够的数字,我们可以放入1 并减去我们找到的组,或者这里是否应该有0。同样,这最多需要 32 个步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    相关资源
    最近更新 更多