如何使用kdb中每个节点中的值表示以下树结构?
a : 4 b : 3 c : 1 d : 2 e : 7 f : 5 g : 2
我需要设置一个函数来对节点的值求和 . 任何提示赞赏 .
您可以尝试不同的方法 .
例如:TreeTable:包含父列和子列的表 .
treetable是一张具有额外属性的 table .
首先,表的记录是分层相关的 . 因此,记录可以具有一个或多个子记录,这些子记录又可以具有子代 . 如果记录有父级,则只有一个 . 没有父级的记录称为根记录 . 没有任何子节点的记录称为叶子记录 . 带子项的记录称为节点记录 .
以下文章解释了TreeTable . http://archive.vector.org.uk/art10500340
IMO取决于你打算如何“查询”树,以及你想要的是什么 - 你能进一步详细说明吗?你想要子树吗?例如 . 如果你查询“a”它会给你“4”或整个子树(在这种情况下它是整个树) .
如果内存不是问题,或者你的树很小,你可以拥有一个嵌套的字典词典,一个在字典内部递归的函数,或者你可以将字母符号作为单个字典的键:
q)d:(enlist enlist `a)!enlist 4 q)d,:(enlist `a`b)!enlist 3 q)d,:(enlist `a`b`c)!enlist 1 q)d ,`a | 4 `a`b | 3 `a`b`c| 1 q)d`a 4 q)d`a`b 3 q)d`a`b`c 1
嵌套字典方法是:
q)dict.a.b.c:1 q)dict.a.b.d:2 q)dict.a.b[`]:3 q)dict.a[`]:4 q)dict.a.e.f.g:2 q)dict.a.e.f[`]:5 q)dict.a.e[`]:7
/请注意,从最深节点开始定义每个节点并向后工作到顶级节点非常重要 .
/查看层次结构使用dict.a或dict.a.e等,或更多动态使用
q)@/[dict;`a] | 4 b| ``c`d!3 1 2 e| ``f!(7;``g!5 2)
/获取各个节点的值
q)first @/[dict;`a`e`f] 5 q)first @/[dict;`a`e`f`g] 2
/查找节点下的所有值
q){raze $[99h=type x;.z.s each x;x]}dict.a 4 3 1 2 7 5 2 q){raze $[99h=type x;.z.s each x;x]}@/[dict;`a`e] 7 5 2
/对节点下的所有值求和
q)sum {raze $[99h=type x;.z.s each x;x]}dict.a 24 q)sum {raze $[99h=type x;.z.s each x;x]}@/[dict;`a`e] 14
显然,如果有必要,这些都可以包含在很好的功能中 .
3 回答
您可以尝试不同的方法 .
例如:TreeTable:包含父列和子列的表 .
treetable是一张具有额外属性的 table .
首先,表的记录是分层相关的 . 因此,记录可以具有一个或多个子记录,这些子记录又可以具有子代 . 如果记录有父级,则只有一个 . 没有父级的记录称为根记录 . 没有任何子节点的记录称为叶子记录 . 带子项的记录称为节点记录 .
以下文章解释了TreeTable . http://archive.vector.org.uk/art10500340
IMO取决于你打算如何“查询”树,以及你想要的是什么 - 你能进一步详细说明吗?你想要子树吗?例如 . 如果你查询“a”它会给你“4”或整个子树(在这种情况下它是整个树) .
如果内存不是问题,或者你的树很小,你可以拥有一个嵌套的字典词典,一个在字典内部递归的函数,或者你可以将字母符号作为单个字典的键:
嵌套字典方法是:
/请注意,从最深节点开始定义每个节点并向后工作到顶级节点非常重要 .
/查看层次结构使用dict.a或dict.a.e等,或更多动态使用
/获取各个节点的值
/查找节点下的所有值
/对节点下的所有值求和
显然,如果有必要,这些都可以包含在很好的功能中 .