Здесь же я буду описывать только алгоритм прогнозирования, без лишней лирики.
Рассматривать буду прогнозирование последовательности байтов или же текста UTF-8. Прогнозирование последовательности дробных чисел — графиков — во многом подобно, только нужно значения сравнивать не на равенство, а на принадлежность окрестностям.
Пусть будет поток байтов (или скажем текст UTF-8) — входящие прогнозируемые данные. Поступающие данные сохраняем во множество сохраненной истории. Каждое очередное поступающее значение учитываем в структуре для накопления статистики:
struct Stat {
uint value; // прогнозируемое значение
uint count; // количество прошедших таких значений
// функция index используется шаблонным классом Index - ключ для rb-дерева
static uint index(const Stat& s) { return s.value; }
Ptrn* owner;
double probability() const { return (double)count/(double)owner->sum_count_of_stat; }
};
// шаблонный класс Index это rb-дерево,
// первый параметр шаблона — тип значения по которому происходит сортировка,
// второй, это класс сохраняемых значений в узлах. Этот класс должен содержать
// функцию index.
struct Ptrn {
// узел, подсчитывающий, какое распределение вероятностей будет
// следовать за значением value
uint value;
Index<uint,Stat> index_of_stat; // распределение вероятностей
uint sum_count_of_stat;
// путем добавления к текущему value еще влево
// будут образовываться паттерны
Index<uint,Ptrn> index_of_prev;
static uint index(const Ptrn& s) { return s.value; }
Ptrn* owner; // owner->index_of_prev->find(value) == this,
// для root этот owner равен nullptr
};
Ptrn root;