Это не домашняя работа.
Визуально это выглядит как дерево, но все листья уникальны (имеют уникальные идентификаторы в базе данных). Иерархия над ними несколько произвольна. Каждый флажок имеет 3 состояния: включено, выключено и частично. Листья могут быть только проверены или не проверены. Состояние детей должно влиять на состояние родителей. Нажатие на флажок должно «переключить» его и распространять необходимые изменения вверх или вниз. Если вы щелкнете по родительскому элементу, который частично отмечен, он должен стать полностью отмеченным У каждого ребенка есть указатель на список (я мог бы изменить его на набор, если я должен) родителей. У каждого родителя есть список детей, отсортированных по алфавиту. В то же время, для целей отображения, эта структура представляет собой дерево, которое я могу развернуть и свернуть, как вы можете видеть на рисунке ниже.
Я уверен, что этот алгоритм был изобретен ранее. Так как количество листьев было до 20 000, я забочусь о производительности на практике. Но я бы не пытался выжать каждую последнюю потерю производительности из алгоритма за счет того, что код короткий и читаемый.
Я подумал, что в принципе я должен спуститься (если есть куда идти) и определить все листья, которые должны быть изменены. После этого я должен подняться. Из набора листьев я должен выяснить набор родителей, которые могут быть затронуты. Затем отфильтруйте его до набора родителей, который нужно будет изменить, и на какое значение. Затем добавьте их в набор. Тогда мне нужно будет подняться с этих узлов и повторить. После того, как у меня есть набор листьев и других узлов, которые необходимо изменить, а также их значения, мне нужно будет просто сделать это ... или что-то в этом роде. Матричное представление было бы слишком дорого.
Я взломал эту штуку вместе в C++
, используя MFC
, но мой вопрос в значительной степени не зависит от языка. Однако я бы предпочел конкретную реализацию алгоритму. У некоторых языков, таких как Python, Perl, Scala, могут быть слишком современные хитрости. Я бы попробовал придерживаться чего-то более традиционного, например Java, C # (минус LINQ).
Код, ссылки, ссылки и вопросы приветствуются.