当前位置:  开发笔记 > 编程语言 > 正文

项目欧拉#219

如何解决《项目欧拉#219》经验,为你挑选了1个好方法。

我正在努力做项目Euler 219号,但我没有掌握它.我正在尝试使用Python,根据项目Euler应该能够在一分钟内完成它!这让我觉得他们不可能想要我计算每个单独的位串,因为在Python中它太慢了 - 必须有一个子O(n)算法.

我查看了一个递归解决方案,它存储了位串可能的前缀,以便它可以快速选择一个新的位串,甚至可以将它们分组考虑.这仅适用于超过10的强制值:

cost(1) = 1
cost(2) = 5
cost(3) = 11
cost(4) = 18
cost(5) = 26
cost(6) = 35
cost(7) = 44
cost(8) = 54
cost(9) = 64
cost(10)= 74
cost(11)= 85
cost(12)= 96

过去这个,我正在努力理解如何减少问题.总是可以制作如下的模式:

1
01
001
0001
00001
00000

但对于7位以上的字符串来说,这不是最佳选择.任何人都可以指导我应该考虑什么?



1> Adam Rosenfi..:

蛮力不是正确的做法.这是其中一个问题,如果你知道某件事情,那并不难,但如果你从未听说过这件事,那实际上是不可能的.那东西是霍夫曼树.

[编辑]进一步审查后,似乎你无法在具有特定频率的N个节点上构建一个霍夫曼树,因为字符串的成本函数是4*(#of 1)+(#of 0).如果cost函数是字符串的长度(或其倍数),那么您可以创建一个Huffman树.

任何无前缀的代码集都可以表示为类似霍夫曼的二叉树,其中每个节点具有0或2个子节点,叶节点表示代码.给定具有N个节点的树,我们可以构造具有N + 1个节点的树,如下所示:

    选择成本最小的叶子节点,其中叶子节点的成本为4*(从根到叶子的路径上的#的1)+(路径上的0的#)

    将2个子节点添加到该节点

因此,如果节点的代码以前是xxxx,那么我们从代码集中删除该代码(因为它不再是叶子),并添加两个代码xxxx0和xxxx1.代码集的总成本现在增加了

`cost(xxxx0)+ cost(xxxx1) - cost(xxxx)= cost(0)+ cost(1)+ cost(xxxx)= 5 + cost(xxxx)

因此,mincost(N + 1)<= mincost(N)+ 5 +成本(N的最佳解决方案中最便宜的代码).我的理论是,不平等应该是平等的,但我还没有能够证明它.对于您列出的所有强制强制的值,此声明实际上是相等的.

如果它是平等的,那么要解决问题,你会做的是:

    从空代码开始,总成本为零

    从1到10 9迭代,执行:

      在代码集中找到最便宜的代码

    通过追加0和1将该代码拆分为两个

    将该代码的成本+ 5添加到总成本中

如果使用优先级队列,则应该能够在O(N log N)时间内执行此操作.考虑到10 9的上限,这可能是也可能是不可行的.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有