python实现hashmap_用Python设计HashMap

假设我们要设计一个HashMap而不使用任何内置的哈希表库。将有以下不同的功能-put(key,value)-这会将与key关联的值插入到HashMap中。如果HashMap中已经存在该值,请更新该值。

get(key)-这将返回指定键所映射到的值,如果此映射不包含该键的映射,则返回-1。

remove(key)-如果此映射包含键的映射,则它将删除值键的映射。

因此,如果输入类似于初始化后,请按如下所示调用put和get方法-put(1,1);

put(2,2);

get(1);

get(3);

put(2,1);

get(2);

remove(2);

get(2);

那么输出将分别为1,-1(不存在),1 -1(不存在)。

为了解决这个问题,我们将遵循以下步骤-创建一个称为node的新数据结构,并将其初始化,将有一些字段,如(key,val,next),next最初为null

定义一个链表,方法如下:

定义一个初始化程序,它将如下工作:prehead:=一个新节点,节点为key = null,val = null

定义一个功能search()。这将需要关键

p:= prehead.next

当p不为null时,执行返回p

如果p.key与key相同,则

p:= p.next

不返回

定义一个功能add()。这将需要键,val

p:=搜索(关键字)

如果p不为null,则p.val:= val

除此以外,node:=具有(key,val)的新节点

prehead.next:=节点,node.next:= prehead.next

定义一个功能get()。这将需要关键

p:=搜索(关键字)

如果p不为null,则返回p.val

除此以外,返回null

定义一个功能删除。这将需要关键

上一页:=前置

cur:=上一页下一页

当cur不为空时,prev.next:= cur.next

从循环中出来

如果cur.key与key相同,则

上一页:= curr,cur:= cur.next

如果cur不为null,则

定义一个功能serialize()。

p:= prehead.next

ret:=一个新列表

当p不为null时,执行在末尾插入[p.key,p.val]到ret

p:= p.next

返回ret

在自定义哈希映射中,定义方法如下:

定义一个初始化器。

大小:= 1033

arr:=LinkedList()长度与大小相同的数组

定义一个函数_hash()。这将需要关键

返回键mod大小

定义一个功能put()。这将需要关键,值

h:= _hash(键)

arr [h]的add(key,value)

定义一个功能get()。这将需要关键

h:= _hash(键)

ret:= get [key] of arr [h]

如果ret不为null,则返回ret

除此以外,返回-1

定义一个功能remove()。这将需要关键

h:= _hash(键)

从arr [h]删除键

让我们看下面的实现以更好地理解-

示例class Node:

def __init__(self, key, val):

self.key = key

self.val = val

self.next = None

class LinkedList:

def __init__(self):

self.prehead = Node(None, None)

def search(self, key):

p = self.prehead.next

while p:

if p.key == key:

return p

p = p.next

return None

def add(self, key, val):

p = self.search(key)

if p:

p.val = val

else:

node = Node(key, val)

self.prehead.next, node.next = node, self.prehead.next

def get(self, key):

p = self.search(key)

if p:

return p.val

else:

return None

def remove(self, key):

prev = self.prehead

cur = prev.next

while cur:

if cur.key == key:

break

prev, cur = cur, cur.next

if cur:

prev.next = cur.next

def serialize(self):

p = self.prehead.next

ret = []

while p:

ret.append([p.key, p.val])

p = p.next

return ret

class MyHashMap:

def __init__(self):

self.size = 1033

self.arr = [LinkedList() for _ in range(self.size)]

def _hash(self, key):

return key % self.size

def put(self, key, value):

h = self._hash(key)

self.arr[h].add(key, value)

def get(self, key):

h = self._hash(key)

ret = self.arr[h].get(key)

if ret is not None:

return ret

else:

return -1

def remove(self, key):

h = self._hash(key)

self.arr[h].remove(key)

ob = MyHashMap()ob.put(1, 1)

ob.put(2, 2)

print(ob.get(1))

print(ob.get(3))

ob.put(2, 1)

print(ob.get(2))

ob.remove(2)

print(ob.get(2))

输入值ob = MyHashMap()ob.put(1, 1)

ob.put(2, 2)

print(ob.get(1))

print(ob.get(3))

ob.put(2, 1)

print(ob.get(2))

ob.remove(2)

print(ob.get(2))

输出结果1

-1

1

-1

你可能感兴趣的:(python实现hashmap)