- 565 名前:560 mailto:sage [02/07/27 05:59]
- Huffman 符号構成のアルゴリズムを変更してみました。現在8行。
ほぼ1から作り直したので、コーディングに甘い部分があります。 関数 z とか新設したんですが、どなたかこれを無くして下さいです。 int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c|=(h>> b)%2<<7-p;}q(int*a,int*b){return*a-*b;}struct v{int f,b,s[2],i,c;}n[31],*x=n,*w ;z(d,c){int m;struct v*w=x;if(w->i<y)w->b=d,w->c=c;else for(m=2;m--;)for(j=30;w ->s[m]==n[j].i?x=n+j,z(d+1,c*2+m),0:j--;);}main(){for(;i<y;)n[i++].f=1;for(;~(i =getchar());n[d[l++]=i/y].f++)d=realloc(d,l*4+8),n[d[l++]=i%y].f++;for(;++i<y;) n[i].i=i;for(j=k=y;--k;w->s[1]=x++->i){qsort(x,j,24,&q);w=x+j--;w->f=x->f+x[1]. f;w->i=i++;w->s[0]=x++->i;}z(-1,0);for(i=y;i--;)for(k=31;k--;)n[k].i==i?r(j=h[y +i]=n[k].b,4),r(h[i]=n[k].c,j):0;for(;++i<l;r(h[j],h[y+j]))j=d[i];r(0,7);} 寝よう・・・
|

|