【问题标题】:Look up elements in a generic tree在通用树中查找元素
【发布时间】:2012-09-27 17:07:27
【问题描述】:

我有一个 json 嵌套对象,类似于this

就我而言,我有一个独特的 int 类型的 id 字段(比如上面的 name)。这不是二叉树,而是更刻画父子关系。我想要一种方法来轻松查找植根于id = 121 的子树(子树)。以蛮力的方式,我可以比较所有节点,直到找到一个,然后返回子节点。但我想保留一张 {id, node} 的地图。例如{"121" : root[1][10]..[1]}。这可能是对内存的超级浪费(除非使用指向数组的指针)。注意肯定有更好的方法。

我可以控制从服务器发送的内容,因此可以增加上述数据结构。但需要一种快速的方法来根据客户端的节点 ID 获取子树。

编辑: 我正在考虑保留另一个数据结构,{id, []ids} 的映射,其中 ids 是从根开始的有序路径。有更好的办法吗?

【问题讨论】:

    标签: javascript algorithm tree binary-tree


    【解决方案1】:

    javascript 中的对象是真正的基于指针的对象,这意味着您可以保留对它们的多个引用而无需使用更多内存。为什么不进行一次遍历将子对象分配给新的基于 id 的父对象?除非您的分层对象非常庞大,否则这应该非常快。

    根据最佳实践以及如果您要构建的应用程序扩展到数百万用户会发生什么,您可能会重新考虑是否真的希望服务器完成更多工作。客户的电脑就坐在那里,随时为您免费提供远程计算能力。为什么将工作负载转移到服务器,导致它每秒处理更少的客户端请求?这可能不是你想去的方向。

    Here is a fiddle demonstrating this index-building technique。您运行一次,然后随心所欲地一遍又一遍地使用索引。建立所述索引只需要 4 或 5 毫秒。没有性能问题!

    还有一点需要注意:如果您关心带宽,一种简单的帮助方法是减少您的 JSON。不要在对象键名周围加上引号,使用一个字母的键名,不要使用空格和换行符。这会给你带来很大的进步。对您的示例 JSON 执行此更改后,它从 11,792 个字符变为 5,770 个字符,仅为原始大小的 49%!

    有一点需要注意的是,javascript 中的对象键始终是字符串。我添加到您的示例 JSON 中的数字 id 在用作键名时被强制转换为字符串。这应该不会妨碍使用,但您可能需要注意它的细微差别。

    【讨论】:

    • 我同意你的论点。我有机会在填充树的同时在服务器上构建索引,但考虑到额外的带宽,您的方法可能会更好。关键的误解是我不确定 index[obj.id] = obj; 这样的赋值。不会创建新的 obj 而不是引用 obj。
    • 我更新了我的小提琴以显示索引的预览并显示经过的时间。
    【解决方案2】:

    我不认为 id 以某种方式排序,但如果您向每个节点添加有关 最小和最大 id 值的信息,它仍然可能有助于修剪树的至少一部分它的孩子(和子......孩子)。

    这可以很容易地在服务器端实现,在搜索树时,您可以检查您要查找的 id 是否在节点的 id 范围内,然后再进入并搜索所有子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多