对于允许批量和特定删除的并发队列,我将使用什么数据结构或数据结构的混合



这是我的问题,我需要一个行为类似queue但具有其他一些属性的数据结构:

  • 我应该能够很容易地删除给定tag的项目(该队列中的每个项目都有一个tag来对它们进行分组)
  • 我还需要能够在给定key的情况下删除一个项目(添加到集合中的所有项目都将具有这样一个唯一的密钥)。在这里,如果它简化了事情,我可以通过tagkey删除,如果它能让它更快的话
  • 这个集合是在并发环境中使用的,所以使用尽可能少的锁定将非常棒
  • 它应该具有队列的常见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

类似的东西。希望能有所帮助。

最新更新