Изобразим все возможные коды длиной не больше 4 в виде дерева (см. рис.)
Красным цветом помечены вершины, которым соответствуют уже занятые коды. Условие Фано запрещает одному коду быть префиксом (началом) другого, желтым цветом отмечены коды, выбор которых будет противоречить условию Фано (например, если занят код 0010, то нельзя выбрать коды 0, 00, 001).
Оставшиеся не закрашенными коды доступны для выбора, они удовлетворяют условию Фано, а значит, код будет допускать однозначное декодирование. По рисунку видно, что наименьшая длина кода равна 3, есть два варианта: 100 и 010. В ответ пойдёт более правый код, у него числовое значение меньше.
Двовимірний масив (матриця) можна представити як одновимірний масив, кожний елемент якого – масив. Тривимірний масив – це масив, кожний елемент якого являє собою двовимірну матрицю.
char Matrix2D[6][9]; // Двовимірний масив 6x9 елементів
unsigned long Arr3D[4][2][8]; // Тривимірний
Багатовимірні масиви ініціалізуються в порядку якнайшвидшої зміни самого правого індексу: спочатку відбувається присвоєння початкових значень всіх елементів останнього індексу, потімпопереднього і т. д.:
int Mass[3][2][4] = {1,2,3,4,5,6,7,8,9,10,11,12,
13,14,15,16,17,18,19,20,21,22,23,24};
Рекомендується для наочності групувати дані за до проміжних фігурних дужок:
int Mass[3][2][4]={{{l,2,3,4},{5,6,7,8}},
{{9,10,ll,12},{13,14,15,16}},
{{17,18,19,20},{21,22,23,24}};
Для багатовимірних масивів при ініціалізації дозволяється опускати лише величину першої розмірності:
int main()
{
char x[][3]={{9,8,7},{6,5,4},{3,2,1}};
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
printf("%d ", (int)x[i][j]);
printf("\n");
}
return 0;
}
Динамічне виділення пам’яті під масиви
Змінні у програмах повинні розміщатися в одному з трьох місць: в області даних програми, в області стеку, в області вільної пам’яті (купи).
Кожній змінній у програмі може відводитися пам’ять або статично (в момент завантаження), або динамічно (у процесі виконання програми).
До цих пір всі використовувані масиви оголошувались статично, а отже, зберігали значення своїх елементів в області даних. Якщо кількість елементів невелика, таке розміщення виправдано. Але досить часто виникають випадки, коли необхідно мати великі масиви даних або розмір масиву заздалегідь не може бути визначений. Тут на до приходить можливість використання динамічної пам’яті.
Для того, щоб у пам’яті можна було розмістити будь-який динамічний об’єкт, для нього необхідно попередньо виділити відповідне місце. По завершенні роботи з об’єктом виділену пам’ять необхідно звільнити.
Виділення пам’яті можна здійснювати двома
б: функції malloc(), calloc(), free(). Ці функції описані у заголовочному файлі <stdlib.h> або <malloc.h>
Функція malloc(size) виділяє size байтів з купи. У випадку успішного виділення пам’яті покажчик встановлюється на виділений блок пам’яті. При невдалому виділенні пам’яті функція повертає NULL.
Функція calloc(num, size), окрім виділення області пам’яті під масив об’єктів, ще здійснює ініціалізацію елементів масиву нульовими значеннями. Тут num вказує, скільки елементів буде зберігатися у масиві, а size – розмір кожного елемента у байтах.
Наприклад, якщо необхідно виділити пам’ять для масиву з n цілих чисел типу long, це можна зробити за до оператора:
long * fptr = (long *)malloc(n*sizeof(long));
Якщо необхідно виділити пам’ять під двовимірний масив розмірності m×n, це можна зробити за до оператора
float* fptr = (float*)malloc(n*m*sizeof(float));
Функція free(*block) звільняє пам’ять, на яку вказує покажчик block.
б: функції new(), delete(). Ці функції з’явилися в С++.
malloc(), calloc(), free() працюють і в С, і в С++. Нові оператори гнучкого розподілення пам’яті new() i delete() мають додаткові можливості.
Якщо оператори malloc(), calloc() повертають пустий покажчик, який далі перетворюється до потрібного типу, то оператор new() повертає покажчик на той тип, для якого виділяється пам’ять, і додаткових перетворень не потребує.
010
Объяснение:
Изобразим все возможные коды длиной не больше 4 в виде дерева (см. рис.)
Красным цветом помечены вершины, которым соответствуют уже занятые коды. Условие Фано запрещает одному коду быть префиксом (началом) другого, желтым цветом отмечены коды, выбор которых будет противоречить условию Фано (например, если занят код 0010, то нельзя выбрать коды 0, 00, 001).
Оставшиеся не закрашенными коды доступны для выбора, они удовлетворяют условию Фано, а значит, код будет допускать однозначное декодирование. По рисунку видно, что наименьшая длина кода равна 3, есть два варианта: 100 и 010. В ответ пойдёт более правый код, у него числовое значение меньше.
Мотиви, ТЕОРЕТИЧНІ ВІДОМОСТІ
Багатовимірні масиви
Двовимірний масив (матриця) можна представити як одновимірний масив, кожний елемент якого – масив. Тривимірний масив – це масив, кожний елемент якого являє собою двовимірну матрицю.
char Matrix2D[6][9]; // Двовимірний масив 6x9 елементів
unsigned long Arr3D[4][2][8]; // Тривимірний
Багатовимірні масиви ініціалізуються в порядку якнайшвидшої зміни самого правого індексу: спочатку відбувається присвоєння початкових значень всіх елементів останнього індексу, потімпопереднього і т. д.:
int Mass[3][2][4] = {1,2,3,4,5,6,7,8,9,10,11,12,
13,14,15,16,17,18,19,20,21,22,23,24};
Рекомендується для наочності групувати дані за до проміжних фігурних дужок:
int Mass[3][2][4]={{{l,2,3,4},{5,6,7,8}},
{{9,10,ll,12},{13,14,15,16}},
{{17,18,19,20},{21,22,23,24}};
Для багатовимірних масивів при ініціалізації дозволяється опускати лише величину першої розмірності:
int main()
{
char x[][3]={{9,8,7},{6,5,4},{3,2,1}};
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
printf("%d ", (int)x[i][j]);
printf("\n");
}
return 0;
}
Динамічне виділення пам’яті під масиви
Змінні у програмах повинні розміщатися в одному з трьох місць: в області даних програми, в області стеку, в області вільної пам’яті (купи).
Кожній змінній у програмі може відводитися пам’ять або статично (в момент завантаження), або динамічно (у процесі виконання програми).
До цих пір всі використовувані масиви оголошувались статично, а отже, зберігали значення своїх елементів в області даних. Якщо кількість елементів невелика, таке розміщення виправдано. Але досить часто виникають випадки, коли необхідно мати великі масиви даних або розмір масиву заздалегідь не може бути визначений. Тут на до приходить можливість використання динамічної пам’яті.
Для того, щоб у пам’яті можна було розмістити будь-який динамічний об’єкт, для нього необхідно попередньо виділити відповідне місце. По завершенні роботи з об’єктом виділену пам’ять необхідно звільнити.
Виділення пам’яті можна здійснювати двома
б: функції malloc(), calloc(), free(). Ці функції описані у заголовочному файлі <stdlib.h> або <malloc.h>
Функція malloc(size) виділяє size байтів з купи. У випадку успішного виділення пам’яті покажчик встановлюється на виділений блок пам’яті. При невдалому виділенні пам’яті функція повертає NULL.
Функція calloc(num, size), окрім виділення області пам’яті під масив об’єктів, ще здійснює ініціалізацію елементів масиву нульовими значеннями. Тут num вказує, скільки елементів буде зберігатися у масиві, а size – розмір кожного елемента у байтах.
Наприклад, якщо необхідно виділити пам’ять для масиву з n цілих чисел типу long, це можна зробити за до оператора:
long * fptr = (long *)malloc(n*sizeof(long));
Якщо необхідно виділити пам’ять під двовимірний масив розмірності m×n, це можна зробити за до оператора
float* fptr = (float*)malloc(n*m*sizeof(float));
Функція free(*block) звільняє пам’ять, на яку вказує покажчик block.
б: функції new(), delete(). Ці функції з’явилися в С++.
malloc(), calloc(), free() працюють і в С, і в С++. Нові оператори гнучкого розподілення пам’яті new() i delete() мають додаткові можливості.
Якщо оператори malloc(), calloc() повертають пустий покажчик, який далі перетворюється до потрібного типу, то оператор new() повертає покажчик на той тип, для якого виділяється пам’ять, і додаткових перетворень не потребує.
Синтаксис операторів:
тип *ім’я_масиву = new тип [тип число];
. . .
delete[] ім’я;