какой метод больше подходит для кодирования Хаффмана я хочу читать символы с их частотой - PullRequest
0 голосов
/ 29 декабря 2018

два цикла чтения символов из строки

void ReadCharWithFreq(string str){ 
    int n = str.size();  
    int count = 0;

    // loops to read all char from string and frequency
    for(int i = 0;i<n;i++){
        for(int x =0;x<n;x++ ){
            if(str[i]==str[x]){
                count++;
            }
        }       

        //enqueue char with frequency
        enqueue(str[i],count);
        count=0;
    }
} //end of function

та же функция с другим методом с использованием массива кучи freq [] и memeset, и я не понимаю функцию memeset (array, int, int)

void ReadCharWithFreq(string str){ 

    int n = str.size(); 
    int SIZE = 40;
    int spf=0;

    memset(freq, 0, sizeof(freq));

    for (int i = 0; i < n; i++){
        freq[str[i] - 'a']++; 
    }

    for (int i = 0; i < n; i++) { 
        if (freq[str[i] - 'a'] != 0) { 
            cout << str[i] <<" "<< freq[str[i] - 'a'] << " - >"; 
            enqueue(str[i], freq[str[i] - 'a']);
            freq[str[i] - 'a'] = 0;
        } 
    } 
} //end of function

Какой из вышеперечисленных алгоритмов является более точным и эффективным, я хочу прочитать все символы из строки и посчитать их возникновение / частоту

1 Ответ

0 голосов
/ 29 декабря 2018

Я бы использовал std::array с достаточным пространством для хранения количества всех символов, с которыми вы можете столкнуться:

#include <array>
#include <limits>

constexpr size_t ArrSize = std::numeric_limits<unsigned char>::max()+1;

std::array<unsigned char, ArrSize> ReadCharWithFreq(const std::string& str){
    std::array<unsigned char, ArrSize> freq{};
    for(unsigned char ch : str)
        freq[ch]++;
    return freq;
}

Пример использования:

#include <iostream>
#include <iomanip>
#include <vector>

int main(int argc, char* argv[]) {
    std::vector<std::string> args(argv+1, argv+argc);

    for(const auto& str : args) {
        auto result = ReadCharWithFreq(str);

        for(size_t i=0; i<ArrSize; ++i) {
            if(result[i]) {
                std::cout << std::setw(3) << i << " " << static_cast<char>(i) << " " << static_cast<int>(result[i]) << "\n";
                // enqueue here? 
            } 
        }
    }
}
...