这是我的问题,我需要一个行为类似queue
但具有其他一些属性的数据结构:
- 我应该能够很容易地删除给定
tag
的项目(该队列中的每个项目都有一个tag
来对它们进行分组) - 我还需要能够在给定
key
的情况下删除一个项目(添加到集合中的所有项目都将具有这样一个唯一的密钥)。在这里,如果它简化了事情,我可以通过tag
和key
删除,如果它能让它更快的话 - 这个集合是在并发环境中使用的,所以使用尽可能少的锁定将非常棒
- 它应该具有队列的常见FIFO属性。我不需要访问不在head中的项目,但我需要上面的删除行为才能工作
我正在使用C#来构建这个解决方案,但我对算法和数据结构定义更感兴趣,因为我几乎不相信任何可用的集合都能满足我的需求。
论文、书籍、博客文章和任何其他形式的参考都非常受欢迎。
听起来您可以为队列部分使用并发单链表。对于按键删除部分,您可以保留一个指向队列中节点的并发哈希表(条纹锁很容易做到)。
如果这种方法失败了,看看数据库系统是如何做到这一点的。他们可以同时做你想做的所有事情。它们维护b树中数据的主副本,并维护辅助b树索引。对于锁定,它们使用并发哈希表。B树具有很好的并发属性,因为即使在独占锁下更新叶,也可以很容易地共享锁它们的上部。
我认为您可以使用双重多重链表和两个哈希表。
- 队列列表的一部分
- 用于按标记对节点进行分组的另一部分
- 一个用于按键访问节点的哈希表
- 通过标签访问节点的另一个哈希表
Python中的示例(对不起…)
插入元素:
items_table['item_key'] = new_item
my_queue.tail.next = new_item
new_item.previous = my_queue.tail
my_queue.tail = new_item
new_item.next_by_tag = tags_table['item_tag'] #head of tag's list
tags_table['item_tag'].previous_by_tag = new_item
tags_table['item_tag'] = new_item
按键删除元素:
item = key_table['node_key']
item.next.previous = item.previous
item.previous.next = item.next
item.next_by_tag.previous_by_tag = item.previous_by_tag
item.previous_by_tag.next_by_tag = item.next_by_tag
del item
通过标签删除元素:
def remove_elements_by_tag(tag_head):
if tag_head == None:
return
else:
remove_elements_by_tag(tag_head.next_by_tag)
tag_head.next.previous = tag_head.previous
tag_head.previous.next = tag_head.next
类似的东西。希望能有所帮助。