这不是家庭作业。
视觉上它看起来像一棵树,但所有叶子都是唯一的(在数据库中具有唯一的 ID)。它们之上的层次结构有些随意。每个复选框有 3 种状态:开、关和部分。叶子可以只检查或不检查。孩子的状态应该驱动父母的状态。单击复选框应该“切换”它,并向上或向下传播必要的更改。如果您单击部分选中的父级,它应该变为完全选中。每个孩子都有一个指向父母列表的指针(如果必须,我可以将其更改为一组)。每个父母都有一个按字母顺序排列的孩子列表。同时,出于展示的目的,这个结构是一棵树,我可以展开和折叠,如下图所示。
我确信这个算法之前已经被发明了。由于叶子的数量已经达到20,000,我确实关心实践中的表现。但是,我不会试图以代码简短易读为代价来榨取算法中的每一滴性能。
我认为原则上我应该走下来(如果有任何地方可以去)并确定所有应该更换的叶子。在那之后,我应该走上去。从这组叶子中,我应该找出一组可能受到影响的父母。然后将其过滤到需要更改的父级集,以及需要更改的值。然后将它们添加到集合中。然后我需要从这些节点上走并重复。在我有一组叶子和其他需要更改的节点以及它们的值之后,我将需要这样做......或类似的事情。基于矩阵的表示将过于昂贵。
我在C++
using中一起破解这个东西MFC
,但我的问题几乎与语言无关。但是,我更喜欢具体的实现而不是算法。一些语言,如 Python、Perl、Scala 可能有太现代的技巧。我会尝试坚持一些更传统的东西,比如 Java、C#(减去 LINQ)。
欢迎代码、链接、参考和问题。