定義:ハッシュテーブルはデータ構造であり、リンクリストの先頭が配列で格納されているテーブルを指します。ハッシュ関数に従ってデータをマッピングし、データがこのテーブルのさまざまなリンクリストに分散されるようにします。これは、1つのリンクリストの検索効率が非常に低いため、1つずつしか検索できないためです。ハッシュ関数を使用して異なるリンクリストに割り当てた後は、小さいリンクリストから検索するだけで済みます。検索効率を大幅に向上させることができます。したがって、ハッシュ関数が良いか悪いかは、主にデータを異なるリンクリストに均等に分散できるかどうかに依存し、大量のデータを同じリンクリストに集約することはできません。
概略図
ハッシュテーブル(ハッシュテーブルとも呼ばれます)は、キー値に従って直接アクセスされるデータ構造です。つまり、キーコード値をテーブル内の場所にマッピングしてレコードにアクセスし、検索を高速化します。このマッピング関数はハッシュ関数と呼ばれ、レコードを格納する配列はハッシュテーブルと呼ばれます。これは、実際には同じことを言う別の言い方です。
特定の質問:
Googleコンピュータ搭載質問:
新しい従業員がレポートに来たときに従業員の情報(ID、性別、年齢、名前、住所…)を追加するよう要求する会社があります。従業員のIDを入力するときは、従業員のすべての情報を見つける必要があります。 。
要件:
- データベースを使用せずに、より速く=>ハッシュテーブル(ハッシュ)
- 追加するときは、IDに従って低から高に挿入するようにしてください[考え:IDが低から高に挿入されないが、リンクリストが低から高にある場合、どのように解決しますか?]
- リンクリストを使用して、ヘッダーなしのハッシュテーブルを実装する
コードの実装:
#哈希表保存雇员信息
'''
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