quant
yeah
может кому пригодится прожки для решения задач с ОДЗ по Теории информации (Тулякова, СумДУ)
программы на С++, подставляйте свои данные и выполняйте
вторую модифицировать будет сложнее, но считать вручную всяко напряжнее
1. Дискретна випадкова величина X задана таким розподілом ймовірностей: P(X=A)=1/3, P(X=B)=1/2, P(X=C)=1/6. Побудувати код Хаффмена.
2. Розпакувати повідомлення довжиною 6 символів, закодоване за арифметичним алгоритмом. Код повідомлення 101000001. Таблиця кодера така: A є [2/3; 1), B є [1/5; 2/3), C[0, 1/5)
программы на С++, подставляйте свои данные и выполняйте
вторую модифицировать будет сложнее, но считать вручную всяко напряжнее
1. Дискретна випадкова величина X задана таким розподілом ймовірностей: P(X=A)=1/3, P(X=B)=1/2, P(X=C)=1/6. Побудувати код Хаффмена.
Код:
#include <cstdio>
int gcd(const int& a, const int& b) { return b ? gcd(b, a % b) : a; }
struct frac {
int up, lo;
bool operator< (const frac& to) const { return up * to.lo < to.up * lo; }
frac(const int& a, const int& b) : up(a), lo(b) {}
frac& operator+= (const frac& plus) {
up = up * plus.lo + plus.up * lo;
lo *= plus.lo;
int temp = gcd(lo, up);
up /= temp;
lo /= temp;
return *this; }
frac operator+ (const frac& plus) const {
frac temp = *this;
return temp += plus; }
void print (const char& end) { printf ("%d/%d%c", up, lo, end); } }
maj[] = { frac(1, 9), frac(1, 6), frac(1, 18), frac(1, 6), frac(1, 4), frac(1, 12), frac(1, 18), frac(1, 12) , frac(1, 36) };
int i, j, co, a, b, N;
bool us[100], first;
int main () {
for(i = 0, N = sizeof(maj) / sizeof(frac); i < N; us[i++] = false);
for(co = 1; co < N; ++co) {
first = true;
for(i = 1; i < N; ++i) {
for(j = 0; !us[i] && j < i; ++j) {
if(!us[j] && (first || maj[i] + maj[j] < maj[a] + maj[b])) {
a = i, b = j;
first = false; } } }
maj[a].print('+');
maj[b].print('=');
(maj[a] += maj[b]).print('\n');
us[b] = true; }
return 0; }
Код:
#include <cstdio>
int i;
double a = 0., b = .2, c = 2./3., d = 1., x = 321./512.;
int main () {
for(i = 0; i < 6; ++i) {
printf ("C: %lf - %lf\nB: %lf - %lf\nA: %lf - %lf\n", a, b, b, c, c, d);
if(x >= a && x < b) {
puts("vibrali C\n");
d = b;
} else if(x >= b && x < c) {
puts("vibrali B\n");
a = b;
d = c;
} else if(x >= c && x < d) {
puts("vibrali A\n");
a = c; }
b = a + (d - a) * .2;
c = a + (d - a) * (2./3.); }
return 0; }