Estructura de datos_hash table_python implementación

Definición: Una tabla hash es una estructura de datos, se refiere a una tabla en la que el encabezado de una lista vinculada se almacena mediante una matriz. Mapeamos los datos de acuerdo con la función hash, de modo que los datos se distribuyan a diferentes listas vinculadas de esta tabla. El propósito de esto es porque la eficiencia de búsqueda de una sola lista vinculada es muy baja, solo puede buscar una por una. Después de asignar a diferentes listas vinculadas a través de la función hash, solo necesita buscar en la lista vinculada más pequeña. Puede mejorar enormemente la eficiencia de búsqueda. Por lo tanto, juzgar si la función hash es buena o mala depende principalmente de si los datos se pueden distribuir uniformemente a diferentes listas vinculadas y, en la medida de lo posible, una gran cantidad de datos no se puede agregar a la misma lista vinculada.

Diagrama esquemático
Inserte la descripción de la imagen aquí

La tabla hash (también llamada tabla hash) es una estructura de datos a la que se accede directamente de acuerdo con el valor clave. En otras palabras, accede a los registros asignando valores de códigos clave a una ubicación en la tabla para acelerar la búsqueda. Esta función de mapeo se denomina función hash, y la matriz que almacena los registros se denomina tabla hash. Esta es otra forma de decir que en realidad es lo mismo.

Preguntas específicas: una
pregunta a bordo de la computadora Google:

Hay una compañía que solicita agregar la información del empleado (identificación, género, edad, nombre, dirección ...) cuando un nuevo empleado llega a denunciar. Al ingresar la identificación del empleado, se requiere encontrar toda la información del empleado. .

Requisitos:

  1. Sin usar una base de datos, cuanto más rápido mejor => tabla hash (hash)
  2. Al agregar, asegúrese de insertar de menor a mayor de acuerdo con la identificación [Pensamiento: si la identificación no se inserta de menor a mayor, pero las listas vinculadas siguen siendo de menor a mayor, ¿cómo resolverlo?]
  3. Use una lista vinculada para implementar una tabla hash sin el encabezado

Implementación de código:

#哈希表保存雇员信息
'''
1、一个数组,里面存储着链表,链表存储雇员信息
2、也就是说数组里面实际存储着链表的头节点
3、定义雇员结构{id,name,address},即链表的结点
4、链表[]
5、HashTab[]
6、散列函数
'''

class Emp(object):
    def __init__(self,ID,name):
        self.ID = ID
        self.name=name
        self.next=None
    def show(self):
        print('雇员信息:'+str(self.ID)+' '+self.name)
        
class LinkedList(object):
    def __init__(self):
        self.head=None
    
    #添加雇员
    def add(self,emp):
        if self.head==None:
            self.head=emp
            return
        curEmp = self.head
        while True:
            if curEmp.next==None:
                break
            curEmp=curEmp.next
        curEmp.next=emp
    
    #寻找雇员,找到后返回emp,否则返回None
    def finEmp(self,ID):
        if self.head == None:
            return None
        curEmp = self.head
        while(True):
            if curEmp.ID == ID:
                break
            if curEmp.next == None:
                curEmp=None
                break
            curEmp = curEmp.next
        return curEmp
    
    #显示雇员
    def showlist(self,no):
        if self.head==None:
            print("链表{}为空!".format(no))
            return
        print('链表{}的信息为:'.format(no))
        curEmp = self.head
        while True:
            print('=> id={} name={} '.format(curEmp.ID,curEmp.name))
            if curEmp.next==None:
                break
            curEmp = curEmp.next#后移遍历
            
class HashTab(object):
    
    def __init__(self,size):
        self.arr = [LinkedList() for i in range(size)]
        self.size = size
     
    def hashFun(self,ID):
        return ID % self.size
    
    def add(self,emp):
        #根据雇员的id进行哈希,进而分配到不同的链表
        arrNo = self.hashFun(emp.ID)
        #将emp添加到对应的链表中
        self.arr[arrNo].add(emp)
    
    def lookAll(self):
        for i in range(self.size):
            self.arr[i].showlist(i+1)
    
    #根据输入遍历hashTab
    def findEmp(self,ID):
        empNo = self.hashFun(ID)
        emp = self.arr[empNo].finEmp(ID)
        if emp!=None:
            print('在第{}条链表中找到该雇员 name = {}'.format(empNo+1,emp.name))
            return emp
        else:
            print('在哈希表中没有找到该成员~')
        
            
    
        
emp1 = Emp(11,'肖茵')
emp2= Emp(672,'刘伟')
emp3= Emp(23,'王五')
emp4= Emp(42,'李四')
emp5= Emp(45,'张三')

haxi = HashTab(3)

while(True):
    print()
    key = input('add:添加雇员\nfind:查找雇员\nlist:显示雇员\nexit:退出系统\n')
    if key=='add':
        ID = int(input('ID = '))
        name = input('name = ')
        emp = Emp(ID,name)
        haxi.add(emp)
    elif key=='list':
        haxi.lookAll()
    elif key=='find':
        ID = int(input("ID = "))
        haxi.findEmp(ID)
    elif key=='exit':
        print('退出成功')
        break
    



27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

Origin blog.csdn.net/qq_44273739/article/details/105416433
Recomendado
Clasificación