Python数据结构,用于高效添加,删除和random.choice

tba*_*tba 7 python data-structures

我正在寻找一个内置的Python数据结构,它可以add包含一个新元素,remove一个现有元素,并选择一个随机元素,所有这些都比O(n)时间好.

我希望set可以做到这一点,但AFAIK,从Python集中选择随机元素的唯一方法是random.choice(list(my_set)),花费O(n)时间.

我更倾向于使用内置于Python的解决方案,因为我需要高效且易于部署.不幸的是,Python似乎没有内置的树数据类型.

Amb*_*ber 9

Python没有内置的数据结构,可满足您的所有3个要求.

也就是说,自己实现一棵树是相当微不足道的.


另一种选择是将字典与列表组合以创建实际上是一个集合,该集合还维护其项目列表:

import random

class ListDict(object):
    def __init__(self):
        self.item_to_position = {}
        self.items = []

    def add_item(self, item):
        if item in self.item_to_position:
            return
        self.items.append(item)
        self.item_to_position[item] = len(self.items)-1

    def remove_item(self, item):
        position = self.item_to_position.pop(item)
        last_item = self.items.pop()
        if position != len(self.items):
            self.items[position] = last_item
            self.item_to_position[last_item] = position

    def choose_random_item(self):
        return random.choice(self.items)
Run Code Online (Sandbox Code Playgroud)

由于在列表上完成的唯一操作是.pop().append(),它们不应该花费超过恒定的时间(至少在大多数Python实现中).

  • 实现高效,自平衡的树并非易事. (3认同)
  • 小贴士:不妨用`dict.pop`代替`remove_item`的前四行。 (2认同)
  • 哦,当然。你可以只做“item in self.item_to_position”。简单的。 (2认同)