![]() |
1
4
看看不可变的二叉树。您必须更改更多的节点(每个节点都更改为根节点),但这不会更改插入的复杂性
例如,eric lippert在c中写了一些关于不可变avl树的文章。最后一个是: Immutability in C# Part Nine: Academic? Plus my AVL tree implementation |
![]() |
2
1
据我所见,无锁算法缺少引用计数,这使得它们的一般使用成了问题;您不知道必须指向某个元素的指针是否有效——可能该元素已消失。 瓦洛瓦用一些奇怪的内存分配安排来解决这个问题 在实践中没有用处 . 我能看到的实现无锁平衡树的唯一方法是使用修改后的mcas,在mcas中还可以执行递增/递减操作,这样就可以保持引用计数。我还没有看到mcas是否可以这样修改。 |
![]() |
3
0
考虑到锁本身通常占用一些重要的资源,整个数据结构通常只有一个锁。我猜你是在试图避免这种情况,这一定是一个非常特殊的场景,你有很多CPU密集型的工作线程不断更新树? 通过使每个n个节点共享一个锁,可以获得一个平衡。输入旋转操作时,请查找受影响节点使用的唯一锁集。大多数时候它只是一把锁。 |
![]() |
4
0
最佳解决方案取决于您的应用程序。但是,如果您有一个类似内存中的数据库,并且希望对其进行并发更新,并且希望具有非常细粒度的锁定,那么您还可以查看不需要像二进制树那样频繁地进行节点旋转的b树。它们也是自动平衡的,不像二叉树,二叉树需要更多的旋转来保持平衡(例如splay树或avl树)。 如果您想对树进行事务性修改,那么可以使用功能性b树(thomas danecker称之为不可变树)。这是一种“写时复制”的二叉树,您只需要锁定根节点。所以你只需要一把锁。在实践中,这些操作的复杂性与二叉树相同,因为函数二叉树上的所有操作都是o(log n),而且每当你从任何树上下来时,你花费的对数时间都是相同的。 每个节点有一个锁很可能不是正确的解决方案。 |
![]() |
5
0
|
![]() |
6
0
我用写时部分拷贝的方法来实现二进制树的读锁自由。我在这里发布了一个不完整的实现 http://groups.google.com/group/comp.programming.threads/msg/6c0775e9882516a2?hl=en& |
![]() |
Bala Ji · 以下BFS的实施效率如何? 4 月前 |
![]() |
Bioinfotec · 如何在R中将两个嵌套列表合并为一个列表? 5 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 9 月前 |
![]() |
ep84 · Python中处理扩展线性序列的快速(最快)方法 10 月前 |
![]() |
Gerry · python中高效的Merge排序实现 11 月前 |
![]() |
Noel · C#通过引用返回结构导致复制 1 年前 |