我正在做一个游戏,使用键操作符创建简单的父树节点连接到孩子。(1 3 2 7 11 12),其中1为父节点,3 2 7 11 12为子节点。数组通过键拥有所有信息来创建嵌套数组。当然它非常快。但我实际上需要2或3个更深的深度。我可以创建一个不同的树结构显示在'相同的'数组-第二张图片。这种不同的编码(1 2 1 1 2 3 1 3 3......)允许任意嵌套向量深度和完美的工作。-只需要一个简单的数组。
对于阵列上的Key转换,可能有足够的信息来连接子节点,然后是更多的代码-用于所需的深度。(1.)将数组转换为树(2.)-然后回来?我是APL的新手,专注于矩形。树木争吵就在路上。我需要几乎相同的关键速度,由于非常长的数组和嵌套数组。
1 2 1 1 2 3 1 3 3 1 1 2 7 8 9 16 4
也许在未来使用键上的变量?
第一节第一节第一节第一节第一节第二节第一节
1条答案
按热度按时间nx7onnlm1#
有一些方法可以做到这一点,但最好的方法取决于你想对结果做什么。如果你真的有非常大的数组,那么产生数组的“嵌套子”表示将是昂贵的,无论你如何计算它们,因为底层的表示是昂贵的(尽管不比另一种语言中的同类表示更昂贵)。
(Hsu 2019)第3.2节对此进行了详细讨论:
“GPU上托管的数据并行编译器”. Hsu,Aaron W. https://scholarworks.iu.edu/dspace/handle/2022/24749
一般来说,如果您打算以某种方式使用数据,直接使用父矢量或深度矢量表示形式几乎总是更快、更容易,而不必先转换为记录类型样式表示形式。
一种技术是首先以父向量的形式查询数据,以确定要处理的相关节点,然后才使用membership()或where()等原语提取有限集合的子节点。
如果您可以描述您打算在这些嵌套表示上执行的操作的种类,那么可能有一个更好的算法,它不需要转换。
如果你只想创建完整的记录类型表示,(Hsu 2019)中有一些转换代码。你也可以看看Co-dfns编译器中的P2 D和D2 P函数:
https://github.com/Co-dfns/Co-dfns/blob/master/src/codfns/P2D.aplf
https://github.com/Co-dfns/Co-dfns/blob/master/src/codfns/D2P.aplf
这些可能会为您在格式之间进行转换提供一些额外的帮助。
如果需要在父级和记录类型表示之间直接转换,可以使用类似于下面的方法:
kids←{0=≢k←⍸p=⍵:⍵ ⋄ ⍵,∇¨k~⍵}¨
并将其应用于树的根节点,如下所示:
kids ⍸p=⍳≢p
其中
p
是父向量。希望这能有所帮助!