Информация об изменениях

Сообщение Re: Обычный вопрос на собеседовании от 12.06.2019 13:36

Изменено 12.06.2019 13:38 Буравчик

Re: Обычный вопрос на собеседовании
Здравствуйте, Ватакуси, Вы писали:

В>Придумайте структуру(ы) данных, алгоритм(ы) для слияния двух деревьев, представляющих

В>а) Шаблон документа с разделами, имеющими 3 уровня вложенности (макс)
В>б) документ, унаследованный от этого шаблона и который может добавлять свои разделы на любом уровне из пункта а), но не может их менять.

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

В>- Желательно, чтобы при изменении шаблона нужно было перестраивать все документы, от него унаследованные.

Каждому разделу присваиваем глобальный идентификатор (UUID).
Дерево разделов храним в виде отображения (dict) родительских разделов на список дочерних — Dict[SectionID, List[Section]]
Для объединения шаблона и документа, берем "шаблон" и добавляем в него дочерние элементы из "документа", в соответствующие parent_id

В>- Задача на звёздочку, обеспечить работу удаления разделов в шаблоне.


Для возможности удаления разделов нужно сохранять в шаблоне список удаленных разделов (их UUID).
Во время слияния, если требуется вставить раздел из документа в удаленный элемент шаблона, то вставляем его в другое место.
В простейшем случае — в корень (тогда ничего не придется хранить), в более сложных — вставлять в заданное место, например в вышестоящий раздел (тогда придется запоминать родителей для каждого удаленного элемента).

В>PS: Что придумал самый лучший кандидат, я покажу позже. А пока — прошу предлагать свои решения.

В>PPS: Язык питон + алхимия + постгрес, но можно на самом деле использовать всё, что угодно.

Если нужно сохранять шаблоны и документы в БД, то я бы хранил в виде json: один документ/шаблон — одна строка таблицы.
При запросах вытаскивать json и делать слияние.
Re: Обычный вопрос на собеседовании
Здравствуйте, Ватакуси, Вы писали:

В>Придумайте структуру(ы) данных, алгоритм(ы) для слияния двух деревьев, представляющих

В>а) Шаблон документа с разделами, имеющими 3 уровня вложенности (макс)
В>б) документ, унаследованный от этого шаблона и который может добавлять свои разделы на любом уровне из пункта а), но не может их менять.

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

В>- Желательно, чтобы при изменении шаблона нужно было перестраивать все документы, от него унаследованные.

Каждому разделу присваиваем глобальный идентификатор (UUID).
Дерево разделов храним в виде отображения (dict) родительских разделов на список дочерних — Dict[ParentSectionID, List[ChildSection]]
Для объединения шаблона и документа, берем "шаблон" и добавляем в него дочерние элементы из "документа", в соответствующие parent_id

В>- Задача на звёздочку, обеспечить работу удаления разделов в шаблоне.


Для возможности удаления разделов нужно сохранять в шаблоне список удаленных разделов (их UUID).
Во время слияния, если требуется вставить раздел из документа в удаленный элемент шаблона, то вставляем его в другое место.
В простейшем случае — в корень (тогда ничего не придется хранить), в более сложных — вставлять в заданное место, например в вышестоящий раздел (тогда придется запоминать родителей для каждого удаленного элемента).

В>PS: Что придумал самый лучший кандидат, я покажу позже. А пока — прошу предлагать свои решения.

В>PPS: Язык питон + алхимия + постгрес, но можно на самом деле использовать всё, что угодно.

Если нужно сохранять шаблоны и документы в БД, то я бы хранил в виде json: один документ/шаблон — одна строка таблицы.
При запросах вытаскивать json и делать слияние.