如何处理可变性与性能之间的树结构权衡
How to deal with tradeoff in tree structure between mutability vs performance
当涉及到实现树结构库时,我似乎遇到了一个接一个的问题,但这是一个至关重要的问题。
假设我有两个核心构造函数:Tree
和Node
。
而 Tree 对象将具有管理树的方法,并获取对 Node 对象的引用。
我似乎无法解决的问题是 Node 对象(及其子对象)似乎必须是不可变的。我们不希望库的用户可以改变内部结构:
var childNodes = Tree.findNode(5).children;
var node = children[0];
node = "overwrite with something";
或
var parentNode = Tree.findNode(5).parent;
parentNode.children = { text: "Doesn't realize this will change the original node's children" };
它会影响当前树并搞砸内部工作。
或者,如果我假设使用不可变对象/数组,则意味着连续复制。
假设我想将树结构上的 10 个随机节点移动到单个节点(下)。这意味着复制并重新分配整个数组以改变它们。 (我们不知道数组会有多长!)。对于可变数据结构没有成本的东西来说,这似乎是巨大的矫枉过正。在我的脊椎里,它在代码方面也会更加繁琐。
我尝试了很多解决方法,但最终还是遇到了同样的困境。
我该如何解决这个问题?
编辑:差点忘了提到我使用数组作为子节点,因为顺序对我的用例很重要。
我决定使用不可变节点对象;这是为了防止 lib 用户意外搞砸内部工作。
我担心的是因为复制太多而影响性能。据我了解,有一种处理不可变对象的高效方法,这是 Immutablejs 开箱即用的方法。
在观看了一些演示并阅读了文档之后,我对它们广泛的 API 提供了所需的灵活性感到惊喜。
策略是让用户在返回 Immutable 对象或本机 Javascript 对象之间进行选择(在使用 React 时,Immutable 似乎是一个非常受欢迎的选择)。但在内部库将使用不可变对象。
@SebstienDaniel 感谢您的建议,它是正确的。
当涉及到实现树结构库时,我似乎遇到了一个接一个的问题,但这是一个至关重要的问题。
假设我有两个核心构造函数:Tree
和Node
。
而 Tree 对象将具有管理树的方法,并获取对 Node 对象的引用。
我似乎无法解决的问题是 Node 对象(及其子对象)似乎必须是不可变的。我们不希望库的用户可以改变内部结构:
var childNodes = Tree.findNode(5).children;
var node = children[0];
node = "overwrite with something";
或
var parentNode = Tree.findNode(5).parent;
parentNode.children = { text: "Doesn't realize this will change the original node's children" };
它会影响当前树并搞砸内部工作。
或者,如果我假设使用不可变对象/数组,则意味着连续复制。
假设我想将树结构上的 10 个随机节点移动到单个节点(下)。这意味着复制并重新分配整个数组以改变它们。 (我们不知道数组会有多长!)。对于可变数据结构没有成本的东西来说,这似乎是巨大的矫枉过正。在我的脊椎里,它在代码方面也会更加繁琐。
我尝试了很多解决方法,但最终还是遇到了同样的困境。
我该如何解决这个问题?
编辑:差点忘了提到我使用数组作为子节点,因为顺序对我的用例很重要。
我决定使用不可变节点对象;这是为了防止 lib 用户意外搞砸内部工作。
我担心的是因为复制太多而影响性能。据我了解,有一种处理不可变对象的高效方法,这是 Immutablejs 开箱即用的方法。
在观看了一些演示并阅读了文档之后,我对它们广泛的 API 提供了所需的灵活性感到惊喜。
策略是让用户在返回 Immutable 对象或本机 Javascript 对象之间进行选择(在使用 React 时,Immutable 似乎是一个非常受欢迎的选择)。但在内部库将使用不可变对象。
@SebstienDaniel 感谢您的建议,它是正确的。