Javascript JS中允许最快节点查找的树状数据结构?
我将如何在JS中创建一个树状数据结构,在这里,我可以访问诸如父节点引用、基于id的节点查找、访问子节点的长度(数量)、基于索引的查找等内容 这基本上就是我所设想的API:Javascript JS中允许最快节点查找的树状数据结构?,javascript,arrays,json,oop,data-structures,Javascript,Arrays,Json,Oop,Data Structures,我将如何在JS中创建一个树状数据结构,在这里,我可以访问诸如父节点引用、基于id的节点查找、访问子节点的长度(数量)、基于索引的查找等内容 这基本上就是我所设想的API: var rootNode = DataStructure.getRoot(); var child1 = rootNode.addNode('child1'); //added a node with id 'child1' child1.addNode('innerChild1'); child1.addNode('inne
var rootNode = DataStructure.getRoot();
var child1 = rootNode.addNode('child1'); //added a node with id 'child1'
child1.addNode('innerChild1');
child1.addNode('innerChild2');
rootNode.getChildById('child1') //should be same node as var child1
rootNode.getAtIndex(0) //should be same node as var child1
child1.parent() //should be rootNode
child1.getAtIndex(0) // should be node with id 'innerChild1'
child1.getAtIndex(1) // should be node with id 'innerChild2'
child1.length() //should be 2
等等
我理解这是一个广泛的问题,但我想知道是否有人可以推荐一种方法来解决这个问题和/或任何可能已经在这样做的图书馆?我应该动态创建一个XML并使用它的本机方法吗?这是最快的吗?我在应用程序中有这样的结构。指定的API将使创建所需的结构变得困难。我注意到:
DataStructure
是一个单例,addChild
不允许添加带有子节点的节点,索引是数字。下面呢
美国石油学会
TreeNode(可更新)
成员:
- 子对象(对象,根据ID编制索引)
- 根(TreeNode)
- 父(树节点)
- 索引(字符串)
- 属性(对象)
- _referenceCount(int)-如果您的树由于某种原因有循环,那么它很有用
- addChild(TreeNode:TreeNode)
- 向父节点注册节点
- 将节点按ID添加到子节点
- 增加已添加树节点的引用计数
- forEach(回调(TreeNode:TreeNode))
- removeChild(字符串:id)
- 从此对象中删除节点
- 所示子级的减量\u参考计数
- 如果_referenceCount为0,则将其从根目录中删除
- _节点映射(对象)
- getNodeByID(字符串:id)
- 在节点映射中查找id,O(1)查找时间
- removeNode(字符串:id)
- addToNodeMap(TreeNode:TreeNode)
- createFromFormatX(对象:某种特定格式的内容树)该树运行良好,您应该为您的特定案例创建一个工厂,以帮助您将blob转换为奇特的数据结构
- createFromFormatY,基本上是另一种加载机制
这里没有什么是不变的。然而,您可以通过使用一个新的工厂方法,使上述方法中的更多方法私有化,从而始终强制树的不变性。这可能是可取的,也可能不是可取的。您描述的数据结构可以很容易地实现,如下所示:
var-Tree=defclass({
构造函数:函数(父函数){
this.parent=parent | | null;//根节点为null
this.children={};//用于基于id的查找
this.ids=[];//用于基于索引的查找
this.length=0;//便于访问
},
addNode:函数(id){
var children=this.children;
如果(children.hasOwnProperty(id))抛出新错误(id+“存在”);
返回子项[this.ids[this.length++]=id]=新树(this);
},
getChildById:函数(id){
var children=this.children;
if(children.hasOwnProperty(id))返回children[id];
抛出新错误(id+“不存在”);
},
getAtIndex:函数(索引){
返回这个.getChildById(this.ids[index]);
}
});
函数类(原型){
var constructor=prototype.constructor;
constructor.prototype=原型;
返回构造函数;
}
setTimeout(函数(){
var rootNode=新树;
var child1=rootNode.addNode(“child1”);
var innerChild1=child1.addNode(“innerChild1”);
var innerChild2=child1.addNode(“innerChild2”);
assert(rootNode.getChildById(“child1”)==child1);
断言(rootNode.getAtIndex(0)==child1);
断言(child1.parent==rootNode);
断言(child1.getAtIndex(0)==innerChild1);
断言(child1.getAtIndex(1)==innerChild2);
console.assert(child1.length==2);
警惕(“成功”);
}, 0);
我想你想要jQuery?为什么要jQuery?我想要一个数据结构,它不是DOM特定的。看起来您需要的是一个二叉搜索树,它应该getAtIndex
对应于节点的排序顺序或添加顺序?您希望通过id进行全局查找还是只在单个父节点内进行查找?如果您否决投票,请发表评论。这是可行的,并且有O(1)次查找时间。为什么不直接编写代码呢?这可能会为你们赢得更多的支持票。@Sildoreth是的,我可能会获得更多的支持票?虽然一般来说,当问题是“为我实现这件事”时,我和其他人会回避实际实现整个事情,而是选择提出一个概念。我也没有时间真正创建一个解决方案,并按其速度运行它。我不妨为此创建一个开源库,而不仅仅是回答stackoverflow问题。您应该将该类命名为a节点
。树
将是一个完整的“文档”,例如,具有全树id查找功能;一个引用根节点的结构。@Bergi实际上,我认为它更多的是代数数据类型data Tree=Tree{parent::Maybe Tree,children::Map String Tree,ids::Array Int String,length::Int}
。由于数据构造函数返回一个树
(通常也是一个节点),因此我将其命名为树
.Mhm。我更习惯于ADTdata Tree=Emtpy | Node{…}
,但我想你的也有道理。