如果每个码字都可以彼此识别(即,协调从源消息到码字的计划),则代码是不同的。如果每个代码字在浸入到一组代码字中时都是可识别的,或者如果可以从编码的二进制序列中完美地构造出第一个源代码,那么一个独特的代码是非常可解码的。
测试独特的可解码性:
- 考虑两个码字A和B.A为k位,B为n位(k
- 构造所有代码字的列表,检查所有代码字对,以查看是否有任何代码字是另一个前缀,只要存在这样的代码对,就在列表中添加一个悬挂的后缀,除非您在列表中添加了相同的悬挂后缀在先前的迭代中。
- 继续对扩展列表重复此过程,直到比较所有码字。
结果:
- 您会得到一个悬挂的后缀,它是一个代码字。
- 没有悬挂的后缀。
- 悬挂的后缀不是代码字。
- 如果您得到第5点的结果,则该代码不是唯一可解码的。
- 在所有其他情况下,它都是唯一可解码的。
例子:
'0, 01, 011, 0111' is an Uniquely decodable code
'0, 1, 00, 11' is not an uniquely decodable code
代码:
% Given Code
code = {'0','01','011','0111'};
disp(code)
i = 1;
flag1 = 0;
% Storing the code in temp variable
temp = code;
% Create datastore
ds = {};
while i < length(temp)
j = 1;
while j < length(temp)
c1 = temp{i};
c2 = temp{j};
l1 = length(c1);
l2 = length(c2);
% To find dangling suffix
if l1 < l2
if c1 == c2(1 : l1)
% Extract dangling suffix after comparing codewords
tsuffix = c2(l1 + 1 : l2);
l = length(ds);
% Append tsuffix to ds
if l == 0
% If no dangling suffix available then tsuffix
% is new dangling suffix
ds = {tsuffix};
else
k = 1;
while k <= l
% Compare new tsuffix with 'k'th dangling suffix
flag = strcmp(tsuffix, ds{k});
if flag ~= 1;
k = k + 1;
end
end
if flag == 0
% Attach tsuffix to dangling suffix array
ds = [ds {tsuffix}];
l = length(ds);
end
end
% Append tsuffix to code
lt = length(temp);
k = 1;
while k <= lt
% Compare each extracted dangling suffix
% with 'k'th original codeword
flag = strcmp(tsuffix, temp{k});
if flag == 1
flag1 = 1;
disp('Code is not Uniquely decodable');
break;
else
k = k + 1;
end
end
if flag == 0
% Attach extracted dangling suffix array to codeword array
temp = {temp(:) tsuffix};
lt = length(temp);
end
end
end
if flag1 == 1
break;
end
j = j + 1;
end
if flag1 == 1
break;
end
i = i + 1;
end
if flag1 == 0
disp('Code is Uniquely Decodable');
end
输出:
'0' '01' '011' '0111'
Code is Uniquely Decodable