我有一个由我的应用程序用户分类的项目列表(下面的蓝色节点)。类别本身可以被分组和分类。
生成的结构可以表示为有向无环图 (DAG),其中项目是图拓扑底部的汇,顶部类别是源。请注意,虽然某些类别可能定义明确,但很多类别将由用户定义并且可能非常混乱。
例子:
(来源:theuprightape.net)
在该结构上,我想执行以下操作:
- 查找特定节点下的所有项目(汇)(欧洲的所有项目)
- 查找通过所有一组 n 个节点的所有路径(如果有)(所有通过 SMTP 从 example.com 发送的项目)
- 找到位于所有节点集下方的所有节点(交叉点:goyish brown foods)
第一个似乎很简单:从节点开始,沿着所有可能的路径到底部并在那里收集项目。但是,有没有更快的方法?记住我已经通过的节点可能有助于避免不必要的重复,但是还有更多的优化吗?
我该如何处理第二个?第一步似乎是确定集合中每个节点的高度,以确定从哪个(s)开始,然后找到低于该集合其余部分的所有路径。但这是最好的(甚至是好的)方法吗?
维基百科上列出的图遍历算法似乎都与寻找特定节点或两个节点之间最短或最有效的路线有关。我认为两者都不是我想要的,还是我只是看不到这如何适用于我的问题?我还应该在哪里阅读?