Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с большим потоком бит


Автор: DeviceIK 6.12.2007, 09:21
Исследую файл в битовом виде. Ищу совпадение комбинаций внутри потока. Размер блока для исследования - от 2 до 4096. Т.е. например, 100 бит. Если первые 100 бит и 5е 100 бит совпадают, то увеличиваю счетчик для такой комбинации.
Задача отобразить на графике все комбинации для блока данной длины. Т.е. и встречающиеся, и все отсутствующие. Т.е. если блок 2 бита, комбинация 01 встречается 3 раза и все, то на графике: 
00 - 0, 
01 - 3, 
10 - 0, 
11 - 0.
Вопрос: как сделать то же самое для блока 4096? Поскольку комбинаций 2^4096, то обрабатывать все это довольно долго. Может по частям или еще как-нибудь. При этом при выводе еще надо проверять было ли совпадение такой комбинации в файле, чтобы на оси "У" отобразилось нужное значение.

Автор: VOS 6.12.2007, 13:58
Интересная задача.
Можно попробовать сделать union, а в нем соответственно

unsigned char mas_char     [512];
unsigned int    mas_int        [128];
unsigned short mas_short  [256];

потом скопировать туда исходную последовательность, в другой проверяемую.
затем, если размер сверяемой последовательности >8, то сравнивать src.mas_char[0] и dst.mas_char[0] 
если >16, то mas_short, если >32 то mas_int.
Тогда в основном будет использоваться не побитовое сравнение, а аппаратно сразу байт, слово и т.д.

Этим сразу будут отсекаться большое кол-во последовательностей. Ну а если совпало, а размеры последовательностей не кратны 8, то остальное сравнивать сдвигами.
Т.е. например размер 106 бит, тогда можно сравнивать как

mas_int[0],mas_int[1], mas_int[2] - это 96 байт, + mas_char[12] уже всего сравнили 104 бита и останется сдвигами только 2 бита сравнить.

Немного сумбурно, но может поможет smile

Автор: DeviceIK 6.12.2007, 15:51
Основную задачу я уже решил - статистику блоков ищу и отображаю на графике нормально. Препод сказал отобразить там же все оставшиеся комбинации для данной последовательности. Т.е. взять перебор от 0000000, 0000001, 00000010, ... 11111111. Которых нет в файле, то 0 на ординат, которые есть - то сколько насчитал. Вопрос в том как все перебрать, если длина блока 4096!

Автор: VOS 6.12.2007, 16:26
Ну как. Считать только те, которые есть smile
Если тупо - берешь первые 4096 бит (512 байт) находишь  вхождения, сдвигаешь на бит следующие 512 и т.д.
Соответственно всех остальных - нет smile

Автор: xvr 7.12.2007, 14:45
Цитата(DeviceIK @ 6.12.2007,  15:51)
Основную задачу я уже решил - статистику блоков ищу и отображаю на графике нормально. Препод сказал отобразить там же все оставшиеся комбинации для данной последовательности. Т.е. взять перебор от 0000000, 0000001, 00000010, ... 11111111. Которых нет в файле, то 0 на ординат, которые есть - то сколько насчитал. Вопрос в том как все перебрать, если длина блока 4096!

По поводу перебора от 0 до 1111... для 4096 бит:
Число вариантов 2**4096 ~ 10**1227
Если каждый вариант перебирается за 1 ns (10**-9 или 1G вариантов в сек), то на перебор всего уйдет ~ 10**1219 сек. Возраст солнечной системы ~1.8*10**17 сек. Делайте выводы  smile 

Автор: AntonChik 7.12.2007, 15:22
думаю, задача не в практическом применении, а в "чисто теоретическом" написании алгоритма и в доказательстве того, что он способен доработать до конца без косяков)

да и в конечном счете полный перебор в 4096 бит производить не только бесполезно(в плене ресурсов времени), но и глупо, т.к. явно задача задана на логическое мышление... 

и VOS  как раз привел вполне разумное начало к действиям)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)