scala – 纯功能并发跳过列表
Skip lists(Pugh,1990)提供了排序字典与对数时间操作,如搜索树,但
skip lists are much more amenable to concurrent updates。
是否可以创建一个高效的纯功能并发跳过列表?如果没有,是否可以创建任何一种高效的纯功能并发排序字典? 解决方法
跳过列表的属性使得它们有助于并发更新(即,大多数添加和减少是本地的)也使得它们对不变性是坏的(即,列表中的很多较早的项目最终到后来的项目,并且必须改变)。
具体来说,跳过列表包含如下结构: NODE1 ---------------------> NODE2 ---------... | | V V NODE1a --> NODE1b ---------> NODE2a --> NODE2b --> NODE2c --- ... 现在,如果您有更新,例如删除NODE2b或NODE1b,您可以在本地进行处理:您只需分别指向2a至2c或2a至2a,即可完成。不幸的是,由于叶节点都指向一个,所以它不是功能(不可变)更新的良好结构。 因此,树结构对于不变性是更好的(因为损害总是在局部限制 – 只是你关心的节点,它的直接父母通过树的根)。 并发更新对于不可变数据结构不能正常工作。如果您想到,任何功能解决方案都将A更新为f(A)。如果你想要两个更新,一个由f给出,一个由g给出,那么你几乎必须做f(g(A))或g(f(A)),或者你必须拦截请求并创建一个新的操作h = f,g,您可以一次性应用所有(或者您必须做各种其他高度聪明的东西)。 然而,并发读取与不可变数据结构非常好地工作,因为您保证没有状态更改。如果您不认为在任何其他写入可以中断之前可以读取/写入循环,那么您永远不必锁定读取。 因此,写入繁重的数据结构可能更好地实现(并且具有类似跳过列表的东西,您只需要在本地进行锁定),而读取重的数据结构可能会更好地实现(其中树是更自然的数据结构)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- angular2使用PrimeNG-Scheduler实现FullCalendar-Scheduler
- angularjs – 使用Jasmine测试在Angular应用程序中呈现的测
- setCenter无法在angular2-google-maps中工作
- twitter-bootstrap – ReactBootstrap popover在外面点击时
- vim – 如何设置“:make”来使用scons?
- WebService到底是什么? .
- Shell:将数据放在一起
- VIM:我如何从左边的NerdTree面板打开一个文件在右边作为vs
- shell – 如何在openwrt中自动启动应用程序?
- 为什么我的Bash计数器在while循环后重置