p 2 g 1024
o 4 f 2048
n 8 e 4096
- m 16 d 8129
+ m 16 d 8192
l 32 c 16384
k 64 b 32768
- j 128 a 65535
+ j 128 a 65536
¤È¤³¤í¤Ç¡¢cum ¤ÎÃͤϲ¿¤Ê¤Î¤«¤È¤¤¤¦¤È¡¢
¤È¤¤¤¦´Ø·¸¤Î¤è¤¦¤À¡£¤É¤¦¤ä¤é c_code¡¢pt_code ¤È¤¤¤¦ 2 ¼ïÎà¤Î
Huffman Éä¹æɽ¤ò»ÈÍѤ¹¤ë¤é¤·¤¤¡£
+# ¤¢¤È¤Ç¤ï¤«¤ë¤³¤È¤À¤¬¼ÂºÝ¤Ï3¼ïÎà¤ÎHuffmanÉä¹æɽ¤òºî¤Ã¤Æ¤ª¤ê
+# pt_code¤ÏÊÑ¿ô¤¬»È¤¤²ó¤·¤µ¤ì¤Æ¤¤¤ë¡£ÊÑ¿ô¤Î»ÈÍÑÎΰè¤ò¸º¤é¤·
+# ¤¿¤«¤Ã¤¿¤Î¤À¤í¤¦¡£
+
¤½¤Î¾¤ÎÊÑ¿ô¤Ë´Ø¤·¤Æ¤âͽÁÛ¤òΩ¤Æ¤¿¤¤½ê¤À¤¬¡¢¤â¤¦¤¯¤¸¤±¤¿¤Î¤Ç¡¢½èÍýÆâÍÆ
¤«¤é¹¶¤á¤ë¤³¤È¤Ë¤·¤¿¡£
p_freq[] ¤ò¸«¤Æ¤¤¤ë¤³¤È¤«¤éº£ÅÙ¤Ï <off> ¤Î¾ðÊó¤Î Huffman ÌÚ¤ò¹½ÃÛ¤·¤Æ
¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡£ÀèÄø¤ÈƱÍͤˡ¢<off> ¤ÎÃͤ¬¤¹¤Ù¤ÆƱ¤¸¾ì¹ç¤Ï¡¢else ¤Î
-¾ò·ï¤Ë¤Ê¤ê¡¢°Ê²¼¤Î½ÐÎϤ¬¹Ô¤ï¤ì¤ë¡£(np ¤ÎÃͤϡ¢-lh7- ¤Î¾ì¹ç¤Ç¡¢17 ¤À)
+¾ò·ï¤Ë¤Ê¤ê¡¢°Ê²¼¤Î½ÐÎϤ¬¹Ô¤ï¤ì¤ë¡£(pbit ¤ÎÃͤϡ¢-lh7- ¤Î¾ì¹ç¤Ç¡¢5 ¤À)
----------------------------------------------------------------------------
-
- np bit np bit method np
+
+ pbit pbit method pbit
|---------|---------| ----------
- +----+----+---------+ -lh4- 14
- | 0 | root | -lh5- 14
- +----+----+---------+ -lh6- 16
- -lh7- 17
+ +----+----+---------+ -lh4- 4
+ | 0 | root | -lh5- 4
+ +----+----+---------+ -lh6- 5
+ -lh7- 5
----------------------------------------------------------------------------
} else
encode_c(buf[pos++]);
-flags ¤¬¡¢127 ¤Ç¤¢¤ë¤È¤ buf[pos] ¤Ï¡¢<len, off> ¤ò»Ø¤·¡¢
+flags ¤Î7¥Ó¥Ã¥ÈÌÜ(127)¤¬Î©¤Ã¤Æ¤¤¤ë¤È¤ buf[pos] ¤Ï¡¢<len, off> ¤ò»Ø¤·¡¢
encode_c(len + 256)
encode_p(off)
----------------------------------------------------------------------------
¤³¤³¤Ç¡¢Ãͤò 6 bit ¤·¤«½ÐÎϤ·¤Ê¤¤(putbits() ¤Ç c-1 ¤òÅϤ·¤Æ¤¤¤ë)¤Î¤Ï¡¢
-7 bit Ìܤ¬ 1 ¤Ç¤¢¤ë¤³¤È¤¬¼«ÌÀ¤À¤«¤é¤Ç¤¢¤ë¡£¾ï¤Ë off != 0 ¤À¤«¤é¡¢½ñ¤
-½Ð¤¹¾ðÊó¤ò 1 bit ºï¸º¤Ç¤¤ë¤ï¤±¤À¡£¤·¤¿¤¬¤Ã¤Æ¡¢off=1 ¤Î¤È¤¤Ï bit Ť¬
-1 ¤È¤¤¤¦¾ðÊó¤·¤«½ñ¤½Ð¤µ¤Ê¤¤¡£
+7 bit Ìܤ¬ 1 ¤Ç¤¢¤ë¤³¤È¤¬¼«ÌÀ¤À¤«¤é¤Ç¤¢¤ë¡£ºÇ½é¤Ë¥Ó¥Ã¥ÈŤò½ÐÎϤ·¤Æ¤¤¤ë
+¤Î¤Ç¡¢ÃͤξðÊó¤Ï1 bit ºï¸º¤Ç¤¤ë¤ï¤±¤À¡£¤·¤¿¤¬¤Ã¤Æ¡¢off=1 ¤Î¤È¤¤Ï bit
+Ť¬ 1 ¤È¤¤¤¦¾ðÊó¤·¤«½ñ¤½Ð¤µ¤Ê¤¤¡£
ºÇ¸å¤Î (E) ¤ÏÉÑÅÙɽ¤ò¥¯¥ê¥¢¤·¤Æ¤¤¤ë¤À¤±¤À¡£
¤¹¤Ù¤Æ¤ò¥Æ¡¼¥Ö¥ë»²¾È¤Ç decode ¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£¤½¤³¤Ç¡¢Â¤ê¤Ê¤¤Éôʬ
¤Ï¸å¤Î½èÍý¤ÇÌÚ¤òºî¤ë¤³¤È¤ÇÊä¤Ã¤Æ¤¤¤ë¤è¤¦¤À¡£
-bit ¿ô¤ò¸º¤é¤¹Íýͳ¤ò¹Í¤¨¤Æ¤ß¤ë¡£É½°ú¤¤Î¹Í¤¨Êý¤Ï¡¢
+bit ¿ô¤ò¸º¤é¤¹Íýͳ¤ò¹Í¤¨¤Æ¤ß¤ë¡£¤Þ¤ºÉ½°ú¤¤Î¹Í¤¨Êý¤Ï¡¢
/\ a: 0
a /\ b: 10
: > left[]/right[]¤Çɽ¸½ (³¬ÁØ12¤¬root)
... ³¬ÁØ:16 .'
- ³¬ÁØ 1 ¡Á 11 (1¡Á11bit)¤ÎHuffmanÌڤˤĤ¤¤Æ¤Ï¡¢É½°ú¤¤ÇÉü¹æ
- ³¬ÁØ 12 ¤¬ < NC ¤Î¾ì¹ç¤Ï¡¢¤½¤Î¤Þ¤Þɽ°ú¤¤ÇÉü¹æ
- ³¬ÁØ 12 ¤¬ >= NC ¤Î¾ì¹ç¤Ï¡¢Àá¤ò¼¨¤·¡¢left[³¬ÁØ12¤ÎÃÍ],right[³¬ÁØ12¤ÎÃÍ]¤¬
- ¤½¤Î²¼¤ÎÀá¤ò»Ø¤¹¡£
+ ³¬ÁØ 1 ¡Á 12 (1¡Á12bit)¤ÎHuffmanÌڤˤĤ¤¤Æ¤Ï¡¢É½°ú¤¤ÇÉü¹æ
+ ³¬ÁØ 13 °Ê¾å¤ÎHuffmanÉä¹æ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÀèƬ 12 bit¤òɽ°ú¤¤·¡¢¤½¤ÎÃÍ
+ ¤ÏNC ¤è¤êÂ礤¤ÃͤȤʤ롣
+
+ ɽ°ú¤¤·¤¿·ë²Ì¤¬ >= NC ¤Î¾ì¹ç¡¢¤½¤ÎÃͤÏÀá¤ò¼¨¤·¡¢left[ɽ°ú¤¤ÎÃÍ],
+ right[ɽ°ú¤¤ÎÃÍ]¤¬¤½¤Î²¼¤ÎÀá¤ò»Ø¤¹¡£
----------------------------------------------------------------------------
³¬ÁØ12¤è¤ê²¼(13 °Ê¾å¤Î bit ¿ô¤Î Huffman Éä¹æ)¤Î Huffman ÌڤˤĤ¤¤Æ
left[], right[] ¤Çɽ¤·¤Æ¤¤¤ë¤è¤¦¤À¡£¤³¤ÎÌڤΥΡ¼¥É¤ÎÃÍ¤Ï NC °Ê¾å¤Î¿ôÃÍ
-¤òÏ¢ÈÖ¤«²¿¤«¤Ç³ä¤êÅö¤Æ¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤À¤í¤¦¤«¡©¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¤³¤ì°Ê¹ß
-¤Ç³Îǧ¤¹¤ë¡£
+¤òÏ¢È֤dzä¤êÅö¤Æ¤Æ¤¤¤ë¤è¤¦¤À(¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¸å½Ò¤¹¤ë)¡£
¤Ê¤ª¡¢³¬Áؤ¬¿¼¤¤ Huffman ÌڤȤϡ¢bit Ť¬Ä¹¤¤Éä¹æ¤Ç¤¢¤ê¡¢bit Ť¬Ä¹¤¤¤È
¤¤¤¦¤³¤È¤Ï½Ð¸½ÉÑÅÙ¤¬Ä㤤¤Ï¤º¤Ç¤¢¤ë¤«¤é¡¢left[], right[] ¤ÇÌÚ¤òé¤ë²ó¿ô
¤Ï¾¯¤Ê¤¤¤Ï¤º¤Ç¤¢¤ë¡£¤³¤ì¤ÏÍý¤Ë¤«¤Ê¤Ã¤Æ¤¤¤ë¡£
-¤Á¤ç¤Ã¤Èµ¤Ê¬Åª¤Ë¥Î¤é¤Ê¤¤¤Î¤Ç¤Ï¤·¤ç¤ë¤¬¡¢¸å¤Î (E), (F) ¤ÏÌÚ¤òƱ»þ¤Ëºî¤Ã
-¤Æ¤¤¤ë¤³¤È¤ò½ü¤±¤Ð¡¢maketree.c:make_code() ¤Î¸åȾÉôʬ¤ÈƱ¤¸¤À¤È¹Í¤¨¤Æ
-¤¤¤¤¤À¤í¤¦¡£
+³¤¤ò¸«¤Æ¤¤¤³¤¦¡¢(E) ¤Î½èÍý
+
+ /* (E) */
+ /* initialize */
+ j = start[tablebits + 1] >> m;
+ k = 1 << tablebits;
+ if (j != 0)
+ for (i = j; i < k; i++)
+ table[i] = 0;
+
+¼¡¤Ë (F) ¤Î½èÍý¡£²¼µ¤ÎÄ̤ê (F.1), (F.2) ¤ÈºÙʬ²½¤·¤Æ¤ß¤¿¡£
+
+ /* (F) */
+ /* create table and tree */
+ for (j = 0; j < nchar; j++) {
+ k = bitlen[j];
+ if (k == 0)
+ continue;
+ /* (F.1) */
+ l = start[k] + weight[k];
+ if (k <= tablebits) {
+ /* code in table */
+ for (i = start[k]; i < l; i++)
+ table[i] = j;
+ }
+
+ /* (F.2) */
+ else {
+ /* code not in table */
+ p = &table[(i = start[k]) >> m];
+ i <<= tablebits;
+ n = k - tablebits;
+ /* make tree (n length) */
+ while (--n >= 0) {
+ if (*p == 0) {
+ right[avail] = left[avail] = 0;
+ *p = avail++;
+ }
+ if (i & 0x8000)
+ p = &right[*p];
+ else
+ p = &left[*p];
+ i <<= 1;
+ }
+ *p = j;
+ }
+ start[k] = l;
+ }
+
+¤³¤ÎÉôʬ¤Ï°ì»þÊÑ¿ô¤ÎÎ̤¬Â¿¤¤¡¢i,j,k,l,m,n,p ¤Þ¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡£
+(¤·¤«¤â¡¢Á°¤Î½èÍý¤Þ¤Ç¤ÈÊÑ¿ô¤ÎÍÑÅÓ¤¬°ã¤Ã¤Æ¤¿¤ê¤¹¤ë¤Î¤Ç¡¢Ê£»¨¤Ë¤Ê¤Ã¤Æ¤¤¤ë)
+°ìö¡¢°Ê²¼¤ËÀ°Íý¤·¤Æ¤ß¤¿¡£
+
+ i: Huffman Éä¹æ
+ j: Éü¹æʸ»ú
+ k: j ¤ÎHuffman code¤Ç¤Î¥Ó¥Ã¥ÈĹ
+ l: ¥Ó¥Ã¥ÈĹ k ¤ËÂФ¹¤ëHuffman Éä¹æ¤Î½ªÃÍ (start[k] <= Huffman(k) < l)
+ m: Huffman Éä¹æɽ¤òshift¤¹¤ë¥Ó¥Ã¥È¿ô
+ n: ??
+ p: ??
+
+n, p ¤Ë¤Ä¤¤¤Æ¤Ï¤Ò¤È¤á¤Ç¤Ï¤ï¤«¤é¤Ê¤«¤Ã¤¿¡£
+
+¤³¤ì¤òƧ¤Þ¤¨¤Æ½èÍýÆâÍƤò¸«¤Æ¤ß¤è¤¦¡£¤Þ¤º¡¢(F)Á´ÂΤˤĤ¤¤Æ
+
+ /* (F) */
+ /* create table and tree */
+ for (j = 0; j < nchar; j++) {
+ k = bitlen[j];
+ if (k == 0)
+ continue;
+ /* (F.1) */
+ /* (F.2) */
+
+ start[k] = l;
+ }
+
+Éü¹æʸ»ú j = 0 ... nchar ¤ò¥ë¡¼¥×¤·¤Æ¤¤¤ë(j ¤¬Ê£¹çʸ»ú¤Ç¤¢¤ë¤³¤È¤Ï¡¢
+bitlen[] ¤Îź¤¨»ú¤Ç¤¢¤ë¤³¤È¤«¤é¤ï¤«¤ë)¡£
+
+¤½¤·¤Æ¡¢k = bitlen[j] ¤¬ 0 ¤Ç¤¢¤ì¤Ð¡¢(Huffman Éä¹æ²½¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð)¤½
+¤Îʸ»ú¤Ï¥¹¥¥Ã¥×¤·¤Æ¤¤¤ë¡£¤³¤³¤Ï¡¢Îɤ¤¤À¤í¤¦¡£
+
+(F.1), (F.2) ¤Ï¡¢HuffmanÉä¹æ²½¤µ¤ì¤Æ¤¤¤ëʸ»ú j ¤Ë¤Ä¤¤¤Æ
+¤Î½èÍý¤È¤Ê¤ë¡£(ºÇ¸å¤Îstart[k] = l ¤Ï¸å²ó¤·)
+
+½èÍý¤ÎÌÜŪ¤«¤éÂ绨ÇĤË
+
+ (F.1) k <= tablebits ¤Î¾ì¹ç¡¢É½°ú¤²Äǽ¤ÊÈϰϤʤΤǡ¢
+ table[i] ¤ËÉü¹æʸ»ú¤ò¥»¥Ã¥È¡£
+
+ (F.2) k > tablebits ¤Î¾ì¹ç¡¢É½°ú¤ÉÔ²Äǽ¤ÊÈϰϤʤΤǡ¢
+ left[],right[]¤ËÉü¹æʸ»ú¤ò¥»¥Ã¥È¡£
+
+¤È¤¤¤Ã¤¿½èÍý¤ò¤·¤Æ¤¤¤ë¤³¤È¤¬Í½ÁۤǤ¤ë¡£¤Ç¤Ï¡¢(F.1) ¤ò¸«¤Æ¤ß¤ë¡£
+
+ /* (F.1) */
+ l = start[k] + weight[k];
+ if (k <= tablebits) {
+ /* code in table */
+ for (i = start[k]; i < l; i++)
+ table[i] = j;
+ }
+
+¥Ó¥Ã¥ÈĹ k <= tablebits ¤Î¾ì¹ç¡¢¥Ó¥Ã¥ÈĹ k ¤¬¼è¤ê¤¦¤ëÈϰϤÎHuffmanÉä¹æ
+¤Ë¤Ä¤¤¤Æ¡¢Ê¸»ú j ¤ò³ä¤êÅö¤Æ¤Æ¤¤¤ë¡£
+¥Ó¥Ã¥ÈĹ k ¤¬¼è¤ê¤¦¤ëÈϰϤΠHuffman Éä¹æ¤È¤Ï
+
+ start[k] <= HuffmanÉä¹æ i < l
+
+¤Ç¤¢¤ë¡£Îã¤Ç¼¨¤¹¤È(´ÊÊز½¤Î¤¿¤á¤Ë¡¢ºÇÂç¤ÎHuffmanÉä¹æŤò2¤È¤¹¤ë)
+
+ /\ a: 0
+ a /\ b: 10
+ b c c: 11
+
+ʸ»úa¤Ï¡¢1¥Ó¥Ã¥È¤Ç¡¢00...10 ¤ÎÈÏ°Ï
+ʸ»úb¤Ï¡¢2¥Ó¥Ã¥È¤Ç¡¢10...11 ¤ÎÈÏ°Ï
+ʸ»úc¤Ï¡¢2¥Ó¥Ã¥È¤Ç¡¢11
+
+¤È¤Ê¤ë¡£¤³¤³¤Ç¡¢Ê¸»ú c ¤Ë¤Ä¤¤¤Æ¤Ï¤³¤Î¥ë¡¼¥×¤Ç¤Ï¥Æ¡¼¥Ö¥ë¤ËÃͤ¬¥»¥Ã¥È¤µ¤ì
+¤Ê¤¤¤è¤¦¤Ë¸«¤¨¤ë¡£¼ÂºÝ¤Ï(F) ¤Î¥ë¡¼¥×¤ÎËöÈø¤Ë½Ð¤Æ¤¤¿
+
+ start[k] = l;
+
+¤Ë¤è¤Ã¤Æ¡¢¥Ó¥Ã¥ÈĹ k ¤ËÂФ¹¤ë½é´üÃÍ start[k] ¤¬Êѹ¹¤µ¤ì¤ë¤¿¤á¡¢¤½¤Î¿´ÇÛ
+¤Ï¤Ê¤¤¤è¤¦¤À¡£
+
+¼¡¤Ë¡¢(F.2)
+
+ /* (F.2) */
+ else {
+ /* code not in table */
+ p = &table[(i = start[k]) >> m];
+ i <<= tablebits;
+ n = k - tablebits;
+ /* make tree (n length) */
+ while (--n >= 0) {
+ if (*p == 0) {
+ right[avail] = left[avail] = 0;
+ *p = avail++;
+ }
+ if (i & 0x8000)
+ p = &right[*p];
+ else
+ p = &left[*p];
+ i <<= 1;
+ }
+ *p = j;
+ }
+
+¤Þ¤º¡¢
+
+ p = &table[(i = start[k]) >> m];
+
+¤ÎÉôʬ¤Ï¡¢
+
+ i = start[k];
+ p = &table[i >> m]
+
+¤Ç¤¢¤ê¡¢i ¤Ï Huffman Éä¹æ¤Î½é´üÃÍ
+
+p ¤Ï¡¢HuffmanÉä¹æ i ¤Î table ¾å¤Î°ÌÃÖ¤ò»Ø¤¹¡£¸å¤Ç¡¢*p ¤Ë¤ÏÌڤΥ롼¥È°ÌÃÖ
+¤òµÏ¿¤¹¤ë¤³¤È¤¬Í½ÁÛ¤µ¤ì¤ë¡£
+
+¼¡¤Ë¡¢
+
+ i <<= tablebits;
+
+i ¤ò tablebits ¤Çshift¤¹¤ë¤³¤È¤Ç¡¢Huffman Éä¹æ i ¤Ï
+ºÇ¾å°Ì¤Îtablebits ¤ò½ü¤¤¤¿»Ä¤ê¤Î¥Ó¥Ã¥ÈÉôʬ¤Ë¤Ê¤ë¡£
+
+ k
+ tablebits
+ |-----------|----|
+ +-----------+----+
+ i | | |
+ +-----------+----+
+ |----|
+ ¥³¥³
+¼¡¤Ë
+
+ n = k - tablebits;
+
+n ¤Ï¡¢½ñ¤´¹¤¨¤¿ i ¤Î¥Ó¥Ã¥ÈŤò¼¨¤¹¡£ÌڤˤϿ¼¤µ n ¤Î³¬Áؤ¬ºîÀ®¤µ¤ì¤ë¤Î¤À¤í¤¦¡£
+
+ /* make tree (n length) */
+ while (--n >= 0) {
+ /* (F.2.1) */
+ if (*p == 0) {
+ right[avail] = left[avail] = 0;
+ *p = avail++;
+ }
+ /* (F.2.2) */
+ if (i & 0x8000)
+ p = &right[*p];
+ else
+ p = &left[*p];
+ i <<= 1;
+ }
+ /* (F.2.3) */
+ *p = j;
+
+(F.2.1) *p ¤¬ 0 ¤Ç¤¢¤ì¤Ð¡¢*p ¤Ë avail ¤È¤·¤Æ¡¢¿·¤¿¤Êº¬¤ò³ä¤êÅö¤Æ¤½¤Î±¦
+¤Èº¸¤Î»Ò¤Ï0¤Ç½é´ü²½¤·¤Æ¤ª¤¯¡£
+
+(F.2.2) Huffman Éä¹æ(¤Îtablebits°Ê¹ß¤Î¥Ó¥Ã¥È) i ¤Ë¤Ä¤¤¤Æ
+ºÇ¾å°Ì¥Ó¥Ã¥È¤¬Î©¤Ã¤Æ¤¤¤ì¤Ð±¦¤Î»Ò right¡¢¥Ó¥Ã¥È¤¬Î©¤Ã¤Æ¤¤¤Ê¤±¤ì¤Ð
+º¸¤Î»Ò¤òºîÀ®¤¹¤ë¡£(¤³¤³¤Ç¤Ï¡¢p ¤ò³ä¤êÅö¤Æľ¤·¤Æ¤¤¤ë¤À¤±¤Ç¤¢¤ë)¡£
+
+(F.2.3)
+*p ¤Ë¤Ï¡¢avail++ ¤¬½ç¤Ë³ä¤êÅö¤Æ¤é¤ì avail ¤Î½é´üÃÍ¤Ï nchar ¤Ê¤Î¤Ç¡¢
+*p >= nchar (c_table[] ¤Ê¤é NC)¤Ç¤¢¤ë¡£
+¤³¤Î while ¥ë¡¼¥×¤òÈ´¤±¤¿¸å¤Ë
+ *p = j;
+¤¬ÀßÄꤵ¤ì¡¢ÌÚ¤ÎÍդˤϡ¢*p < nchar ¤Ç¤¢¤ëÃͤ¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¡£
+(¤½¤·¤Æ¤³¤ì¤¬µá¤á¤ëÉü¹æʸ»ú¤Ç¤¢¤ë¡£)
+
+(F.2.1) ¤Ç¡¢if (*p == 0) ¤È¤·¤Æ¤¤¤ëÍýͳ¤Ï¡¢
+
+ .
+ \
+ . <- p
+ /
+
+¤È p ¤¬´û¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤ª¤ê¡¢¤½¤ÎÀá¤Ë
+
+ .
+ \
+ . <- p
+ / \
+
+¤È±¦¤Î»Ò¤¬Äɲ䵤ì¤ë¾ì¹ç¤òÁÛÄꤷ¤Æ¤¤¤ë¡£
# Local Variables:
# mode : indented-text