Форум программистов, компьютерный форум CyberForum.ru

Алгоритм Хаффмана - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Массив http://www.cyberforum.ru/cpp-beginners/thread269156.html
Дана матрица n*m. Сформировать одномерный массив X(m), состоящий из максимальных элементов каждого столбца. В полученом массиве выбрать наименьший элемент и количество нечётных чисел.
C++ Функция strcpy цель очевидна. почему не работает? :-| #include <iostream> void strcpy(char *from, char *to) { to=from; } int main() { char* f = "The array of chars"; char* t = "An Array of chars!"; strcpy(f,t); http://www.cyberforum.ru/cpp-beginners/thread269153.html
C++ fatal error C1004
>c:\documents and settings\er\мои документы\visual studio 2008\projects\project14\project14\project14.cpp(14) : fatal error C1004: непредвиденное обнаружение конца файла #include <stdafx.h> #include <iostream> #include "incl.h" #include "project141.cpp" #include <cstdlib> using namespace std;
C++ конструкция
Доброго времени суток, с с++ мало знаком не могли бы пояснить некоторые моменты кода. #include <math.h> void tred2(float **a, int n, float *d, float *e) { int l,k,j,i; float scale,hh,h,g,f; /* Проход по стадиям процесса редукции */ for(i=n;i>=2;i--) { l=i-1; h=scale=0.;
C++ Программа для поиска минимального значения функции http://www.cyberforum.ru/cpp-beginners/thread269127.html
Всем привет! Помогите разобраться и найти ошибку в коде программы. В задачу входило скомпилировать программу на С++, которая ищет оптимальные значения X (минимум) в уравнении, содержащем эффекты линейного взаимодействия x2*x3, x2*x5 и квадратичный эффект x4^2 Уравнение выглядит следующим образом: y=226,17 + 57,72x1 + 17,51x4 + 22,92x5 - 11,43x1x3 + 15,22x2x3 + 29,83x2x5 + 6,86x4^2 Проект...
C++ Как сделать pack() из php Здравствуйте! В php есть функция pack() Подскажите пожалуйста, как в с++ реализовать строку из php $string= pack('H*', '202cb962ac59075b964b07152d234b70'); Спасибо. Добавлено через 37 минут а если быть точнее, то в с++ у меня есть string pw ("abc"); string md5 (md5(pw)); подробнее

Показать сообщение отдельно
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
03.04.2011, 09:30     Алгоритм Хаффмана
Решил разобраться с этим алгоритмом, собственно он состоит из нескольких из таких шагов:
1) Создать массив со всеми символами.
2) Прочитать строку и определить сколько раз каждый символ встречается в ней.
3) Отсортировать по частотности, по убыванию либо по возрастанию.
4) Построить бинарное дерево.
5) Зашифровать файл по бинарному дереву.

1,2,3 пункты я сделал успешно.
Но 4 пункт я вообще не представляю как его сделать, что использовать ...
Можете рассказать как строить это бинарное дерево и самое главное, что использовать при этом строение?

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
using namespace std;
const int MAX_SYM = 256;
#include "class.hpp"
 
int main()
{
  hmn.Init();
  hmn.LoadSymbols();
  hmn.ComputeFreak();
  hmn.OutPut();
  return 0;
}
class.hpp
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
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
class Haf
{
  char ArrSym[257];
  int ArrFreak[257];
  int TaleSym;
  char MeetSym[257];
  int MeetFreak[257];
public:
  string CinStr;
  void Init();
  void OutPut();
  void LoadSymbols();
  void ComputeFreak();
}hmn;
 
void Haf::Init()
{
  for(int i = 0; i < MAX_SYM;i++)
    ArrFreak[i] = 0;
  TaleSym = 0;
}
 
void Haf::LoadSymbols()
{
  for(int i = 0; i < MAX_SYM;i++)
    ArrSym[i] = (char)i;
}
 
void Haf::ComputeFreak()
{
  cout << "Введите строку:";
  getline(cin,CinStr);
 
  for(int i = 0;i < CinStr.size();i++)
    for(int j = 0;j < MAX_SYM;j++)
    {
      if(CinStr[i] == ArrSym[j])
    {
      ArrFreak[j]++;
      break;
    }
    }
  
  for(int i = 0;i < MAX_SYM;i++)
    {
      if(ArrFreak[i] > 0)
    {
      MeetSym[TaleSym] = ArrSym[i];
      MeetFreak[TaleSym] = ArrFreak[i];
      TaleSym++;
    }
    }
 
  for(int i = TaleSym - 1;i >= 0;i--)
    for(int j = 0;j < i;j++)
      {
    if(MeetFreak[j] > MeetFreak[j + 1])
      {
        int Old = MeetFreak[j];
        MeetFreak[j] = MeetFreak[j + 1];
        MeetFreak[j + 1] = Old;
 
        Old = (int)MeetSym[j];
        MeetSym[j] = MeetSym[j + 1];
        MeetSym[j + 1] = (char)Old;
      }
      }
}
 
 
void Haf::OutPut()
{
  for(int i = 0;i < TaleSym;i++)
      cout << MeetSym[i] << " " << MeetFreak[i] << endl;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru