-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFrequencyCount.cpp
88 lines (76 loc) · 1.74 KB
/
FrequencyCount.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "FrequencyCount.h"
#include <ctime>
FrequencyTable InitTable() {
FrequencyTable f = (FrequencyTable)malloc(sizeof(frequencyTable));
if (f == nullptr)return f;
f->length = 0;
for (int i = 0; i < BYTE_CHAR_UPPER_LIMIT; i++) {
f->isExist[i] = 0;
f->totalWeight = 0;
}
return f;
}
FrequencyTable BuildTable(const char* Text, unsigned long long length)
{
FrequencyTable table = InitTable();
for (unsigned long long i = 0; i < length; i++)
{
int index = (int)Text[i] + CHAR_OFFSET;
if (table->isExist[index])
{
table->weight[index]++;
table->totalWeight++;
}
else
{
table->isExist[index] = 1;
table->existChar[table->length++] = index;
table->weight[index] = 1;
table->totalWeight++;
}
}
return table;
}
int GetLength(FrequencyTable table)
{
return table->length;
}
void InitIterator(FrequencyTable table)
{
table->iterator = 0;
}
int HasNext(FrequencyTable table)
{
return table->iterator < table->length;
}
Iterator Next(FrequencyTable table)
{
if (table->iterator < table->length)
{
return table->iterator++;
}
return 0;
}
inline char GetChar(FrequencyTable table, Iterator it)
{
return (char)(table->existChar[it] - CHAR_OFFSET);
}
inline int GetWeight(FrequencyTable table, Iterator it)
{
return table->weight[table->existChar[it]];
}
void GetCharSet(FrequencyTable table,char*& charSet, int*& weightSet)
{
char* cs = (char*)malloc(sizeof(char) * table->length);
int* ws = (int*)malloc(sizeof(int) * table->length);
InitIterator(table);
int index = 0;
while(HasNext(table))
{
Iterator it = Next(table);
cs[index] = GetChar(table,it);
ws[index++] = GetWeight(table, it);
}
charSet = cs;
weightSet = ws;
}