【发布时间】:2017-09-19 01:52:52
【问题描述】:
情况如下:有一个平衡的二叉搜索树,它可能被数十个线程访问。所以当我需要插入或删除一个节点时,我不想因为并发而锁定整个树。随着时间的推移,它再次变得不平衡。当树不那么忙于使用时,我终于有机会锁定并重新平衡它。我该怎么做?
或者我可以使用更好的数据结构吗?
【问题讨论】:
-
您是怎么遇到这种情况的?只有当我们知道用例时,才能决定更好的数据结构。树是只被读取还是更新太频繁?
-
删除节点时,只需将其标记为已删除,但保留在树中。当您有时间锁定和重新平衡时,按顺序遍历旧树,并从所有未标记为已删除的节点构建一棵新树。
-
@displayName 一天中的大部分时间,树都在高并发读取,同时它也在频繁更新。但是每隔几个小时,读取并发就会冷却下来,锁定就可以了。
-
我有一个解决方案,但它可能不是一个很好的解决方案 - 使用树的两个副本。允许从两者读取。但是在更新时,锁定一棵树并更新它,同时让读取转到另一棵树。然后更新第二个,让读取转到第一个。
-
@displayName 每个创意:)
标签: data-structures tree binary-search-tree avl-tree