146 lines
3.2 KiB
Python
146 lines
3.2 KiB
Python
import random
|
||
import time
|
||
import sys
|
||
|
||
def mr(name, phone):
|
||
return {"name": name, "phone": phone}
|
||
|
||
#llист
|
||
def ll_create_node(record):
|
||
return [record, None]
|
||
|
||
def ll_insert(ll_head, record):
|
||
new_node = ll_create_node(record)
|
||
new_node[1] = ll_head[0]
|
||
ll_head[0] = new_node
|
||
|
||
def ll_find(ll_head, name):
|
||
cur = ll_head[0]
|
||
while cur:
|
||
if cur[0]["name"] == name:
|
||
return cur[0]
|
||
cur = cur[1]
|
||
return None
|
||
|
||
def ll_delete(ll_head, name):
|
||
cur = ll_head[0]
|
||
prev = None
|
||
while cur:
|
||
if cur[0]["name"] == name:
|
||
if prev:
|
||
prev[1] = cur[1]
|
||
else:
|
||
ll_head[0] = cur[1]
|
||
return True
|
||
prev = cur
|
||
cur = cur[1]
|
||
return False
|
||
|
||
def ll_list_all(ll_head):
|
||
res = []
|
||
cur = ll_head[0]
|
||
while cur:
|
||
res.append(cur[0])
|
||
cur = cur[1]
|
||
return res
|
||
|
||
#ht
|
||
def ht_hash(name, size):
|
||
return hash(name) % size
|
||
def ht_insert(table, record):
|
||
idx = ht_hash(record["name"], len(table))
|
||
new_node = ll_create_node(record)
|
||
new_node[1] = table[idx]
|
||
table[idx] = new_node
|
||
|
||
def ht_find(table, name):
|
||
idx = ht_hash(name, len(table))
|
||
cur = table[idx]
|
||
while cur:
|
||
if cur[0]["name"] == name:
|
||
return cur[0]
|
||
cur = cur[1]
|
||
return None
|
||
|
||
def ht_delete(table, name):
|
||
idx = ht_hash(name, len(table))
|
||
cur = table[idx]
|
||
prev = None
|
||
while cur:
|
||
if cur[0]["name"] == name:
|
||
if prev:
|
||
prev[1] = cur[1]
|
||
else:
|
||
table[idx] = cur[1]
|
||
return True
|
||
prev = cur
|
||
cur = cur[1]
|
||
return False
|
||
|
||
def ht_list_all(table):
|
||
res = []
|
||
for head in table:
|
||
cur = head
|
||
while cur:
|
||
res.append(cur[0])
|
||
cur = cur[1]
|
||
return res
|
||
|
||
|
||
# bst
|
||
def bst_create_node(record):
|
||
return [record, None, None]
|
||
|
||
def bst_insert(root, record):
|
||
if root is None:
|
||
return bst_create_node(record)
|
||
if record["name"] < root[0]["name"]:
|
||
root[1] = bst_insert(root[1], record)
|
||
elif record["name"] > root[0]["name"]:
|
||
root[2] = bst_insert(root[2], record)
|
||
else: #мб
|
||
root[0] = record
|
||
return root
|
||
|
||
def bst_find(root, name):
|
||
if root is None:
|
||
return None
|
||
if name == root[0]["name"]:
|
||
return root[0]
|
||
elif name < root[0]["name"]:
|
||
return bst_find(root[1], name)
|
||
else:
|
||
return bst_find(root[2], name)
|
||
|
||
def bst_find_min(node):
|
||
while node[1] is not None:
|
||
node = node[1]
|
||
return node
|
||
|
||
def bst_delete(root, name):
|
||
if root is None:
|
||
return None
|
||
if name < root[0]["name"]:
|
||
root[1] = bst_delete(root[1], name)
|
||
elif name > root[0]["name"]:
|
||
root[2] = bst_delete(root[2], name)
|
||
else:
|
||
|
||
if root[1] is None:
|
||
return root[2]
|
||
elif root[2] is None:
|
||
return root[1]
|
||
else:
|
||
succ = bst_find_min(root[2])
|
||
root[0] = succ[0]
|
||
root[2] = bst_delete(root[2], succ[0]["name"])
|
||
return root
|
||
|
||
def bst_list_all(root):
|
||
def inorder(node):
|
||
if node is None:
|
||
return []
|
||
return inorder(node[1]) + [node[0]] + inorder(node[2])
|
||
return inorder(root)
|
||
if __name__ == "__main__":
|
||
print('cba') |