📜  使用MATLAB的唯一可解码代码

📅  最后修改于: 2021-04-16 09:05:48             🧑  作者: Mango

如果每个码字都可以彼此识别(即,协调从源消息到码字的计划),则代码是不同的。如果每个代码字在浸入到一组代码字中时都是可识别的,或者如果可以从编码的二进制序列中完美地构造出第一个源代码,那么一个独特的代码是非常可解码的。

测试独特的可解码性:

  1. 考虑两个码字A和B.A为k位,B为n位(k
  2. 构造所有代码字的列表,检查所有代码字对,以查看是否有任何代码字是另一个前缀,只要存在这样的代码对,就在列表中添加一个悬挂的后缀,除非您在列表中添加了相同的悬挂后缀在先前的迭代中。
  3. 继续对扩展列表重复此过程,直到比较所有码字。

结果:

  • 您会得到一个悬挂的后缀,它是一个代码字。
  • 没有悬挂的后缀。
  • 悬挂的后缀不是代码字。
  • 如果您得到第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