ROOT logo
#include "TMath.h"
#include "TH1.h"
#include "TArrayI.h"
#include "TArrayF.h"

#define MAX_TREE_HT 100

struct MH_Node
{
  int character;
  float frequency;
  struct MH_Node *l, *r;
};
 
 
struct M_Heap
{
  unsigned size;
  unsigned space;
  struct MH_Node **array;
};
 
struct MH_Node* newNode(int character, float frequency)
{
  struct MH_Node* temp = (struct MH_Node*) malloc(sizeof(struct MH_Node));
  temp->l = temp->r = NULL;
  temp->character = character;
  temp->frequency = frequency;
  return temp;
}
 
 
struct M_Heap* createM_Heap(unsigned space)
{
  struct M_Heap* M_Heap = (struct M_Heap*) malloc(sizeof(struct M_Heap));
  M_Heap->size = 0;
  M_Heap->space = space;
  M_Heap->array = (struct MH_Node**)malloc(M_Heap->space * sizeof(struct MH_Node*));
  return M_Heap;
}
 
 
void swapMH_Node(struct MH_Node** a, struct MH_Node** b)
{
  struct MH_Node* t = *a;
  *a = *b;
  *b = t;
}
 
 
void M_Heapify(struct M_Heap* M_Heap, int idx)
{
  // arrange in increasing frequency order
  for (int i=idx;i<M_Heap->size;i++) {
    for (int j=i+1;j<M_Heap->size;j++) {
      if (M_Heap->array[i]->frequency > M_Heap->array[j]->frequency)  
	swapMH_Node(&M_Heap->array[i], &M_Heap->array[j]);
    }
  }
}
 
int isSizeOne(struct M_Heap* M_Heap)
{
  return (M_Heap->size == 1);
}
 
 
struct MH_Node* extractMin(struct M_Heap* M_Heap)
{
  struct MH_Node* temp = M_Heap->array[0];
  M_Heap->array[0] = M_Heap->array[M_Heap->size - 1];
  --M_Heap->size;
  M_Heapify(M_Heap, 0);
  return temp;
}
 
 
void insertM_Heap(struct M_Heap* M_Heap, struct MH_Node* MH_Node)
{
  //  printf("Insert %f\n",MH_Node->frequency);
  int i = M_Heap->size - 1;
  if (i<0) {
    M_Heap->array[M_Heap->size++] = MH_Node;
    return;
  }
  M_Heap->array[M_Heap->size] = MH_Node;
  ++M_Heap->size;
  M_Heapify(M_Heap, 0);
}
 
 
void buildM_Heap(struct M_Heap* M_Heap)
{
  M_Heapify(M_Heap, 0);
}
 
 
void printArr(int arr[], int n)
{
  int i;
  for (i = 0; i < n; ++i) printf("%d", arr[i]);
  printf("\n");
}
 
 
int isLeaf(struct MH_Node* root)
{
  return !(root->l) && !(root->r) ;
}
 
 
struct M_Heap* createAndBuildM_Heap(int character[], float frequency[], int size)
{
  int i;
  struct M_Heap* M_Heap = createM_Heap(size);
  for (i = 0; i < size; ++i) M_Heap->array[i] = newNode(character[i], frequency[i]);
  M_Heap->size = size;
  buildM_Heap(M_Heap);
  return M_Heap;
}
 
struct MH_Node* buildHuffmanTree(int character[], float frequency[], int size)
{
  struct MH_Node *l, *r, *top;
  struct M_Heap* M_Heap = createAndBuildM_Heap(character, frequency, size);
  while (!isSizeOne(M_Heap)) {
    l = extractMin(M_Heap);
    r = extractMin(M_Heap);
    top = newNode('$', l->frequency + r->frequency);
    top->l = l;
    top->r = r;
    insertM_Heap(M_Heap, top);
  }
  return extractMin(M_Heap);
}

float printCodes(struct MH_Node* root, int arr[], int top)
{
  float totsiz = 0;
  if (root->l)
    {
      arr[top] = 0;
      totsiz += printCodes(root->l, arr, top + 1);
    }
  if (root->r)
    {
      arr[top] = 1;
      totsiz += printCodes(root->r, arr, top + 1);
    }
  if (isLeaf(root))
    {
      printf("%d: (%f) ", root->character, root->frequency);
      totsiz += top*root->frequency;
      printArr(arr, top);
    }
  return totsiz;
}

void HuffmanCodes(int character[], float frequency[], int size)
{
  struct MH_Node* root = buildHuffmanTree(character, frequency, size);
  int arr[MAX_TREE_HT], top = 0;
  int defNbits = 1 + TMath::Log2(size);
  double freqNorm = 0;
  for (int i=0;i<size;i++) {
    freqNorm += frequency[i];
  }
  float packSize = printCodes(root, arr, top);
  //
  printf("Brute force: %d vs %f coded\n",defNbits,packSize/freqNorm);

}

void HuffmanCodes(TH1* histo, int maxBin=-1)
{
  int nb = histo->GetNbinsX();
  if (maxBin>1 && nb>maxBin) nb = maxBin;
  TArrayI dat(nb);
  TArrayF frq(nb);  
  for (int i=0;i<nb;i++) {
    dat[i] = i;
    frq[i] = histo->GetBinContent(i+1);
  }
  HuffmanCodes(dat.GetArray(),frq.GetArray(),nb);
  //
}
 Huffman.C:1
 Huffman.C:2
 Huffman.C:3
 Huffman.C:4
 Huffman.C:5
 Huffman.C:6
 Huffman.C:7
 Huffman.C:8
 Huffman.C:9
 Huffman.C:10
 Huffman.C:11
 Huffman.C:12
 Huffman.C:13
 Huffman.C:14
 Huffman.C:15
 Huffman.C:16
 Huffman.C:17
 Huffman.C:18
 Huffman.C:19
 Huffman.C:20
 Huffman.C:21
 Huffman.C:22
 Huffman.C:23
 Huffman.C:24
 Huffman.C:25
 Huffman.C:26
 Huffman.C:27
 Huffman.C:28
 Huffman.C:29
 Huffman.C:30
 Huffman.C:31
 Huffman.C:32
 Huffman.C:33
 Huffman.C:34
 Huffman.C:35
 Huffman.C:36
 Huffman.C:37
 Huffman.C:38
 Huffman.C:39
 Huffman.C:40
 Huffman.C:41
 Huffman.C:42
 Huffman.C:43
 Huffman.C:44
 Huffman.C:45
 Huffman.C:46
 Huffman.C:47
 Huffman.C:48
 Huffman.C:49
 Huffman.C:50
 Huffman.C:51
 Huffman.C:52
 Huffman.C:53
 Huffman.C:54
 Huffman.C:55
 Huffman.C:56
 Huffman.C:57
 Huffman.C:58
 Huffman.C:59
 Huffman.C:60
 Huffman.C:61
 Huffman.C:62
 Huffman.C:63
 Huffman.C:64
 Huffman.C:65
 Huffman.C:66
 Huffman.C:67
 Huffman.C:68
 Huffman.C:69
 Huffman.C:70
 Huffman.C:71
 Huffman.C:72
 Huffman.C:73
 Huffman.C:74
 Huffman.C:75
 Huffman.C:76
 Huffman.C:77
 Huffman.C:78
 Huffman.C:79
 Huffman.C:80
 Huffman.C:81
 Huffman.C:82
 Huffman.C:83
 Huffman.C:84
 Huffman.C:85
 Huffman.C:86
 Huffman.C:87
 Huffman.C:88
 Huffman.C:89
 Huffman.C:90
 Huffman.C:91
 Huffman.C:92
 Huffman.C:93
 Huffman.C:94
 Huffman.C:95
 Huffman.C:96
 Huffman.C:97
 Huffman.C:98
 Huffman.C:99
 Huffman.C:100
 Huffman.C:101
 Huffman.C:102
 Huffman.C:103
 Huffman.C:104
 Huffman.C:105
 Huffman.C:106
 Huffman.C:107
 Huffman.C:108
 Huffman.C:109
 Huffman.C:110
 Huffman.C:111
 Huffman.C:112
 Huffman.C:113
 Huffman.C:114
 Huffman.C:115
 Huffman.C:116
 Huffman.C:117
 Huffman.C:118
 Huffman.C:119
 Huffman.C:120
 Huffman.C:121
 Huffman.C:122
 Huffman.C:123
 Huffman.C:124
 Huffman.C:125
 Huffman.C:126
 Huffman.C:127
 Huffman.C:128
 Huffman.C:129
 Huffman.C:130
 Huffman.C:131
 Huffman.C:132
 Huffman.C:133
 Huffman.C:134
 Huffman.C:135
 Huffman.C:136
 Huffman.C:137
 Huffman.C:138
 Huffman.C:139
 Huffman.C:140
 Huffman.C:141
 Huffman.C:142
 Huffman.C:143
 Huffman.C:144
 Huffman.C:145
 Huffman.C:146
 Huffman.C:147
 Huffman.C:148
 Huffman.C:149
 Huffman.C:150
 Huffman.C:151
 Huffman.C:152
 Huffman.C:153
 Huffman.C:154
 Huffman.C:155
 Huffman.C:156
 Huffman.C:157
 Huffman.C:158
 Huffman.C:159
 Huffman.C:160
 Huffman.C:161
 Huffman.C:162
 Huffman.C:163
 Huffman.C:164
 Huffman.C:165
 Huffman.C:166
 Huffman.C:167
 Huffman.C:168
 Huffman.C:169
 Huffman.C:170
 Huffman.C:171
 Huffman.C:172
 Huffman.C:173
 Huffman.C:174
 Huffman.C:175
 Huffman.C:176
 Huffman.C:177
 Huffman.C:178
 Huffman.C:179
 Huffman.C:180
 Huffman.C:181
 Huffman.C:182
 Huffman.C:183
 Huffman.C:184
 Huffman.C:185
 Huffman.C:186
 Huffman.C:187