需要帮助了解Sardinas-Patterson算法(提供的算法和示例)

时间:2012-08-14 04:04:09

标签: algorithm math

我很难从下面的幻灯片中了解Sardinas-Patterson算法:

enter image description here

我们如何获得C1和C2 ???

我也从互联网上获得了这些信息:

算法是有限的,因为添加到列表中的所有悬空后缀都是有限的一组码字的后缀,并且最多可以添加一次悬挂后缀。

  • {0,01,11}。代码字0是前缀01,因此添加悬空后缀1. {0,01,11,1}。代码字0是前缀01,但悬挂后缀1已经在列表中;代码字1是11的前缀,但悬挂后缀1已经在列表中。没有其他悬空后缀,因此得出结论,该集合是唯一可解码的。
  • {0,01,10}。代码字0是前缀01,因此将悬挂后缀1添加到列表中。 {0,01,10,1}。码字1是10的前缀,但悬挂后缀0是码字。因此,得出结论,代码不是唯一可解码的。

3 个答案:

答案 0 :(得分:8)

wiki article是一个很好的解释

幻灯片中的C对应于维基文章中的S i

以下是我的描述:

重要的操作是从C中获取两个字符串,如果其中一个字符串是另一个字符串的前缀,则记录删除前缀时留下的后缀。 这就是如何获得C 1

使用以下C 2 ,C 3 等。 你再次想要从C中找到来自C i 的单词前缀的单词并取剩余的后缀,但你也要查看C_i中的单词并删除C中的单词和前缀中的单词。 C (i + 1)是这些集合的并集。

只要某个C i 包含来自C的单词,您就知道该代码不是唯一可解码的。

所以:

C = 1,011,01110,1110,10011

C 1 = 110(因为(1)110在C中),0011(因为(1)0011在C中),10(因为(011)10在C中)

C 2 = {10(因为(1)10在C 1 ),0(因为(1)0在C 1 )} union {011,因为(10)011在C}

答案 1 :(得分:5)

通过查看C中的任何代码字是否是C中任何其他代码字的前缀来找到C1,如果是,则将后缀添加到集合C1中。例如1是前缀1110,因此你得到后缀110,它被添加到C1。

对于C2,首先检查C中的代码字是否是C1中任何其他代码字的前缀,如果它是一组所有“悬空后缀”,则检查C1是否是前缀C中的任何代码字,如果它再次成为所有“悬挂后缀”的集合。然后你取两个集合的结合,产生C2。

希望这有点意义。

答案 2 :(得分:3)

集合C1和C2对应于this Wikipedia article中的S1和S2。

具体来说,C1是我们从C中取出一个单词并删除一些也在C中的前缀后可以保留的单词集。

对于C2,我们在从C中取出一个单词并从C1中删除前缀后,或者在我们从C1中取出一个单词并从C中删除前缀后,可以保留单词。

如果我们想要计算C3,我们会在我们从C中取出一个单词并删除它在C2中的一些单词后可以保留的单词,以及在我们从C2中取出单词后删除的单词并删除一些在C中的前缀。

因此,C3将是:{[空字],0,011,10,11,1110}。它包含空字,因此算法停止并确定C不是唯一可解码的。