如何从邻接表与类型谱系构建嵌套邻接表?
如何从邻接表与类型谱系构建嵌套邻接表?
嘿,先给你理清楚目前的基础情况哈:
首先我们有一个普通的图邻接表,结构是这样的:
{ 1: [2, 3, 4], 2: [5], 3: [6, 9], 4: [3], 5: [3], 6: [7, 8], 7: [], 8: [], 9: [] }
对应的图结构大概是:节点1连着2、3、4三个节点;节点2只连了5;节点3下面挂着6和9;节点4又连回了3;节点5也连回3;节点6的子节点是7和8;7、8、9都是没子节点的叶子节点。
不过现在每个节点还带着一个「类型谱系(type ancestry)」——看起来你没把这部分的具体内容写完?不过没关系,我给你唠唠核心的解决思路,你套自己的具体类型数据就行:
要把普通邻接表结合类型谱系转成嵌套邻接表,核心就是先靠类型谱系给节点搭好类型层级框架,再把原邻接表的节点连接关系,精准映射到这个类型框架里,同时保留每个节点自身的子节点链路。
我给你举个模拟的例子,假设类型谱系是:节点1属于「根类型A」,节点2、3、4属于「子类型B」,节点5、6属于「子类型C」,7、8、9属于「子类型D」。那最终生成的嵌套邻接表,会先把类型的层级搭起来,再把每个类型下的节点按原邻接表的关系嵌套进去,大概长这样:
{ "类型A": { "节点1": [ { "类型B": { "节点2": [ { "类型C": { "节点5": [ { "类型B": { "节点3": [ { "类型C": { "节点6": [ { "类型D": {"节点7": [], "节点8": []} } ] }, "类型D": {"节点9": []} } ] } } ] } } ], "节点3": [ { "类型C": { "节点6": [ {"类型D": {"节点7": [], "节点8": []}} ] }, "类型D": {"节点9": []} } ], "节点4": [ { "类型B": { "节点3": [ { "类型C": { "节点6": [ {"类型D": {"节点7": [], "节点8": []}} ] }, "类型D": {"节点9": []} } ] } } ] } } ] } }
具体操作可以拆成这几步来做:
- 第一步:先把所有节点的类型谱系整理成一个类型路径映射表,比如每个节点对应它从根类型到自身类型的完整路径(比如节点5的路径是「类型A→类型B→类型C」)
- 第二步:遍历原邻接表的每个节点,先根据它的类型路径,把节点放到对应的类型嵌套结构里
- 第三步:把原邻接表中这个节点的所有子节点,也按照各自的类型路径,嵌套到当前节点的结构下面,确保类型层级和原有的节点连接关系都不丢
- 第四步:最后合并一下相同类型的节点组,避免出现重复的类型结构,让整个嵌套表更简洁
如果之后你把具体的类型谱系内容补全,我可以给你更贴合实际的代码实现和细节调整建议哦!
备注:内容来源于stack exchange,提问作者Sachin Hosmani
相关产品推荐
相关产品推荐

