Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внутреннее представление таблицы 
:(
    Опции темы
regis
Дата 14.4.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Вопрос, собственно, не сколько по алгоритмам, столько по структурам данных.

Есть объекты-таблицы, по своей сути похожие на те таблицы, которые создаются в MS Word, например. А именно: таблица состоит из прямоугольных ячеек (их содержимое для простоты пока игнорируем), но она не просто двумерный массив, т.к. одна ячейка может быть растянута на несколько строк, столбцов или строк/столбцов. (Однако, при этом ни одна ячейка не пересекается с другой.)

Как представить такую таблицу в виде структур данных какого-нибудь языка высокого уровня (пусть, для определенности, будет C или C++, но можно и LISP)? Бинарное или N-арное дерево, например, отпадают (очень легко нарисовать таблицу, которая таким способом непредставима). Желательно также, чтобы выбранный способ представления был компактен и эффективен (как по памяти, так и по времени обработки). Особенно хочется найти *изящное* решение этой задачи (топорных я могу понапридумывать много, но меня они не устраивают smile )

Всем заранее спасибо за помощь.


--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
bsa
Дата 14.4.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Я не очень понял, что значит "ячейка может быть растянута"? Ты имеешь в виду, что в какой-то момент времени пользователь растягивает таблицу?
Если ты имеешь в виду что-то типа таблиц 1С (когда кликнув на ячейку ты получаешь доступ к подтаблице), то думаю это легко реализуется:
Создаешь структуру/класс, в которой есть поле (по мимо всего остального) - значение (допустим, строка). Каждая ячейка - это ссылка на другую таблицу. Если у таблицы размеры нулевые, то она должна считаться не таблицей, а значением ячейки, которая на нее ссылается.
Например:
Код
struct table {
       char * value;
       int cols;
       int rows;
       struct table * cells;
};

Если это не подходит, приведи пример той таблицы, которую нельзя будет представить в таком виде.
PM   Вверх
regis
Дата 17.4.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Цитата

Я не очень понял, что значит "ячейка может быть растянута"? Ты имеешь в виду, что в какой-то момент времени пользователь растягивает таблицу?


Может быть, я не совсем точно выразился -- я имею в виду то, что одна ячейка может прилегать к нескольким соседним (по ширине, или по высоте, или и то и другое.)

Цитата

Создаешь структуру/класс, в которой есть поле (по мимо всего остального) - значение (допустим, строка). Каждая ячейка - это ссылка на другую таблицу. Если у таблицы размеры нулевые, то она должна считаться не таблицей, а значением ячейки, которая на нее ссылается.


В принципе, то, что вы предлагаете, и есть N-арное дерево (точнее, N*M-арное, если можно так сказать). Однако, привести пример таблицы, которую нельзя так представить, просто (sorry за ASCII-art):


    +---+---+---+
    |       |   |
    +---+---+   +
    |   |   |   |
    +   +---+---+
    |   |       |
    +---+---+---+


Думаю, что это простейший пример таблицы, которая не разбивается на подтаблицы, т.к. любое разбиение разрежет пополам минимум одну ячейку. Поэтому представить ее в виде дерева нельзя.
 

Это сообщение отредактировал(а) regis - 17.4.2006, 10:34
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
nostromo
Дата 17.4.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата

Думаю, что это простейший пример таблицы, которая не разбивается на подтаблицы, т.к. любое разбиение разрежет пополам минимум одну ячейку. Поэтому представить ее в виде дерева нельзя.


Возможно, Вы слишком ограниченно понимаете представление таблицы в виде иерархии подтаблиц.

А что, если так:
Код

struct table {
    int cols;
    int rows;
    ... ; // прочие свойства
    struct cell * cells; // список ячеек
};

struct cell {
   int x0, y0; // координаты левого верхнего угла ячейки в логических ячейках родительской таблицы
   int cols; // число колонок, занимаемых ячейкой в родительской таблице
   int rows; // число строк, занимаемых ячейкой в родительской таблице
   struct table *t; // собственно подтаблица. Если t == NULL, то данная ячейка -- простая со значением data;
   char *data; // содержимое ячейки
};



 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Earnest
Дата 20.4.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Для объединения ячеек по горизонтали или вертикали вполне сойдут флаги. Например, вводим флаги HOR_GROUP/VRT_GROUP. Певая ячейка, у которой есть такой флаг, начинает группу, первая, у которой он отсутствует - уже не в группе. 
Данные хранить только в первой ячейке.
Это если таблица представлена плотным 2-мерным контейнером.

Вариант 2 - для разреженной таблицы. Объединенные ячейки не храним, а в первую ячейку записываем, скажем, индекс последней ячейки или размер группы.
Делов-то. 
Главное - хорошо продумать и реализовать интерфейс класса таблицы.  


--------------------
...
PM   Вверх
nostromo
Дата 21.4.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Не совсем понятно, что именно хочет автор. Можно ли в участок 2x2 клетки помещать таблицу, скажем, 1x3 клетки? 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Akina
Дата 21.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Если несколько клеток объединено, то левая верхняя хранит описАтель спана вправо и вниз, а все с ней объединенные - только признак объединения.

Например:

Struct SPAN
Vert as integer default=1
Hor as integer default=1
end struct

Если клетка объединена - заполняется соотв. спан, а всем кто с ней объединен, присваивается спан = 0 в направлении объединения (один или оба, смотря где). 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
regis
Дата 11.5.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Спасибо всем за предложенные идеи.
Я бы обобщая все предложенное, сделал бы так: к каждой клетке (вдобавок ко всему прочему) добавляется описатель ее положения внутри "спана" -- что-нибудь вроде:

int span_left, span_right;            // сколько клеток в спане справа/слева
int span_up, span_down;     // то же, сверху/снизу

Если клетка "нормальная", т.е. размеров 1x1, все эти элементы будут равны нулю.
 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.