Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 如何计算起始-停止编码方案的最佳参数?_Optimization_Data Compression - Fatal编程技术网

Optimization 如何计算起始-停止编码方案的最佳参数?

Optimization 如何计算起始-停止编码方案的最佳参数?,optimization,data-compression,Optimization,Data Compression,开始步骤停止代码是一种数据压缩技术,用于压缩相对较小的数字 该代码的工作原理如下:它有三个参数,开始,步骤和停止。开始确定用于计算前几个数字的位数。步骤确定当我们用完时要添加到编码中的位数,并确定用于编码数字的最大位数 因此,编码的长度由l=开始+步骤*i给出 特定代码的“i”值使用一元编码。也就是说,一个1位的数字后跟一个终止的0位。如果我们已经到达停止,那么我们可以删除终止的0位。如果我是零,我们只写出0位 因此,(1,2,5)开始-步骤-停止代码的工作方式如下: 值0,编码为:0 0 值1

开始步骤停止代码是一种数据压缩技术,用于压缩相对较小的数字

该代码的工作原理如下:它有三个参数,开始,步骤和停止。开始确定用于计算前几个数字的位数。步骤确定当我们用完时要添加到编码中的位数,并确定用于编码数字的最大位数

因此,编码的长度由l=开始+步骤*i给出

特定代码的“i”值使用一元编码。也就是说,一个1位的数字后跟一个终止的0位。如果我们已经到达停止,那么我们可以删除终止的0位。如果我是零,我们只写出0位

因此,(1,2,5)开始-步骤-停止代码的工作方式如下:

值0,编码为:0 0
值1,编码为:0 1
值2,编码为:10000
值9,编码为:10111
值10,编码为:11 00000
值41,编码为:11 11111


那么,给定一个包含多个数字的文件,我们如何计算该文件的最佳开始-步骤-停止代码?最佳参数定义为那些将导致最大压缩比的参数。

我使用的方法是一个简单的蛮力解决方案。算法遵循以下基本步骤:

  • 计算文件中每个数字的频率。在同一过程中,计算文件中的数字总数,并确定最大数字为maxNumber

  • 计算每个数字的概率,将其频率除以文件中的数字总数

  • 确定“最优停止”等于log2(maxNumber)。这是Shannon信息理论中用于表示maxNumber的理想位数,因此是对特定数字编码中使用的最佳最大位数的合理估计

  • 对于从1到“最佳停止”的每个“开始”值,重复步骤5-7:

  • 对于从1到(“最佳停止”-“启动”)/2的每个“步骤”值,重复步骤6和7:

  • 计算最接近“最优停止”的“停止”值,该值满足某个整数i的停止=开始+步骤*i

  • 计算此编码将使用的平均位数。这可以通过给定编码中每个数字的概率乘以其位长度来计算

  • 选择平均位数最低的编码

  • 这些“开始-步骤-停止”代码看起来是另一种调用方式。有关计算它们的伪代码的概要,请参见

    基本上,这就是算法的作用:

    在开始哈夫曼编码之前,需要收集要压缩的每个符号的统计信息(它们在要压缩的文件中的总频率)

    之后,您可以使用该信息创建一个,这样最常用的符号就位于树的顶部(从而使用更少的位),并且没有编码有错误。因为如果编码有一个公共前缀,那么解压时可能会出现歧义

    在哈夫曼编码结束时,起始值将是最浅叶节点的深度,步长将始终为1(从逻辑上讲,这是有道理的,为什么要强制执行比需要更多的位,一次只添加一个位),停止值将是最深叶节点的深度

    如果频率统计数据未排序,则需要O(nlog n)完成,如果按频率排序,则可以在O(n)中完成

    哈夫曼码保证具有这种编码类型的最佳平均压缩:

    哈夫曼能够设计出最完美的 该算法的高效压缩方法 类型:没有其他个体的映射 将源符号转换为唯一的字符串 位将产生较小的平均值 输出实际符号时的大小 频率与过去一致 创建代码

    这将帮助您实现问题的理想解决方案

    编辑:虽然类似,但这不是OP想要的

    这些代码的创建者所做的这篇文章描述了开始-步骤-停止代码、开始-停止代码的泛化。然而,作者在第2节末尾简要描述了如何获得最佳的开始-步骤-停止。它涉及到使用一个统计随机变量,或者用蛮力资助最佳组合。在事先不知道该文件的情况下,算法为O((log n)^3)


    希望这能有所帮助。

    哈夫曼正是我在阅读这个问题时想到的+1.这让我想起了大二的数据结构课程:DHuffman代码不以其长度作为前缀,如开始、步骤和停止代码。因此,您的解决方案不适用。Hrm,我看到了区别。我没有注意到你的段落描述了导致代码的1位字符串。我在这些代码的作者的一篇文章中添加了一个链接来帮助您。我偶然看到了这篇文章,但由于某种原因找不到英文版本。谢谢停止可能高于log2(maxNumber)。您没有考虑可能导致歧义的前缀代码。此外,即使您的停止是正确的,运行时也将是异常的。任何要编码的符号数超过几个的文件都需要很长时间才能使这种方法可行。请再次查看。每个代码都以其长度的一元编码作为前缀。它们的属性是它们不是任何其他一元编码的前缀。为什么您认为运行时会非常重要?请激励。没有一个例子,超过log2(max)的停止会导致许多数字处于较低的级别,节省许多位,而只有少数大的数字需要额外的位吗?而且,当你有确切的数据时,使用概率是很奇怪的。除了兼频。对于每类元素的查找,我看不到/期望有任何改进