Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2019, 07:57   #1
Питерский2
Пользователь
 
Регистрация: 20.05.2014
Сообщений: 29
По умолчанию Подскажите алгоритм кодирования с избыточностью

Доброго времени суток!
Буду очень благодарен за помощь. Стоит следующая задача: есть некий большой массив информации, допустим файл. Он разделен на достаточно большие фрагменты по 32КБ. Эти фрагменты могут теряться безвозвратно (не портится, а именно теряться; т.е. если информация есть, то она обязательно корректна, либо её нет). Нужен алгоритм, который будет для заданной входной совокупности корректных данных и максимально допустимого количества потерянных блоков генерировать информацию для восстановления, по которой эти потерянные блоки (заданные по порядковому номеру например) можно будет восстановить. Притом объем этой "информации для восстановления" должен быть как можно ближе к теоретическому минимуму (т.е. главное эффективность использования энергонезависимой памяти, быстродействие и расход ОЗУ роли не играет).
Быстрый гуглеж рассказал мне о кодах Рида-Соломона, но после краткого прочтения статьи в Википедии появились сомнения что это именно то что мне надо. Может есть готовые специализированные алгоритмы под мою задачу, используемые в архиваторах например?
С уважением!
Питерский2 вне форума Ответить с цитированием
Старый 27.03.2019, 15:49   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Матричное кодирование. С длинной блока допустим 256х8
256 бит=32 байта распределяем по блокам, как при раздаче колоды карт, как то принято в RAID6

Избыточные коды и коды чётности триплировать и распределить ленточно по блокам.

(25+256)/256=1,097

Если потерянных блоков может быть больше 1 то соотвественно увеличиваем размер матрицы 256x16 и так далее. При размере 256x256 получим полное дублирование.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 27.03.2019 в 15:59.
Pavia вне форума Ответить с цитированием
Старый 27.03.2019, 21:18   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Питерский2
Короче я бы реализовал коды Хэмминга как самые простые и перетосовал бы как на картинке (или около того).





Пример сортировки


Тут немного подробнее с примерами в кодах Рида-Соломона,
http://computersciencelabs.blogspot....-of-raid6.html
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 27.03.2019 в 21:21.
Pavia вне форума Ответить с цитированием
Старый 28.03.2019, 07:01   #4
Питерский2
Пользователь
 
Регистрация: 20.05.2014
Сообщений: 29
По умолчанию

Привет Pavia!
Спасибо за развернутые ответы!
Завтра я изучу все написанное тобой подробнее, потому что в пять утра уже голова не варит) Касательно кодов Хэмминга, то перетасовывать наоборот не надо, информация для восстановления типа передается по другому каналу, который считается 100% надежным, но я думаю что это уже детали реализации...
Что касается кодов Рида-Соломона, то я пока отверг их потому, что применение их "влоб" в моем случае не отвечает условию:
Цитата:
Притом объем этой "информации для восстановления" должен быть как можно ближе к теоретическому минимуму (т.е. главное эффективность использования энергонезависимой памяти, быстродействие и расход ОЗУ роли не играет).
Рассмотрим случай, когда допустима потеря одного 32КБ блока информации. Из свойств кодов Р-С (цитата из Википедии)
Цитата:
Код Рида — Соломона над G F ( q m ), исправляющий t ошибок, требует 2t проверочных символов и с его помощью исправляются произвольные пакеты ошибок длиной t и меньше
следует, что потребуется 64КБ дополнительно. Контрпример: посчитаем XOR всех 32КБ блоков и получим контрольный 32КБ блок. При потере одного из блоков (по условию задачи находить какой именно блок поврежден не надо, это станет известно из третьих источников, например контрольной суммы которая передается по защищенному каналу) XOR этого контрольного блока и всех оставшихся даст потерянный. Итого информация для восстановления занимает 32КБ против 64КБ у Рида-Соломона. К сожалению, я не представляю как распространить подобный подход на допустимое количество потерянных блоков больше 1. Интуитивно понятно, почему коды Р-С. в данном примере менее эффективны - потому что они позволяют отыскать и исправить 32КБ (32*1024*8 = 262144) произвольных ошибочных битов, но условия моей задачи таковы что эти 262144 ошибочных битов идут строго по очереди (фрагмент 32КБ),а не произвольным образом, и кроме того не нужно определять какие именно биты повреждены, следовательно коды Рида-Соломона оказываются избыточны. Вот если бы был алгоритм вроде кодов Р-С для которых "элементарной единицей" информации был бы не бит, а блок битов, то возможно это было бы то что нужно. Но мои познания в математике не позволяют додуматься до этого самому, да и велосипед изобретать не хочется, наверняка уже придумано до нас множество годных алгоритмов, но так как для меня эта область новая, я не в курсе где что искать))
Спасибо ещё раз за информацию, завтра отпишусь.
Хорошего дня!
Питерский2 вне форума Ответить с цитированием
Старый 28.03.2019, 11:15   #5
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от Питерский2 Посмотреть сообщение
Эти фрагменты могут теряться безвозвратно (не портится, а именно теряться; т.е. если информация есть, то она обязательно корректна, либо её нет).
если вопрос стоит в восстановлении утерянной информации, а не именно написании алгоритма кодирования с избыточностью, то зачем информацию восстанавливать?
Передаёте нумерованные пакеты, если конкретный пакет потерялся безвозвратно, то не проще ли его передать заново?
kvitaliy вне форума Ответить с цитированием
Старый 28.03.2019, 17:28   #6
Питерский2
Пользователь
 
Регистрация: 20.05.2014
Сообщений: 29
По умолчанию

kvitaliy, конечно проще повторить передачу, но задание именно в алгоритме)

Последний раз редактировалось Питерский2; 28.03.2019 в 17:31.
Питерский2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм оптимального кодирования Хаффмена Maray Помощь студентам 1 07.11.2015 16:43
Алгоритм оптимального неравномерного кодирования Damir1990 Помощь студентам 0 02.10.2012 15:11
Алгоритм группового кодирования Archetype Visual C++ 0 24.12.2011 15:19
как на асме реализовать алгоритм манчестерского кодирования Lanches Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.07.2007 13:50