Я пытаюсь реализовать кодирование Хаффмана в C #.У меня проблема с кодированием больших файлов, так как это занимает слишком много времени.Например, для кодирования двоичного файла размером 11 МБ в режиме отладки требуется 10 секунд.И я даже не удосужился дождаться, пока моя программа завершит работу с файлом размером 27 МБ.
Вот проблемный цикл:
BitArray bits = new BitArray(8);
byte[] byteToWrite = new byte[1];
byte bitsSet = 0;
while ((bytesRead = inputStream.Read(buffer, 0, 4096)) > 0) // Read input in chunks
{
for (int i = 0; i < bytesRead; i++)
{
for (int j = 0; j < nodesBitStream[buffer[i]].Count; j++)
{
if (bitsSet != 8)
{
bits[bitsSet] = nodesBitStream[buffer[i]][j];
bitsSet++;
}
else
{
bits.CopyTo(byteToWrite, 0);
outputStream.Write(byteToWrite, 0, byteToWrite.Length);
bits = new BitArray(8);
bitsSet = 0;
bits[bitsSet] = nodesBitStream[buffer[i]][j];
bitsSet++;
}
}
}
}
nodesBitStream
- это Dictionary<byte, List<bool>>
.List<bool>
- это представление пути от корня дерева Хаффмана до конечного узла, содержащего определенный символ, представленный как byte
.
Таким образом, я накапливаю биты, чтобы сформировать байт, который я записываю в кодированный файл.Совершенно очевидно, что это может занять очень много времени, но я пока не нашел другого пути.Поэтому я прошу совета о том, как ускорить процесс.