Решение для интервью - обрезка разрыва буфера - PullRequest
4 голосов
/ 04 октября 2011

Вопрос, с которым я столкнулся, касается реализации структуры данных Gap Buffer .В частности, я говорю о структуре данных, которая по сути представляет собой LinkedList, где каждый узел представляет собой (довольно маленький) массив символов.Это идеально подходит для редактирования текста, потому что вы можете вставлять больше символов в любой точке, выделяя новые массивы, если нет места, куда вы смотрите.

Внедрение самого Gap Buffer не представляет особой проблемы, так как выглядит в точности какLinkedList и методы реализации, такие как Add и Remove, являются алгоритмически простыми.Просто вставьте новый символ в узел, соответствующий позиции, если есть место, и выделите новый узел, если требуется больше места.

Самым сложным вопросом была эффективная реализация метода Trim с постусловием.что при запуске Trim все непробельные элементы в буфере разрыва будут «сжаты» по направлению к началу, то есть все элементы перемещаются как можно дальше вперед, а пробелы сокращаются.

Наивный метод состоит в том, чтобы просто перебирать каждый элемент массива один за другим, перемещая его в следующее свободное пространство до тех пор, пока все элементы не будут повторены, и затем удаляя все пустые узлы в конце списка.Однако это не идеально:

Если во время итерации мы приближаемся к пустому массиву, мы должны немедленно удалить этот массив из списка, объединив вокруг него 2 массива.С другой стороны, если мы приближаемся к массиву, который полностью заполнен, мы должны пропустить массив, так как он уже уплотнен.

Являются ли эти два случая единственными случаями, которые нам нужно рассмотреть, когда речь идет об эффективности?Есть ли другие потенциальные улучшения?И как будет выглядеть полностью эффективный Trim алгоритмически?

1 Ответ

0 голосов
/ 04 октября 2011

Одним из улучшений было бы обнаружение того, что массив пуст после того, как мы его обрезали.Если он пуст, просто удалите его, а не копируйте в него следующий массив.

...