Алгоритм WordWrap.
От: Kefir http://www.hippoedit.com
Дата: 12.08.03 14:10
Оценка:
Есть такая задача: надо написать быстрый алгоритм 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уществуют ли стандартные/оптимальные/лучшие алгоритмы для данной задачи?

Любой помощи буду благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.