예제 #1
0
    public void Load(BinaryData bdata)
    {
        // byte[]をkeyにすると全てユニークとして判定された
        var dict = new Dictionary <InfoSource, int>();

        this.path = bdata.path;

        for (int i = 0; i < bdata.GetNum(n_byte); i++)
        {
            var element = new InfoSource(bdata.GetAt(i, n_byte));
            if (dict.ContainsKey(element))
            {
                dict[element]++;
            }
            else
            {
                dict.Add(element, 1);
            }
        }

        var list = new List <Node>();

        // キーを列挙
        foreach (var k in dict.Keys)
        {
            var node = new Node();

            node.Value   = dict[k];
            node.element = k;
            node.isLeaf  = true;

            list.Add(node);
        }

        while (list.Count >= 2)
        {
            // 小さい順
            // あとでpriority_queueに直す(直さないと思う)
            list.Sort((a, b) => a.Value - b.Value);
            //Console.WriteLine(list[0].Value);
            //Console.WriteLine(list[1].Value);

            // 小さい順に取り出す
            var node1 = list[0];
            list.RemoveAt(0);
            var node2 = list[0];
            list.RemoveAt(0);

            // くっつける
            var node3 = new Node();
            node3.Value = node1.Value + node2.Value;
            node3.Left  = node1;
            node3.Right = node2;

            // 加える
            list.Add(node3);
        }

        //Console.WriteLine(list[0].Value);

        // code,element
        this.Codes         = new Dictionary <BoolList, InfoSource>();
        this.InvertedCodes = new Dictionary <InfoSource, BoolList>();
        // 割当
        AssignCode(list[0], new BoolList());

        // なんか表示するやつ
        //foreach (var k in Codes.Keys)
        //    Console.WriteLine(Codes[k] +"\t" + dict[Codes[k]] +"\t" + k );

        // 総バイト数は保存しないと
        byteNumber = bdata.byteNumber;


        // エントロピーのでっかい情報源を作る
        data = new BoolList();
        for (int i = 0; i < bdata.GetNum(n_byte); i++)
        {
            var element = new InfoSource(bdata.GetAt(i, n_byte));
            data.AddRange(InvertedCodes[element]);
        }

        // なんか表示するやつ
        //Console.WriteLine(data);
    }