Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/75: Рейтинг темы: голосов - 75, средняя оценка - 4.99
1 / 1 / 0
Регистрация: 08.01.2017
Сообщений: 4
1

Энтропия Шеннона

08.01.2017, 09:19. Показов 13715. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. После 3 часового поиска в Гугле, в том числе и на вашем форуме, решил таки задать вопрос сам. Нужна помощь в следующем:
Определить энтропию, приходящуюся в среднем на одну букву, длину кода при равномерном кодировании и избыточность.
Программа имеет возможность ввода произвольного текста и выделяет буквы алфавита этого самого текста.
Помогите пожалуйста студенту, который очень плохо понимает программирование)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2017, 09:19
Ответы с готовыми решениями:

Формула Шеннона "Энтропия, бит"
Здравствуйте, подскажите пожалуйста, как написать функцию которая будет считать Энтропию файла ?

Информационная энтропия
Здравствуйте. С предмета основы теории информации задали написать программу для вычисления...

Энтропия источника информации
Помоги, пожалуйста. Определить энтропию источника информации. Источник расположен в файле...

Количество информации. Энтропия
В алфавите m символов. В сообщении n символов. Определите – количество всевозможных сообщений...

4
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 10:53 2
Цитата Сообщение от Anonser Посмотреть сообщение
Помогите пожалуйста студенту, который очень плохо понимает программирование
А математику студент хорошо понимает? Если да, то было бы неплохо сначала увидеть математическую часть решения.
0
1 / 1 / 0
Регистрация: 08.01.2017
Сообщений: 4
08.01.2017, 11:49  [ТС] 3
С математикой немного лучше. Но не совсем понятно, что имеется ввиду под математической частью.
Но тем не менее попробую.
В задании дано: Написать программу, которая бы позволила ввести сообщение произвольной длины. Для этого мы используем класс string str. Далее используем (функцию?) getline (cin, str); и делаем вывод. Это не сложно, но это первый шаг.
Далее программа должна выделить буквы алфавита введенного текста, подсчитать и выдать частоту появления этих букв. Т.е. кол-во букв (к примеру А)/ Количество букв в тексте
И вот, что я нашел ( но не особо понял, как это использовать)
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    int mas[256];
    int i = 0, len, imax = 0;
    while(i < 256) 
        mas[i++] = 0;
    char str[300];
    std::cout<<"input string:\n";
    std::cin.getline(str, 300);
    len = strlen(str);
Третий шаг - это вычисление энтропии. Формула: H=ƩPi*log2(1/Pi), где H - энтропия, Pi - вероятность появления каждого символа в файле источника. С длинной кода легче. При условии, что алфавит не компьютерный (256 символов), а русский (32 символа (ъ и ь, е и ё отождествлены и считается знак _) ), то на 1 букву (символ) приходится 5 бит информации * на кол-во символов. Ну а избыточность вычисляется так: P= 1 - H/ log(2) M, где H - энтропия на одну букву, M - кол-во символов в алфавите.
1
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
08.01.2017, 12:50 4
Anonser,

Я считал, что алфавит состоит из введенных символов, и заглавные и строчные буквы — различные символы.

C++
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
#include <iostream>
#include <string>
#include <map>
#include <cmath>
 
using namespace std;
 
 
int main()
{
    map<char, int> freq;
    string inputString;
 
    getline(cin, inputString);
    
    for (char symbol : inputString)
    {
        if (freq.find(symbol) == freq.end())
            freq[symbol] = 1;
        else
            freq[symbol] += 1;
    }
 
    size_t stringLen = inputString.length();
    double entropy = 0;
    double prob;
    for (const auto& symCount : freq)
    {
        cout << prob << symCount.first << endl;
        entropy -= prob * log2(prob);
    }
 
    double h = entropy / stringLen;
    cout << "Entropy: " << entropy << endl
        << "Entropy on a symbol: " << h << endl
        << "Length of code: " << ceilf(log2(freq.size())) << endl
        << "Redundancy: " << 1 - h / log2(freq.size()) << endl;
}
1
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
08.01.2017, 13:00 5
Нахождение частоты появления букв:
C++
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
#include <iostream>
#include <iomanip>
#include <string>
 
using namespace std;
 
int main()
{
    string alphabet{"abcdefghijklmnopqrstuvwxyz"};
    int freq[256] = {0};
    string s;
    cout << "Enter string:" << endl;
    getline(cin, s);
 
    for (auto c: s) {
        freq[c]++;
    }
 
    int totalCount = 0;
    for (auto letter: alphabet) {
        totalCount += freq[letter];
    }
 
    for (auto letter: alphabet) {
        cout << letter
             << " => " << freq[letter] // сколько раз встретилась буква
             << " => " << double(freq[letter]) / totalCount // частота
             << endl;
    }
 
    cout << endl << "Total letters: " << totalCount << endl;
 
    return 0;
}
1
08.01.2017, 13:00
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2017, 13:00
Помогаю со студенческими работами здесь

Кодирование Шеннона-Фано
Окей мы посчитали вероятности символов и прочие штуки.. Далее нужно создать таблицу уник....

Алгоритм Шеннона-Фано
Помогите, реализовать Алгоритм Шеннона-Фано на С ++, так чтобы мы вводили сроку из символов, а на...

Метод Шеннона фано
Помогите пожалуста реализовать самый простой способ этого алгоритма сжатия на С/С++ Добавлено...

Метод Шеннона-Фано
метод Шеннона-Фано, рассортировал вероятности по убыванию, а после не могу ничего сделать((...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
Что такое паттерны программировани­я и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
Что такое javascript:void­­(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru