| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 бита сравнить. Немного сумбурно, но может поможет |
| Автор: DeviceIK 6.12.2007, 15:51 |
| Основную задачу я уже решил - статистику блоков ищу и отображаю на графике нормально. Препод сказал отобразить там же все оставшиеся комбинации для данной последовательности. Т.е. взять перебор от 0000000, 0000001, 00000010, ... 11111111. Которых нет в файле, то 0 на ординат, которые есть - то сколько насчитал. Вопрос в том как все перебрать, если длина блока 4096! |
| Автор: VOS 6.12.2007, 16:26 |
| Ну как. Считать только те, которые есть Если тупо - берешь первые 4096 бит (512 байт) находишь вхождения, сдвигаешь на бит следующие 512 и т.д. Соответственно всех остальных - нет |
| Автор: xvr 7.12.2007, 14:45 | ||
По поводу перебора от 0 до 1111... для 4096 бит: Число вариантов 2**4096 ~ 10**1227 Если каждый вариант перебирается за 1 ns (10**-9 или 1G вариантов в сек), то на перебор всего уйдет ~ 10**1219 сек. Возраст солнечной системы ~1.8*10**17 сек. Делайте выводы |
| Автор: AntonChik 7.12.2007, 15:22 |
| думаю, задача не в практическом применении, а в "чисто теоретическом" написании алгоритма и в доказательстве того, что он способен доработать до конца без косяков) да и в конечном счете полный перебор в 4096 бит производить не только бесполезно(в плене ресурсов времени), но и глупо, т.к. явно задача задана на логическое мышление... и VOS как раз привел вполне разумное начало к действиям) |