![]() |
|
|
![]()
|
|
| regis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 12.12.2005 Где: Москва, Россия Репутация: нет Всего: 7 |
Вопрос, собственно, не сколько по алгоритмам, столько по структурам данных.
Есть объекты-таблицы, по своей сути похожие на те таблицы, которые создаются в MS Word, например. А именно: таблица состоит из прямоугольных ячеек (их содержимое для простоты пока игнорируем), но она не просто двумерный массив, т.к. одна ячейка может быть растянута на несколько строк, столбцов или строк/столбцов. (Однако, при этом ни одна ячейка не пересекается с другой.) Как представить такую таблицу в виде структур данных какого-нибудь языка высокого уровня (пусть, для определенности, будет C или C++, но можно и LISP)? Бинарное или N-арное дерево, например, отпадают (очень легко нарисовать таблицу, которая таким способом непредставима). Желательно также, чтобы выбранный способ представления был компактен и эффективен (как по памяти, так и по времени обработки). Особенно хочется найти *изящное* решение этой задачи (топорных я могу понапридумывать много, но меня они не устраивают Всем заранее спасибо за помощь. --------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: нет Всего: 196 |
Я не очень понял, что значит "ячейка может быть растянута"? Ты имеешь в виду, что в какой-то момент времени пользователь растягивает таблицу?
Если ты имеешь в виду что-то типа таблиц 1С (когда кликнув на ячейку ты получаешь доступ к подтаблице), то думаю это легко реализуется: Создаешь структуру/класс, в которой есть поле (по мимо всего остального) - значение (допустим, строка). Каждая ячейка - это ссылка на другую таблицу. Если у таблицы размеры нулевые, то она должна считаться не таблицей, а значением ячейки, которая на нее ссылается. Например:
Если это не подходит, приведи пример той таблицы, которую нельзя будет представить в таком виде. |
|||
|
||||
| regis |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 12.12.2005 Где: Москва, Россия Репутация: нет Всего: 7 |
Может быть, я не совсем точно выразился -- я имею в виду то, что одна ячейка может прилегать к нескольким соседним (по ширине, или по высоте, или и то и другое.)
В принципе, то, что вы предлагаете, и есть N-арное дерево (точнее, N*M-арное, если можно так сказать). Однако, привести пример таблицы, которую нельзя так представить, просто (sorry за ASCII-art): +---+---+---+ | | | +---+---+ + | | | | + +---+---+ | | | +---+---+---+ Думаю, что это простейший пример таблицы, которая не разбивается на подтаблицы, т.к. любое разбиение разрежет пополам минимум одну ячейку. Поэтому представить ее в виде дерева нельзя. Это сообщение отредактировал(а) regis - 17.4.2006, 10:34 --------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой. |
||||
|
|||||
| nostromo |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Возможно, Вы слишком ограниченно понимаете представление таблицы в виде иерархии подтаблиц. А что, если так:
--------------------
На пыльных тропинках далеких планет останутся наши следы. |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Для объединения ячеек по горизонтали или вертикали вполне сойдут флаги. Например, вводим флаги HOR_GROUP/VRT_GROUP. Певая ячейка, у которой есть такой флаг, начинает группу, первая, у которой он отсутствует - уже не в группе.
Данные хранить только в первой ячейке. Это если таблица представлена плотным 2-мерным контейнером. Вариант 2 - для разреженной таблицы. Объединенные ячейки не храним, а в первую ячейку записываем, скажем, индекс последней ячейки или размер группы. Делов-то. Главное - хорошо продумать и реализовать интерфейс класса таблицы. -------------------- ... |
|||
|
||||
| nostromo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Не совсем понятно, что именно хочет автор. Можно ли в участок 2x2 клетки помещать таблицу, скажем, 1x3 клетки?
--------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Если несколько клеток объединено, то левая верхняя хранит описАтель спана вправо и вниз, а все с ней объединенные - только признак объединения.
Например: Struct SPAN Vert as integer default=1 Hor as integer default=1 end struct Если клетка объединена - заполняется соотв. спан, а всем кто с ней объединен, присваивается спан = 0 в направлении объединения (один или оба, смотря где). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| regis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 12.12.2005 Где: Москва, Россия Репутация: нет Всего: 7 |
Спасибо всем за предложенные идеи.
Я бы обобщая все предложенное, сделал бы так: к каждой клетке (вдобавок ко всему прочему) добавляется описатель ее положения внутри "спана" -- что-нибудь вроде: int span_left, span_right; // сколько клеток в спане справа/слева int span_up, span_down; // то же, сверху/снизу Если клетка "нормальная", т.е. размеров 1x1, все эти элементы будут равны нулю. --------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |