Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中允许最快节点查找的树状数据结构?_Javascript_Arrays_Json_Oop_Data Structures - Fatal编程技术网

Javascript JS中允许最快节点查找的树状数据结构?

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

我将如何在JS中创建一个树状数据结构,在这里,我可以访问诸如父节点引用、基于id的节点查找、访问子节点的长度(数量)、基于索引的查找等内容

这基本上就是我所设想的API:

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。我更习惯于ADT
data Tree=Emtpy | Node{…}
,但我想你的也有道理。