2026-04-10 04:26:53 +00:00
|
|
|
import random as rnd
|
|
|
|
|
#############################################################################################
|
|
|
|
|
|
2026-05-01 14:59:57 +00:00
|
|
|
def sort_list(name_list):
|
|
|
|
|
l = len(name_list)
|
|
|
|
|
for i in range(l - 1):
|
|
|
|
|
for j in range(l - i - 1):
|
|
|
|
|
if name_list[j][0] > name_list[j + 1][0]:
|
2026-05-01 15:22:46 +00:00
|
|
|
name_list[j], name_list[j + 1] = name_list[j + 1], name_list[j]
|
2026-05-01 14:59:57 +00:00
|
|
|
return name_list
|
|
|
|
|
|
2026-05-01 16:47:22 +00:00
|
|
|
def hash_key(name):
|
|
|
|
|
h_key = sum(ord(ch) for ch in name)
|
|
|
|
|
return h_key
|
|
|
|
|
|
|
|
|
|
|
2026-05-01 14:59:57 +00:00
|
|
|
|
|
|
|
|
###########################################################################################################################
|
|
|
|
|
|
2026-04-10 04:26:53 +00:00
|
|
|
def ll_insert(head, name, phone):
|
|
|
|
|
next_node = {'name': name, 'phone': phone, 'next': None}
|
|
|
|
|
if head is None: return next_node
|
|
|
|
|
|
|
|
|
|
running = head
|
|
|
|
|
while running is not None:
|
|
|
|
|
if running['name'] == name:
|
|
|
|
|
running['phone'] = phone
|
|
|
|
|
return head
|
|
|
|
|
running = running['next']
|
|
|
|
|
|
|
|
|
|
running = head
|
|
|
|
|
while running['next'] is not None: running = running['next']
|
|
|
|
|
running['next'] = next_node
|
|
|
|
|
return head
|
|
|
|
|
|
2026-04-22 14:04:25 +00:00
|
|
|
def ll_find(head, name):
|
|
|
|
|
running = head
|
|
|
|
|
|
2026-04-22 16:50:01 +00:00
|
|
|
while True:
|
2026-04-22 14:04:25 +00:00
|
|
|
if running['name'] == name:
|
|
|
|
|
return running['phone']
|
|
|
|
|
running = running['next']
|
2026-04-22 16:50:01 +00:00
|
|
|
if running is None: break
|
2026-04-22 14:04:25 +00:00
|
|
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
2026-04-22 16:50:01 +00:00
|
|
|
def ll_delete(head, name):
|
|
|
|
|
running = head
|
|
|
|
|
|
|
|
|
|
if running['name'] == name:
|
|
|
|
|
return head['next']
|
|
|
|
|
|
|
|
|
|
while running['next']['name'] != name:
|
|
|
|
|
running = running['next']
|
|
|
|
|
if running['next']['next'] is None:
|
|
|
|
|
if running['next']['name'] != name:
|
|
|
|
|
return head
|
|
|
|
|
if running['next']['next'] is None:
|
|
|
|
|
running['next'] = None
|
|
|
|
|
else: running['next'] = running['next']['next']
|
|
|
|
|
|
|
|
|
|
return head
|
|
|
|
|
|
|
|
|
|
|
2026-05-01 08:09:09 +00:00
|
|
|
def ll_list_all(head):
|
|
|
|
|
name_list = []
|
|
|
|
|
running = head
|
|
|
|
|
while running is not None:
|
2026-05-01 15:22:46 +00:00
|
|
|
name_list.append((running['name'], running['phone']))
|
2026-05-01 08:09:09 +00:00
|
|
|
running = running['next']
|
|
|
|
|
return name_list
|
2026-04-22 16:50:01 +00:00
|
|
|
|
2026-05-01 14:59:57 +00:00
|
|
|
################################################################################################################################
|
2026-04-22 14:04:25 +00:00
|
|
|
|
|
|
|
|
|
2026-05-01 13:48:41 +00:00
|
|
|
def LinkedList(head):
|
2026-04-22 14:04:25 +00:00
|
|
|
|
|
|
|
|
print('======== TESTING LL_INSERT ==========')
|
2026-05-01 13:48:41 +00:00
|
|
|
Name = ['Dima', 'Ivan', 'Maxim', 'Alex', 'Olga', 'Lena']
|
2026-04-22 14:04:25 +00:00
|
|
|
|
|
|
|
|
for _ in range(10):
|
2026-05-01 13:48:41 +00:00
|
|
|
name = Name[rnd.randint(0, len(Name) - 1)]
|
2026-04-22 14:04:25 +00:00
|
|
|
phone = str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + '-' + \
|
|
|
|
|
str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9))
|
|
|
|
|
print(name, phone)
|
|
|
|
|
head = ll_insert(head, name, phone)
|
|
|
|
|
print(head)
|
|
|
|
|
print('-----------------------------------\n')
|
2026-05-01 13:48:41 +00:00
|
|
|
print('======== END TESTING ================\n\n')
|
2026-04-22 14:04:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
print('======== TESTING LL_FIND ==========')
|
|
|
|
|
Name.append('Masha')
|
|
|
|
|
for i in range(len(Name)):
|
|
|
|
|
name = Name[i]
|
|
|
|
|
print(name, ":", ll_find(head, name))
|
2026-05-01 13:48:41 +00:00
|
|
|
print("======== END TESTING =============\n\n")
|
2026-04-22 14:04:25 +00:00
|
|
|
|
2026-05-01 08:09:09 +00:00
|
|
|
print("============ TESTING LL_LIST_ALL AND SORT_LIST =============")
|
|
|
|
|
print(*sort_list(ll_list_all(head)))
|
2026-05-01 13:48:41 +00:00
|
|
|
print("============ END TESTING ===============\n\n")
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-04-22 16:50:01 +00:00
|
|
|
print('========== TESTING LL_DELETE ==========')
|
|
|
|
|
|
|
|
|
|
for _ in range(2):
|
|
|
|
|
name = Name[rnd.randint(0, 4)]
|
|
|
|
|
head = ll_delete(head, name)
|
|
|
|
|
|
|
|
|
|
print(head)
|
|
|
|
|
print(name, ":", ll_find(head, name))
|
2026-05-01 13:48:41 +00:00
|
|
|
print("========= END TESTING ==============\n\n")
|
|
|
|
|
|
|
|
|
|
#########################################################################################################
|
|
|
|
|
|
2026-05-01 14:59:57 +00:00
|
|
|
def ht_insert(buckest, name, phone):
|
2026-05-01 16:47:22 +00:00
|
|
|
index = hash_key(name) % 10
|
2026-05-01 14:59:57 +00:00
|
|
|
for i, (Name, Phone) in enumerate(buckest[index]):
|
|
|
|
|
if Name == name:
|
|
|
|
|
buckest[index][i] = (name, phone)
|
|
|
|
|
return buckest
|
|
|
|
|
buckest[index].append((name, phone))
|
|
|
|
|
return buckest
|
2026-04-22 14:04:25 +00:00
|
|
|
|
2026-05-01 15:22:46 +00:00
|
|
|
def ht_find(buckest, name):
|
2026-05-01 16:47:22 +00:00
|
|
|
index = hash_key(name) % 10
|
2026-05-01 15:22:46 +00:00
|
|
|
for (Name, Phone) in buckest[index]:
|
|
|
|
|
if Name == name:
|
|
|
|
|
return Phone
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def ht_list_all(buckest):
|
|
|
|
|
|
|
|
|
|
name_list = []
|
|
|
|
|
|
|
|
|
|
for index in range(len(buckest)):
|
|
|
|
|
for i, (name, phone) in enumerate(buckest[index]):
|
|
|
|
|
name_list.append((name, phone))
|
|
|
|
|
|
|
|
|
|
name_list = sort_list(name_list)
|
|
|
|
|
|
|
|
|
|
return name_list
|
2026-05-01 15:36:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def ht_delete(buckest, name):
|
2026-05-01 16:47:22 +00:00
|
|
|
index = hash_key(name) % 10
|
2026-05-01 15:36:41 +00:00
|
|
|
for i, (Name, Phone) in enumerate(buckest[index]):
|
|
|
|
|
if Name == name:
|
|
|
|
|
del buckest[index][i]
|
|
|
|
|
return buckest
|
|
|
|
|
|
|
|
|
|
|
2026-05-01 13:48:41 +00:00
|
|
|
####################################################################################################
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-05-01 15:22:46 +00:00
|
|
|
def HashTable(buckest):
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-05-01 13:48:41 +00:00
|
|
|
print('=========== TESTING HT_INSERT =============')
|
|
|
|
|
Name = ['Dima', 'Alex', 'Ivan', 'Maxim', 'Olga', 'Lena']
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-05-01 13:48:41 +00:00
|
|
|
for _ in range(10):
|
|
|
|
|
name = Name[rnd.randint(0, len(Name) - 1)]
|
|
|
|
|
phone = str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + '-' + \
|
|
|
|
|
str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9))
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-05-01 13:48:41 +00:00
|
|
|
print(name, phone)
|
2026-05-01 15:22:46 +00:00
|
|
|
buckest = ht_insert(buckest, name, phone)
|
|
|
|
|
print(buckest)
|
2026-05-01 13:48:41 +00:00
|
|
|
print('-----------------------------------------------------\n')
|
|
|
|
|
|
|
|
|
|
print('============= END TESTING =====================\n\n')
|
|
|
|
|
|
2026-05-01 15:22:46 +00:00
|
|
|
|
|
|
|
|
print('============== TESTING HT_FIND =====================')
|
|
|
|
|
|
|
|
|
|
Name.append('Masha')
|
2026-05-01 14:59:57 +00:00
|
|
|
for i in range(len(Name)):
|
|
|
|
|
name = Name[i]
|
2026-05-01 15:22:46 +00:00
|
|
|
print(name, ":", ht_find(buckest, name))
|
2026-05-01 14:59:57 +00:00
|
|
|
print("======== END TESTING =============\n\n")
|
2026-05-01 15:22:46 +00:00
|
|
|
|
|
|
|
|
print("================ TESTING TH_LIST_ALL ====================")
|
|
|
|
|
|
|
|
|
|
print(*ht_list_all(buckest))
|
2026-05-01 15:36:41 +00:00
|
|
|
print("========= END TESTING ==============\n\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print('========== TESTING HT_DELETE ==========')
|
2026-05-01 15:22:46 +00:00
|
|
|
|
2026-05-01 15:36:41 +00:00
|
|
|
for _ in range(2):
|
|
|
|
|
name = Name[rnd.randint(0, len(Name) - 1)]
|
2026-05-02 09:58:29 +00:00
|
|
|
buckest = ht_delete(buckest, name)
|
2026-05-01 15:36:41 +00:00
|
|
|
|
|
|
|
|
print(buckest)
|
|
|
|
|
print(name, ":", ht_find(buckest, name))
|
|
|
|
|
print("========= END TESTING ==============\n\n")
|
2026-05-01 13:48:41 +00:00
|
|
|
|
|
|
|
|
#################################################################################################
|
2026-05-01 16:26:24 +00:00
|
|
|
|
|
|
|
|
def bst_insert(root, name, phone):
|
|
|
|
|
|
|
|
|
|
running = root
|
|
|
|
|
|
|
|
|
|
if running is None:
|
|
|
|
|
root = {'name': name, 'phone': phone, 'left': None, 'right': None}
|
|
|
|
|
return root
|
|
|
|
|
while True:
|
2026-05-02 09:58:29 +00:00
|
|
|
node = hash_key(running['name'])
|
2026-05-01 16:47:22 +00:00
|
|
|
sheet = hash_key(name)
|
2026-05-01 16:26:24 +00:00
|
|
|
if node < sheet:
|
|
|
|
|
if running['right'] is None:
|
|
|
|
|
running['right'] = {'name': name, 'phone': phone, 'left': None, 'right': None}
|
|
|
|
|
return root
|
|
|
|
|
running = running['right']
|
|
|
|
|
elif node > sheet:
|
|
|
|
|
if running['left'] is None:
|
|
|
|
|
running['left'] = {'name': name, 'phone': phone, 'left': None, 'right': None}
|
|
|
|
|
return root
|
|
|
|
|
running = running['left']
|
|
|
|
|
else:
|
|
|
|
|
running['phone'] = phone
|
|
|
|
|
return root
|
|
|
|
|
|
2026-05-01 16:47:22 +00:00
|
|
|
def bst_find(root, name):
|
|
|
|
|
|
|
|
|
|
running = root
|
2026-05-01 16:26:24 +00:00
|
|
|
|
2026-05-01 16:47:22 +00:00
|
|
|
while running is not None:
|
|
|
|
|
node = hash_key(running['name'])
|
2026-05-02 09:58:29 +00:00
|
|
|
sheet = hash_key(name)
|
2026-05-01 16:47:22 +00:00
|
|
|
if name == running['name']:
|
|
|
|
|
return running['phone']
|
|
|
|
|
elif node < sheet:
|
|
|
|
|
running = running['right']
|
|
|
|
|
else:
|
|
|
|
|
running = running['left']
|
2026-05-01 16:26:24 +00:00
|
|
|
|
2026-05-01 16:47:22 +00:00
|
|
|
return None
|
2026-05-02 09:58:29 +00:00
|
|
|
|
|
|
|
|
def bst_list_all(root, name_list = []):
|
|
|
|
|
if root is None:
|
|
|
|
|
return
|
|
|
|
|
name_list.append((root['name'], root['phone']))
|
|
|
|
|
bst_list_all(root['left'], name_list)
|
|
|
|
|
bst_list_all(root['right'], name_list)
|
|
|
|
|
name_list = sort_list(name_list)
|
|
|
|
|
return name_list
|
|
|
|
|
|
|
|
|
|
def bst_delete(root, name):
|
|
|
|
|
|
|
|
|
|
running = root
|
|
|
|
|
|
|
|
|
|
while running is not None:
|
|
|
|
|
node = hash_key(running['name'])
|
|
|
|
|
sheet = hash_key(name)
|
|
|
|
|
if name == running['name']:
|
|
|
|
|
|
|
|
|
|
break
|
|
|
|
|
elif node < sheet:
|
|
|
|
|
old_running = running
|
|
|
|
|
flag = 1
|
|
|
|
|
running = running['right']
|
|
|
|
|
else:
|
|
|
|
|
old_running = running
|
|
|
|
|
flag = 0
|
|
|
|
|
running = running['left']
|
|
|
|
|
|
|
|
|
|
step = ['left', 'right']
|
|
|
|
|
|
|
|
|
|
if running['left'] is None:
|
|
|
|
|
old_running[step[flag]] = running['right']
|
|
|
|
|
return root
|
|
|
|
|
|
|
|
|
|
if running['right'] is None:
|
|
|
|
|
old_running[step[flag]] = running['left']
|
|
|
|
|
return root
|
|
|
|
|
|
|
|
|
|
node_delete = running
|
|
|
|
|
old_running = running
|
|
|
|
|
running = running['right']
|
|
|
|
|
while running['left'] is not None:
|
|
|
|
|
old_running = running
|
|
|
|
|
running = running['left']
|
|
|
|
|
|
|
|
|
|
node_delete['name'] = running['name']
|
|
|
|
|
node_delete['phone'] = running['phone']
|
|
|
|
|
old_running['left'] = None
|
|
|
|
|
|
|
|
|
|
return root
|
|
|
|
|
|
2026-05-01 16:26:24 +00:00
|
|
|
#################################################################################################
|
|
|
|
|
|
|
|
|
|
def BinarySearchTree(root):
|
|
|
|
|
|
|
|
|
|
print('=========== TESTING BST_INSERT =============')
|
|
|
|
|
Name = ['Dima', 'Alex', 'Ivan', 'Maxim', 'Olga', 'Lena']
|
|
|
|
|
|
|
|
|
|
for _ in range(10):
|
|
|
|
|
name = Name[rnd.randint(0, len(Name) - 1)]
|
|
|
|
|
phone = str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + '-' + \
|
|
|
|
|
str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9))
|
|
|
|
|
|
|
|
|
|
print(name, phone)
|
|
|
|
|
root = bst_insert(root, name, phone)
|
|
|
|
|
print(root)
|
|
|
|
|
print('-----------------------------------------------------\n')
|
|
|
|
|
|
|
|
|
|
print('============= END TESTING =====================\n\n')
|
|
|
|
|
|
2026-05-01 16:47:22 +00:00
|
|
|
print('============== TESTING BST_FIND =====================')
|
|
|
|
|
|
|
|
|
|
Name.append('Masha')
|
|
|
|
|
for i in range(len(Name)):
|
|
|
|
|
name = Name[i]
|
|
|
|
|
print(name, ":", bst_find(root, name))
|
|
|
|
|
print("======== END TESTING =============\n\n")
|
2026-05-02 09:58:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
print('===================== TESTING BST_LIST_ALL =============')
|
|
|
|
|
name_list = bst_list_all(root)
|
|
|
|
|
print(*name_list)
|
|
|
|
|
print("======== END TESTING =============\n\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print('========== TESTING HT_DELETE ==========')
|
|
|
|
|
|
|
|
|
|
for _ in range(2):
|
|
|
|
|
name = Name[rnd.randint(0, len(Name) - 1)]
|
|
|
|
|
root = bst_delete(root, name)
|
|
|
|
|
|
|
|
|
|
print(root)
|
|
|
|
|
print(name, ":", bst_find(root, name))
|
|
|
|
|
print("========= END TESTING ==============\n\n")
|
2026-05-01 16:47:22 +00:00
|
|
|
|
2026-05-01 16:26:24 +00:00
|
|
|
|
|
|
|
|
################################################################################################
|
2026-05-01 13:48:41 +00:00
|
|
|
def main():
|
|
|
|
|
|
|
|
|
|
LinkedList(None)
|
2026-05-01 14:59:57 +00:00
|
|
|
HashTable([[] for _ in range(10)])
|
2026-05-01 16:26:24 +00:00
|
|
|
BinarySearchTree(None)
|
2026-05-01 08:09:09 +00:00
|
|
|
|
2026-04-22 14:04:25 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|
|
|
|
|
|
|
|
|
|
|
2026-04-10 04:26:53 +00:00
|
|
|
|
|
|
|
|
|