【问题标题】:Shannon Fano algorithm香农法诺算法
【发布时间】:2014-10-29 16:06:24
【问题描述】:

我尝试按照例子来实现算法:

“香农·法诺”

根据这个决定,我必须得到 A = 11,B = 101,C = 100,D = 00,E = 011,F = 010。但我得到 A = 11 B = 101 C = 100 D = 01 E = 001 F = 000 这是我的代码:

Input parametrs: frequencies = [50, 39, 18, 49, 35, 24] и chars =  [A, B, C, D, E, F]
OnClick: SearchTree(' ',' ', 1, charCount,Memo1);


procedure SearchTree(branch:char; full_branch:string; start_pos:integer; end_pos:integer; memo:TMemo);
var
  dS:real; 
  i, m, S:integer; 
  c_branch:string; 
  x,y,j:integer;
begin
  if (branch<>' ') then c_branch := full_branch + branch
  else c_branch := '';

  if (start_pos = end_pos) then
  begin
    memo.Lines.Add(chars[start_pos]+ ' = ' + c_branch);
    exit;
  end;

   x:=0;  y:=0;
   i:=start_pos-1;  j:=end_pos;
   repeat
   Inc(i);
   x:=x+frequencies[i];
   while ((x>=y) and (i<>j))do
     begin
      y:=y+frequencies[j];
      Dec(j);
     end;
     m:=i;
   until (i=j);
  SearchTree('1', c_branch, start_pos, m,memo);
  SearchTree('0', c_branch, m+1, end_pos,memo);
end;

提示我是否理解算法以及我的问题是什么?

【问题讨论】:

  • 在 Julian Bucknall 的算法和数据结构一书的 pp416-420 上有一个 Delphi 实现示例和 Shannon-Fano 编码的工作示例,ISBN 1-55622-736-1。

标签: algorithm delphi


【解决方案1】:

我不会尝试破译您的代码,但就其价值而言,您在这里所做的并不是我所理解的 Shannon-Fano 编码方式。

我必须马上承认,我从未亲自编写过代码(选择了 Huffman 编码,它在牺牲一些复杂性的情况下为所有输入数据提供了相同或更好的压缩)。

以下是我认为应该从您的示例数据构建香农-法诺码的方式:

给定字符频率:

A   B   C   D   E   F
50, 39, 18, 49, 35, 24 = 215 (ideal distribution = 215 / 2 = 107.5 to each start bit)

现在对频率进行排序:

A   D   B   E   F   C
50, 49, 39, 35, 24, 18 = 215 (ideal distribution = 215 / 2 = 107.5 to each start bit)

现在在这个列表中找到“错误”(浪费)最少的分割点:

50 | 49 39 35 24 18 -- error (distance to ideal 107.5) = 57.5 
50 49 | 39 35 24 18  -- error (distance to ideal 107.5) = 8.5
50 49 39 | 35 24 18 -- error (distance to ideal 107.5) = 30.5

所以第一层的最佳分割点在 49(D) 和 39(B) 之间,这反过来意味着我们在左侧分支上有 AD,在右侧分支上有 BEFC。

由于在左侧分支上恰好只剩下两个字符,我们直接对它们进行编码:

假设left为1,right为0,A变为11,D变为10。

所有剩余的字符编码 (BEFC) 然后从零开始。

您现在以相同的方式对剩余的列表重复此过程,直到列表中最多有两个条目,您就完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多