Questions tagged «trees»

树是一种分层数据结构,其中每个节点都是通过从唯一根节点开始的唯一路径访问的。树通常用于搜索数据和优化对节点的有序访问。在图论中,树是没有循环的连接节点的图。注意:将“ trie”标签用于类似于字符串匹配(前缀/后缀)的数据结构树

4
如何精确创建抽象语法树?
我想我了解AST的目标,并且之前我已经构建了几个树结构,但从未构建过AST。由于节点是文本而不是数字,所以我很困惑,因此在解析某些代码时,我想不出一种输入令牌/字符串的好方法。 例如,当我查看AST的图表时,变量及其值是等号的叶节点。这对我来说很有意义,但是我将如何实施呢?我想我可以视情况而定,以便当我偶然遇到“ =”时,我将其用作节点,并将在“ =”之前解析的值添加为叶子。这似乎是错误的,因为根据语法的不同,我可能不得不为成千上万的东西辩护。 然后我遇到了另一个问题,那棵树是如何横穿的?我会一直下降到最低点吗,当我到达最低点时又返回一个节点,并对它的邻居也这样做吗? 我已经看到了大量关于AST的图表,但是我找不到一个简单的代码示例,这可能会有所帮助。

3
为抽象语法树实现访问者模式
我正在创建自己的编程语言,出于学习目的。我已经为我的语言的一部分编写了词法分析器和递归下降解析器(我目前支持数学表达式,例如+ - * /和括号)。解析器将我交给一个抽象语法树,在该语法树上我调用该Evaluate方法以获取表达式的结果。一切正常。这大约是我目前的情况(C#代码示例,尽管这在很大程度上与语言无关): public abstract class Node { public abstract Double Evaluate(); } public class OperationNode : Node { public Node Left { get; set; } private String Operator { get; set; } private Node Right { get; set; } public Double Evaluate() { if (Operator == "+") return …

3
如何在不使用递归的情况下遍历树?
我的内存节点树很大,需要遍历该树。将每个子节点的返回值传递到其父节点。必须这样做,直到所有节点的数据都泡到根节点为止。 遍历是这样的。 private Data Execute(Node pNode) { Data[] values = new Data[pNode.Children.Count]; for(int i=0; i < pNode.Children.Count; i++) { values[i] = Execute(pNode.Children[i]); // recursive } return pNode.Process(values); } public void Start(Node pRoot) { Data result = Execute(pRoot); } 这工作正常,但我担心调用堆栈会限制节点树的大小。 如何重写代码,以便不进行递归调用Execute?
19 c#  optimization  trees 



5
如何创建具有任意/通用类别节点的可变的,可变的jtree?
请注意:我不想在这里进行编码帮助,Programmers原因是我在这里。我想提高我的程序计划/编写技能,而不仅仅是(对)我对Java的理解。 我正在根据此处针对LARP游戏列出的技能,试图找出如何制作具有任意类别系统的树。我先前的尝试对技能是否也是一类产品感到很失望。尝试对此进行编码很乱。画出我的树时,我注意到只有我的“叶子”才是技能,我将其他人标记为类别。 我所追求的是一种制作树的方法,该树尝试将模型和视图分开,并允许将任意类型的子节点(具有独立的编辑/渲染方式)添加到任意父节点。 注意:这里的所有东西都是作为技能购买的,即使看起来像是房产。最终用户会将其视为购买技能(他们在纸上atm上做的事情),因此应将其呈现在同一页面上。 树的解释:树是“出生的”,具有一组硬编码的最高级别类别(武器,身体和心理,医疗等)。由此,用户需要能够增加一项技能。最终,他们希望增加例如“单手剑专精” 技能(而非物品)。为此,理想情况下,请单击“添加”并Weapons选中,然后One-handed从出现在该子节点上的组合框节点中进行选择,然后再次单击“添加” ,然后在出现的该子节点上的文本字段中输入名称。然后再次单击添加以为该叶子添加/指定“级别”或“层”;首先是熟练程度,然后是专业化(例如)。 当然,如果您想购买其他技能,那是完全不同的途径。您可能不需要像使用武器示例那样在树下同一级别的组合框,也不需要其后的其他逻辑。这就是我难以理解的地方,更不用说编程了。如何制作一组类,而不指定将它们连接在一起的顺序,但是仍然使它们都适合。 用代码描述这种树的好的系统是什么?我见过的所有其他JTree示例都具有一些可预测的模式,而我的则没有。我不想在“文字”中编写全部代码,而在父级上应允许列出子节点的类型(组合框,文本字段等)的长列表。我应该使用抽象类吗?接口? 当我添加上面未列出的其他行为不同的技能时,如何使这类对象集群可扩展? 如果没有一个好的系统可以使用,那么是否有一个好的过程可以弄清楚该怎么做呢? 我脑海中的齿轮正在转动: 我总是需要: 检查父母 提供基于父项的选项 由于这种共性,我开始思考,我需要某种抽象/接口skill类来定义/概述技能和类别的通用方法。我可以(希望)将规则和选项放入数据库中并从中读取。现在我想的问题是,在抽象或接口方法与如何实现该方法之间。

5
重复的四叉树
我正在实现一个四叉树。对于那些不知道此数据结构的人,我包括以下简短描述: 四叉树是一种数据结构,在欧几里得平面中就像3维空间中的八叉树一样。四叉树的常见用途是空间索引。 总结一下它们是如何工作的,四叉树是一个集合(假设这里是矩形),具有最大容量和一个初始边界框。当尝试将元素插入达到最大容量的四叉树中时,该四叉树被细分为4个四叉树(其几何表示将比插入前的树小四倍)。每个元素根据其位置重新分配在子树中。使用矩形时的左上边界。 因此,四叉树要么是叶子,其元素数量少于其容量,要么是一棵有4个四叉树作为孩子的树(通常是西北,东北,西南,东南)。 我担心的是,如果您尝试添加重复项,可能是同一元素多次或具有相同位置的多个不同元素,则四叉树在处理边缘时存在一个基本问题。 例如,如果您使用容量为1的四叉树并将单位矩形作为边框: [(0,0),(0,1),(1,1),(1,0)] 然后您尝试插入两次以其左上边界为原点的矩形:(或类似地,如果尝试在容量为N> 1的四叉树中将其插入N + 1次) quadtree->insert(0.0, 0.0, 0.1, 0.1) quadtree->insert(0.0, 0.0, 0.1, 0.1) 第一次插入不会有问题: 但是然后第一个插入将触发细分(因为容量为1): 因此,两个矩形都放在同一子树中。 然后,这两个元素将到达相同的四叉树并触发细分… 依此类推,依此类推,细分方法将无限期地运行,因为(0,0)始终位于所创建的四个子树中的同一子树中,这意味着将发生无限递归问题。 有可能有重复的四叉树吗?(如果没有,则可以将其实现为Set) 我们如何解决这个问题而又不完全破坏四叉树的体系结构?

4
生成树中所有节点的所有后代的最有效方法
我正在寻找获取树的最有效算法(存储为边列表;或存储为从父节点到子节点列表的映射列表);并为每个节点生成从其派生的所有节点的列表(叶级和非叶级)。 由于规模的原因,实现必须通过循环而不是撤回。理想情况下应为O(N)。 该SO问题涵盖了一个合理合理的标准解决方案,用于为树中的一个节点找到答案。但是很明显,在每个树节点上重复该算法都是非常低效的(在我的脑海中,O(NlogN)至O(N ^ 2))。 树的根是已知的。该树具有绝对任意的形状(例如,不是N元,没有以任何方式平衡,形状或形式,深度也不统一)-有些节点有1-2个子节点,有些节点有30K个子节点。 在实际水平上(尽管它不应该影响算法),该树具有约100K-200K节点。

1
菜单构建模式
当菜单不用于路由时,我难以理解菜单的活动状态处理。 我来自Drupal,菜单系统也处理路由。因此,设置活动状态和活动尾随状态由路由处理(也充当菜单渲染系统)。 现在,许多PHP框架都有处理路由的Router类。这似乎是一个很好的分隔,因为菜单不应该知道POST ||。选项|| ... 要求。 但是在编写前端时,我发现自己很难对菜单进行编码。或者将所有内容存储在数据库中,然后将这些值传递给视图。我不喜欢这种方法的原因是您正在创建已经在Router中写过的内容的副本,但是现在使用Menu类。 一个例子: Route::get('/somewhere','routename.somewhere','showStuffController'); Route::post('/somewhere','routename.somewhere','saveStuffController'); Menu::add('label.somewhere','routename.somewhere'); 您在这里分离关注点,所以很好。但是Menu在很大程度上取决于Route来设置其活动状态。菜单还必须了解有关设置活动跟踪的层次结构。 因此,是的,设置活动路径和活动状态类实际上是一种视图。但是有 if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; } 您的所有观点看来都是愚蠢的。然后添加所有那些烦人的活动提示if,这确实是个肿。我知道,在视图渲染之前处理该问题并将active-trail标志设置为true似乎很丑陋(foreach遍历所有子级,遍历所有子级,...) 我的问题是: 有没有一种模式或聪明的方法来使这种清洁剂变得更好,更好……?一个人应该如何应对主动式“问题”? 我当时想渲染子级->父级。因此,从最深层次的广告开始,然后逐步发展。但是,孩子对父母一无所知,但父母对孩子一无所知(似乎很奇怪)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.