Есть такая задача: надо написать быстрый алгоритм WordWrap для текста/кода представленного в виде массива строк и последующей работы с этим самым текстом (перемещение, удаление, копирование, встака — вообщем все дела). На ум пока пришло токо два варианта:
1. Продолжать работать с тем же массивом реальных строк, а wrapить текст виртупльно, только перед выводом на экран или по запросу. Кульно, но тока есть пара недостатков:
— для вычисления количества виртуальных строк приходиться каждый раз пересчитывать количество субстрок для всего массива, типа
int SubLineCount = 0;
for (int i=0; i<LinesArray.GetCount(); i++)
SubLineCount += LinesArray[i].GetSubLinesCount();
— для вычисления реальной строки по виртуальной и наоборот приходиться использовать тот же дебильный подход.
int SubLineCount = 0;
for (int i=0; i<LinesArray.GetCount(); i++)
{
SubLineCount += LinesArray[i].GetSubLinesCount();
if (SubLineCount >= NeededSubline)
return i; //Real Line
}
Результат на массиве в 15000 строк медленно и тормознуто...
Были идеи:
— бафферить результаты предыдущкго вызова (если запрос повторяеться)
— использовать пару опорных точек (типа запоминать скоко субстрок в половине массива и 3/4) а потом их обновлять и использовать в подсчетах...
Но все очень геморойно и не красиво причем надо отловить все точки, где обновлять эти дела..
2. Враппить строки реально, и работать с субстроками определяя носмер реальной строки по атрибуту субстроки, а конец реальной субстроки по вставленному СR/LF в конце последней в рельной строке субстроке..
По теории должно работать быстрее по крайней мере маппинг виртуальной строки к реальной. Количество виртуальных строк тоже быстро. Но:
— поиск реальной строки долго,
— реальный врапп всего массива в случае изменения макс длины строки долго
— тяжело сопоставить запомненые координаты до и после изменения wrapa.
Вопрос: cуществуют ли стандартные/оптимальные/лучшие алгоритмы для данной задачи?
Любой помощи буду благодарен