Не обязательно сразу формировать список, содержащий 200 000 элементов. Сначала можно только подсчитать пары байтов, а затем пройти по всем строкам еще раз, сохраняя позиции только для тех пар, которые встретились достаточно часто.
вполне логично, таким образом список изначально можно сократить, а вместе с ним и общее количество циклов... Сейчас подумаю над реализацией.
а с третьим байтом - я до сих пор не могу понять, что надо сделать.. Я так понимаю, надо линейно найти сначала в одной строке пару байтов, после того как она найдена попробовать интерпретировать следующий байт как индекс массива a[0..255] и в нужном месте увеличить значение элемента на один (пусть будет a[10], параллельно с этим запоминать и номера строк. потом сделать это же для второй строки и так далее.
после того как прошлись по всем строкам сверить значение а[10] со значением по индексу LinesCount[
первая склееная пара байтов, если значения счетчиков одинаковые, то обнулить значения в a[0..255] а так же в массиве индекса строк и пробовать дополнить четвертым байтом. И так до тех пор, пока не значения счетчиков не станут разными..
Помоему, тут больше циклов, если бы мы сформировали список из элементов встречающихся в более 50%, а потом бы скорректировали указатели таким образом, что бы выводить элементы с конца списка.. а что бы убрать склеенные байты - производить обратную операцию от склеивания:
Код:
byteBuf[1]:=curr2^.IndexArray;
явное переполнение, но именно оно нам и нужно:).. только тут надо с осторожностью делать это, что бы не потерять последний байт в блоке.
Добавлено спустя 5 минут 31 секунду:если мы будем терять байт при переполнении мы как раз исключаем байт, расположенный на стыке двух байтов
:
Цитата:
fa a9 93 34 3f и так далее
получим
Цитата:
fa 93
4 - теряем..
по потере видно, что начался другой блок байтов[/b]
Добавлено спустя 1 минуту 34 секунды:
после корректировки указателей строки, как и байты, выстраиваются и следуют точно друг за другом, иак что дополнительных сортировок не нужно
Добавлено спустя 1 минуту 29 секунд:
я Ваш вариант реализации просто не до конца понимаю, поэтому пытаюсь объяснить свой, вдруг он по эффективности такой же как и Ваш?
Добавлено спустя 3 минуты 53 секунды:
если потерю байта вовремя выявить, то будет корректно выведен и первый блок, и следующие за ними. Как вариант (особо не вдумывался пока, пока не скорректировал указатели) - контроллировать значения на стыке байтов, если они будут разными, то это будет границей блоков, а это будет означать, что последний 2 байты надо без изменений скопировать в byteBuf