获取全二叉树中某一级的所有节点,数组格式
我需要将所有节点从左或右子树中的完整二进制树中的一定级别获取.我目前从数据库中检索二进制树作为数组,例如: [1,2,3,4,5,6,7]代表这样的树: 1 / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 7 因此,我需要做的是基本上抓住树的水平并将其作为数组返回.类似level(3,"left") -> [4,5]或level(2, "right") -
0 2023-05-29
编程技术问答社区
B树与二叉树
如果我用B树实施内存(RAM)搜索操作,那么与二进制树相比,在缓存或其他效果方面会更好? 我知道的是 - binary search tress---O(log n) btrees ---------------O(c log n) 在各种博客上都有很多讨论. 解决方案 算法复杂性是相同的,因为O(log b n)= o(c log n)= o(log n),但是常数因子(隐藏在big-)中o符号,根据实施和硬件的不同. b-树是为拼盘硬盘设计的,这些磁盘的访问时间很长(将头部移动到位),然后读取整个物理部门.使B-TREE节点与扇区一样大,可以最大程度地减少访问时间的数量,并最大化每个读取操作的有用数据. 但是,如果您正在记忆中工作,则可以忽略不计的时间,因此,更好的比较是计算算法访问的单个单词数量. 例如,让我们计划一个数据结构以存储2 20 每个1个字的键,对于32位机器上的总计4MIB原始数据. 二进制搜索树将具有2个 20 节点,
0 2023-05-23
编程技术问答社区
在std::map中改变一个元素的键的最快方法是什么?
我理解为什么不能这样做的原因(重新平衡和其他事情): iterator i = m.find(33); if (i != m.end()) i->first = 22; ,但到目前为止,更改密钥的唯一方法是从AllTogether的树中删除节点,然后用其他键将值插入: : iterator i = m.find(33); if (i != m.end()) { value = i->second; m.erase(i); m[22] = value; } 这对我来说似乎很低,原因是: 遍历树三次(+平衡),而不是两次(+ balance) 另外一份不必要的值 不必要的交易,然后重新分配树内的节点 我发现分配和交易是那三个最糟糕的.我是否缺少某些东西,还是有更有效的方法来做到这一点? 我认为,从理论上讲,这应该是可能的,因此我认为对不同的数据结构的更改是合理的.这是我想到的伪算法: 在我想更改的钥匙的树中找到节点
0 2023-05-23
编程技术问答社区
为淘汰赛创建二进制树
我正在尝试创建一棵二进制树,以便在淘汰赛中使用.这棵树由带有左右指针的Tnodes组成. 这是我提出的代码(下图);但是,它在CreateTree部分中的指针遇到了困难. 一旦创建了一个足够大的空树,我需要在备忘录上添加名称.清单到树的底部,以便我将它们配对以进行匹配. 我该怎么做? Type TNodePtr = ^TNode; TNode = Record Data:String; Left:TNodePtr; Right:TNodePtr; end; Type TTree = Class Private Root:TNodePtr; Public Function GetRoot:TNodePtr; Constructor Create; end; var MyTree:TTree; functio
14 2023-05-20
编程技术问答社区
临时指针指向一个使用的向量地址
我有一个关于将字符串s解析到二进制树中的问题. struct TreeNode { string val; // The data in this node. TreeNode *left; // Pointer to the left subtree. TreeNode *right; // Pointer to the right subtree. }; string s="((OR (AND pass (NOT reject)) (AND (NOT pass) reject)))"; 我做一些中风并消除了"("和")",并将所有单独的部分保留在矢量后, Split(底部)或通过不拒绝,而不是通过拒绝(Back) vector aftersplit; vector parsetree; while (!aftersplit.empty())//do the parsing { TreeNode
0 2023-05-20
编程技术问答社区
在Python中评估数学表达式
我想将给定的数学表达式归为这样的分析树: ((3 + 4 - 1) * 5 + 6 * -7) / 2 '/' / \ + 2 / \ * * / \ / \ - 5 6 -7 / \ + 1 / \ 3 4 有什么纯粹的python做到这一点吗?就像将字符串传递给Python,然后像上面提到的树一样回去. 谢谢. 是的.您必须查找Python版本的确切接口,因为ast模块似乎会定期更改. 特
0 2023-05-20
编程技术问答社区
从代数表达式中创建一个二叉树
我必须在Java中创建一个算术评估器.为此,我必须在二进制树上解析一个代数表达式,然后计算并返回结果.因此,在第一步中,我如何在二进制树上解析表达式?我知道这个理论,但我的概率是如何在Java进行.我读了以下帖子 创建递归二进制树 ,但我缺少基本技巧或方法.我知道如何创建一个节点(我有一个具有诸如returnnodeValue,isleaf,isDoublenode,issingLenode等方法的类),但是我想我需要一种方法来将节点插入二进制树中以实现我想要的东西.有什么想法吗? 解决方案 前缀表达式的树构建 def insert Insert each token in the expression from left to right: (0) If the tree is empty, the first token in the expression (must be an operator) becomes the
0 2023-05-20
编程技术问答社区
创建二进制表达树时,将父指针添加到每个节点
因此,我有一个完美工作的二进制表达树,但是当我尝试将其修改以将父指针添加到每个节点时(我以后需要创建一个从节点到根的路径),它就不了工作. class Node: def __init__(self, value, left=None, right=None, parent=None): self.value = value self.left = left self.right = right self.parent = parent class Tree: def __init__(self, lst): self.it = iter(lst) # Create an iterator over the list self.lst = lst self.root = None def create_tree(self): # Help
6 2023-05-19
编程技术问答社区
用多处理器加速二叉树的遍历 Haskell (并行)
按照"现实世界Haskell" and " haskell中的平行和同意编程"的第2章我设法构建了以下功能,用于使用多个处理器快速构建和穿越二进制树. import Control.Parallel (par, pseq) import Control.DeepSeq data Tree x = Empty | Node x (Tree x) (Tree x) deriving (Show, Read, Eq) -- Create instance of NFData for Tree data type (defining "normal form") instance NFData a => NFData (Tree a) where rnf Empty = () rnf (Node x l r) = rnf x `seq` rnf l `seq` rnf r -- Recursive function to build a tree using mul
对于这些特殊的多线程数据结构要求,是否有一个现有的解决方案?
我需要一个支持这些主张的多线程数据结构: 允许多个并发的读者和作家 被排序 关于 很容易推理 履行多个读者和一位作家要容易得多,但我真的不允许多个作家. 我一直在研究这一领域,我知道ConturrentsKiplist(根据Fraser和Harris的工作)在Java SE 6中实现了. SKIP列表基于是正确的正确可扩展的并发跳过 清单由Herlihy,Lev,Luchangco和Shavit. 这两个实现是由比我更聪明的人开发的,但是我仍然(有点羞愧,因为这是惊人的工作)必须问一个问题,这是否是同时发生的多读者的两个可行实现/今天可用的作者数据结构? 解决方案 在我看来,您对自己的问题太困难了.考虑以下内容: 它很容易实现许多数据结构,尤其是树木的不变版本.不变的数据结构的好处是,由于不变,一个线程无法修改另一线鼻子下的集合.不变性=无种族条件=无锁=无僵局.很棒. 参见 线程看不到其他线程中不可变的数据结构的更改.但是,他们可以使
从二进制搜索树中删除节点, haskell
我正在制作Haskell功能,以从二进制搜索树中删除节点. 我知道根据孩子的数字,需要采取的措施的规则 目标父母具有. 没有孩子 - 删除, 1个孩子 - 用孩子代替, 2个孩子 - 在右侧的子树中找到最小的节点,然后用值代替节点, - 然后,从右子树递归删除最小值 data BST = MakeNode BST String BST | Empty deleteNode :: String -> BST treeBuilder :: [String] -> BST treeBuilder = foldr add Empty add :: String -> BST -> BST add new Empty = (MakeNode Empty new Empty) add string tree@(MakeNode left value right) | string > value = MakeNode left value
8 2023-05-16
编程技术问答社区
树形迭代器,你能进一步优化这个吗?
作为我最初有关此代码一小部分的问题,我决定问一项后续行动,以查看您是否可以做得更好,然后我们到目前为止提出了什么. 下面的代码在二进制树上迭代(左/右=子/下一个).我确实相信这里有一个较少有条件的空间(down布尔值).最快的答案获胜! cnt语句可以是多个语句,因此让我们确保仅一次出现一次 child()和next()成员函数的速度大约30倍,就像haschild()和hasnext()操作. 随着递归解决方案的提高速度,请保持迭代 这是C ++代码 访问节点的顺序必须像下面的示例一样留下来. (首先打父母,然后孩子然后"下一个"节点). basenodeptr是一个boost :: shared_ptr,因为分配速度很慢,请避免任何临时的basenodeptr变量. 目前,此代码需要5897ms访问测试树中的62200000节点,调用此功能200,000次. void processTree (BaseNodePtr current, unsigne
0 2023-05-12
编程技术问答社区
红黑树是我理想的数据结构吗?
我有一个将要处理的项目(大理由).在每种情况下,处理都将包括删除集合中的最小项目,进行一些工作,然后添加0-2个新项目(始终将比删除的项目大).该集合将用一项初始化,并将继续工作直到空为空为止.我不确定该系列可能达到什么尺寸,但我期望在1m-100m的项目中.我不需要找到除最小的任何项目. 我目前打算使用一棵红黑树,可能会调整以保留最小物品的指针.但是我以前从未使用过一个,我不确定我的使用模式是否适合其特征. 1)是否存在危险左 +随机插入的删除模式会影响性能,例如,旋转数量明显高于随机删除的速度?还是使用这种使用方式删除和插入操作仍然是O(log n)? 2)其他一些数据结构会给我更好的性能,要么是因为删除模式或利用我只需要找到最小的项目的事实? 更新:很高兴我问,二进制堆显然是对这种情况的更好解决方案,正如承诺的那样,事实证明非常容易实现. 雨果 解决方案 a 二进制堆对您想要的东西要好得多.由于您只关心找到最小的元素和插入,因此更容易实现和更快
2 2023-05-12
编程技术问答社区
带有查找功能的优先队列-最快的实现
我正在考虑实现具有添加要求的优先级队列,即查找/搜索功能,该功能将确定项目是否在队列中的任何位置.因此,功能将是:插入,del-min并查找. 我不确定我应该使用堆还是自动平衡的二进制搜索树.看来PQ通常是用堆实现的,但是我想知道使用二进制搜索树是否有任何优势,因为我还需要查找功能. 此外,平均而言,我将进行更多的插入件,而不是删除.我还在考虑一个 d-ary heap .基本上,每一秒都计算. 谢谢! 解决方案 为什么您不能只使用优先队列和集合?当您出入一些东西时,将其添加到集合中.当您取消它时,将其从集合中删除.这样一来,设置就会告诉您是否在队列中. 其他解决方案 如果您的发现操作相对不频繁(并且您的堆很小),我只是进行线性搜索.如果它相对频繁,或者堆是巨大的,请考虑使用单独的数据结构或对象标志跟踪堆成员资格(进行"查找"测试).外部索引的乐趣在于能够将您的对象放在任意多的容器中. 如果"找到'您确实是指"查找和修改"(我发现我经常需要独立于典
4 2023-05-12
编程技术问答社区
在C#中对树进行微观优化迭代
我正在从事大规模数字处理项目.自开始以来,我一直在优化所有内容,因为我知道这将很重要.进行性能分析,我的代码在一个功能中花费了几乎40%的寿命 - 二进制树迭代器. public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex]
0 2023-05-12
编程技术问答社区
OpenCL-拷贝树到设备内存
我在C代码中实现了一个二进制搜索树.我的每个树节点看起来像这样: typedef struct treeNode { int key; struct treeNode *right; struct treeNode *left; } treeNode_t; 主机制造的树的结构.设备制作的树的查询. 现在,让我们假设我已经在主机存储器中完成了树. 我想将树的根部复制到设备的记忆中. 复制树的根部是不够的.因为右\左子女不在设备内存中.这是个问题. 那么,我的问题是将整个树复制到设备内存的最简单方法是什么? 解决方案 如果您的设备支持OpenCL 2.0,则可以使用Shared Virtual Memory.主机上创建的指针也将在设备上有效.这是描述和二进制搜索树示例: opencl-2-shared-virtual-memory . 其他解决方案 最简单的方法(也是最好的)方法是更改​​您的结构以使用节点索引而不是指针.指
0 2023-05-09
编程技术问答社区
Ocaml中查找树的深度的尾部递归函数
我的类型tree定义如下 type 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree ;; 我有一个函数可以找到树的深度,如下所示 let rec depth = function | Leaf x -> 0 | Node(_,left,right) -> 1 + (max (depth left) (depth right)) ;; 此功能不是尾部递归.我有没有办法以尾随的方式编写此功能? 解决方案 您可以通过将功能转换为CP(持续传递样式)来琐碎地做到这一点.您的想法是,您可以调用depth left (fun dleft -> ...),而不是调用depth left>,然后根据此结果计算事物,其中第二个参数是"一旦结果(dleft)可用,则要计算什么". let depth tree = let rec depth tree k = match tree with
2 2023-05-07
编程技术问答社区
V8 JavaScript对象与二进制树
与使用JavaScript中的数据(特别是在V8上,但没有C/C ++模块). 可能已经过时了为每个属性生成.这让我想知道二进制树实施是否可能更快,但是这似乎没有是这种情况. 二进制树实现不太平衡,因此平衡可能会变得更好(只有前26个值大致平衡.) ) 有人知道为什么或如何改善它吗?另一个注意:动态类概念是否意味着实际上存在〜260,000个属性(在第二个链接的JSPERF基准测试中)以及随后在内存中保存的动态类定义的链? 解决方案 v8使用"地图"的概念,该概念描述了对象中数据的布局. 这些地图可以是"快速地图",它可以从可以找到特定属性的对象的开头指定固定的偏移,也可以是"字典映射",它使用标签可提供查找机制. 每个对象都有一个描述图的指针. 通常,对象从快速地图开始.当将属性添加到具有快速映射的对象中时,将映射过渡到新的,该对象描述了对象中新属性的位置.在必要时,将对象重新分配给新数据项,并将对象的映射指针设置为新地图. 旧地图保
2 2023-05-03
编程技术问答社区
为什么我的二进制树不显示当前的内容?
我试图display()我的二进制树已经有了内部的东西,但由于某种原因它不起作用. 我一无所获作为输出. 也许我对方法的逻辑关闭了?我不太确定. 这是我的Node.java文件: (缺少内容) 这是我的BinaryTree.java文件: public class BinaryTree { public static Node root; public BinaryTree() { this.root = null; } public void insert(Node n, Student s) { if(n != null) { while(true) { if(s.getLastName().compareTo(root.data)
2 2023-04-27
编程技术问答社区