Python中的HashSets和HashTables

时间:2018-01-03 07:59:39

标签: python data-structures

Python中是否有 HashSet 实现?我知道 HashTable 可以使用词典表示,但我们如何表示 HashSet 实现。

我不是在寻找与 HashSets 相同的方法的数据结构,而是寻找具有CONSTANT查找时间或O(1)的顺序的人;

另外,我想知道Python Dictionary中的查找时间是否为常量,即O(1)

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找的HashSet实现是set()。 此答案可能会帮助您:https://stackoverflow.com/questions/5139724/whats-the-difference-between-hashset-and-set

是的,python字典O(1)的平均时间复杂度。您可能会读到为什么我们使用术语:“平均时间复杂度”: Time complexity of accessing a Python dict

答案 1 :(得分:0)

我想这就是你想要的。你可以自己定义一个哈希函数,就像我在 HashSet 中所做的那样,或者只是使用 Python 中的内置 hash() 函数。

class HashSet:
    CONST = 2 ** 61 - 1

    def __init__(self, size = 10_000):
        self.size = size * 2
        self.contents = [None] * self.size

    def hash(self, x):
        return x % CONST

    def put(self, key):
        idx = self.hash(key) % self.size
        arr = self.contents[idx]
        if arr is None:
            self.contents[idx] = [key]
        elif key not in arr:
            arr.append(key)
        return None

    def get(self, key):
        idx = self.hash(key) % self.size
        arr = self.contents[idx]
        if arr is None or key not in arr:
            return False
        return True


myset = HashSet()
myset.put(123)
myset.put(145)
myset.put(138)
res = myset.get(145)
print(res)
res = myset.get(10)
print(res)


class HashMap:
    def __init__(self, size = 10_000):
        self.size = size * 2
        self.contents = [None] * self.size

    class __Pair:
        def __init__(self, key, value):
            self.key = key
            self.value = value

    def find(self, arr, key):
        for pair in arr:
            if pair.key == key:
                return pair
        return None

    def put(self, key, value):
        idx = hash(key) % self.size
        pair = self.__Pair(key, value)
        arr = self.contents[idx]
        if arr is None:
            self.contents[idx] = [pair,]
            return None

        t = self.find(arr, key)
        if t != None:
            t.value = value
        else:
            arr.append(pair)

    def get(self, key):
        idx = hash(key) % self.size
        arr = self.contents[idx]
        if arr == None:
            raise KeyError(f'{key} is not a valid key')
        t = self.find(arr, key)
        if t == None:
            raise KeyError(f'{key} is not a valid key')
        return t.value


mymap = HashMap()
mymap.put('abc', [123,456])
mymap.put('def', [456,789])
res = mymap.get('abc')
print(res)
res = mymap.get('def')
print(res)
res = mymap.get('defx')
print(res)

答案 2 :(得分:-2)

@Ayush Gupta,我已经实现了HashSet。请看看。评论任何反馈。

class MyHashSet:
def __init__(self):
    self.l = []

def add(self, key: int) -> None:
    if key not in self.l:
        self.l.append(key)

def remove(self, key: int) -> None:
    if key in self.l:
        self.l.remove(key)

def contains(self, key: int) -> bool:
    return key in self.l
    
# Your MyHashSet object will be instantiated and called as such:
obj = MyHashSet()
obj.add(key)
obj.remove(key)
param_3 = obj.contains(key)