Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Общие вопросы Web
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2022, 20:11   #1
Павел26
Новичок
Джуниор
 
Регистрация: 02.12.2022
Сообщений: 3
По умолчанию Выбор алгоритма

Всем привет. Решаю задачу. (PHP, MySQL, Redis)
а) Есть сотрудники и отделы. Вложенность отделов друг в друга не ограничивается. Внутри отдела могут быть как сотрудники, так и отделы (небинарное дерево).
б) Из этих же сотрудников формируют группы. Вложенность групп друг в друга не ограничивается. Внутри группы могут быть как сотрудники, так и группы (небинарное дерево). Все аналогично отделам.
Задача такая:
1) Выбирают сотрудника - нужно определить - выбран ли его отдел полностью или частично и это же нужно определить до самого верха иерархии.
отдел1 -- выбран частично
отдел11 -- выбран частично
сотрудник111
сотрудник112 -- выбран
отдел12 -- выбран полностью
сотрудник121 -- выбран
отдел13
2) Выбирают отдел - нужно определить - выбран ли его отдел полностью или частично и это же нужно определить до самого верха иерархии.
отдел1 -- выбран частично
отдел11
отдел12
отдел13 -- выбран полностью
В обоих случаях нужно это же определять и для групп (б): выбрали отдел с сотрудниками - нужно в группах определить, какие из них выбраны полностью, какие частично.

Все сотрудники, их отделы и группы хранятся в MySql в разных таблицах.

Как я решил эту задачу сейчас (язык PHP):
Из БД беру отделы и сотрудников и собираю небинарное дерево (использую https://github.com/loophp/phptree). Это же делаю для групп.
В этом дереве ищу нужный узел и отмечаю его выбранным.
Потом обхожу дерево чтобы собрать данные по выбранным полностью/частично узлам.

Выбираем сотрудника: отмечаем его выбранным (ставим флаг), переходим к его отделу (узел родитель в дереве), получаем его детей, смотрим выбраны они или нет. Если выбран хоть один - частично, если все-полностью. Если среди детей есть отдел, то чтобы определить выбран он или нет в него не спускаемся, просто просто смотрим его флаг (выбран/не выбран)

Дальше собираем статистику - обходим дерево и собираем все выбранные полностью отделы, частично выбранные, и выбранных сотрудников.
На основе выбранных сотрудников в дереве групп собираю такую же инфу по выбранным полностью/частично.
Для того чтобы не дергать каждый раз БД храню деревью в редисе.

Какие проблемы в текущем решении:
Каждый раз деревья надо доставать из БД (и рекурсивно индексировать в дерево) или редиса (и так же превращать в объекты)
Если Выбирать надо сразу 10 отделов, то это кратно увеличивает количество обходов.

По сути это все аналогично TreeView

Как бы вы решали эту проблему? Использовали ли деревья или плоские структуры? Какие?
Где бы хранили сотрудников с отделами и группами, чтобы уменьшить накладные расходы или вообще иметь возможность обходиться только функционалом хранилища?
Возможно какие-то иные алгоритмы? Любые мысли приветствуются!
Павел26 вне форума Ответить с цитированием
Старый 03.12.2022, 08:44   #2
Areostar
Пользователь
 
Регистрация: 19.12.2007
Сообщений: 50
По умолчанию

то есть выбираем сотрудника и надо опредилить отдел и надотделы где тот состоит?

А как БД организовали?

Для чего конкретно эта аппликашка?
Areostar вне форума Ответить с цитированием
Старый 03.12.2022, 09:35   #3
Павел26
Новичок
Джуниор
 
Регистрация: 02.12.2022
Сообщений: 3
По умолчанию

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

Для чего: есть приложение, там выводим орг структуру предприятия - список отделов, проваливаемся в отдел, видим что там и так до самого низа. В этом же приложении выводим сотрудников предприятия по группам. Если выбрали сотрудника(ков)/отдел(лы), то далее гуляя по иерархии должны видеть какие отделы полностью выбраны, а какие частично. И если перейти в структуру групп - должны видеть это же.
В БД сотрдуники, группы и отделы лежат по отдельным таблицам. У сотрудника есть ссылка на его группу и отдел. У отдела есть ссылка на его отдел, у группы есть ссылка на ее группу.

В сторону nested sets, adjacency list и прочее для реляционной БД смотрел, это не подходит именно их за того, что надо помимо самой иерархии вычислять, какие группы/оделы выбраны полностью, а какие частично.

Это уже работающее приложение.
Павел26 вне форума Ответить с цитированием
Старый 03.12.2022, 20:01   #4
Areostar
Пользователь
 
Регистрация: 19.12.2007
Сообщений: 50
По умолчанию

что значит целиком или полностью? можно выбрать несколько человек? или учитываюся пердыдущие выборы?

На каком стеке реализуете?
Areostar вне форума Ответить с цитированием
Старый 04.12.2022, 11:49   #5
Павел26
Новичок
Джуниор
 
Регистрация: 02.12.2022
Сообщений: 3
По умолчанию

Если в отделе 10 человек, и выбраны все 10, то отдел выбран полностью, если выбраны от одного до десяти, то отдел выбран частично.
По стеку в первом сообщении вроде бы все описал: храню в MySql, деревья собираю кодом на php, и кеширую в редис. Кроме того указал и библиотеку, через которую работаю с дереовом: https://github.com/loophp/phptree

Последний раз редактировалось Павел26; 04.12.2022 в 12:43.
Павел26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнить программное моделирование алгоритма поиска кодовых комбинаций и алгоритма кодирования методом Хаффмана. Мария34 Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2017 00:15
Код алгоритма игры VBA Nkeyka Помощь студентам 0 28.05.2012 14:55
Выбор алгоритма для вычисления определителя матрицы 6х6 Беллая Помощь студентам 2 28.08.2010 23:59
Выбор алгоритма GBTA Общие вопросы C/C++ 0 10.07.2010 19:54
доработка алгоритма... Sota Помощь студентам 2 13.06.2008 15:45