データ構造_ハッシュテーブル_Pythonの実装

定義:ハッシュテーブルはデータ構造であり、リンクリストの先頭が配列で格納されているテーブルを指します。ハッシュ関数に従ってデータをマッピングし、データがこのテーブルのさまざまなリンクリストに分散されるようにします。これは、1つのリンクリストの検索効率が非常に低いため、1つずつしか検索できないためです。ハッシュ関数を使用して異なるリンクリストに割り当てた後は、小さいリンクリストから検索するだけで済みます。検索効率を大幅に向上させることができます。したがって、ハッシュ関数が良いか悪いかは、主にデータを異なるリンクリストに均等に分散できるかどうかに依存し、大量のデータを同じリンクリストに集約することはできません。

概略図
ここに画像の説明を挿入

ハッシュテーブル(ハッシュテーブルとも呼ばれます)は、キー値に従って直接アクセスされるデータ構造です。つまり、キーコード値をテーブル内の場所にマッピングしてレコードにアクセスし、検索を高速化します。このマッピング関数はハッシュ関数と呼ばれ、レコードを格納する配列はハッシュテーブルと呼ばれます。これは、実際には同じことを言う別の言い方です。

特定の質問:
Googleコンピュータ搭載質問:

新しい従業員がレポートに来たときに従業員の情報(ID、性別、年齢、名前、住所…)を追加するよう要求する会社があります。従業員のIDを入力するときは、従業員のすべての情報を見つける必要があります。 。

要件:

  1. データベースを使用せずに、より速く=>ハッシュテーブル(ハッシュ)
  2. 追加するときは、IDに従って低から高に挿入するようにしてください[考え:IDが低から高に挿入されないが、リンクリストが低から高にある場合、どのように解決しますか?]
  3. リンクリストを使用して、ヘッダーなしのハッシュテーブルを実装する

コードの実装:

#哈希表保存雇员信息
'''
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件公開 賞賛2件 680回の訪問

おすすめ

転載: blog.csdn.net/qq_44273739/article/details/105416433