我很难从下面的幻灯片中了解Sardinas-Patterson算法:
我们如何获得C1和C2 ???
我也从互联网上获得了这些信息:
算法是有限的,因为添加到列表中的所有悬空后缀都是有限的一组码字的后缀,并且最多可以添加一次悬挂后缀。
答案 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不是唯一可解码的。