📅  最后修改于: 2023-12-03 14:56:22.111000             🧑  作者: Mango
符号表是计算机科学中的基本数据结构之一,它是一种将键值对映射起来的数据结构。在程序中,符号表可以用于实现各种数据结构,例如字典、集合、查找表等。
在实现符号表时,通常使用的数据结构有数组、链表、二叉查找树、红黑树、哈希表等。下面将分别介绍这些数据结构在符号表中的应用。
数组是最简单的数据结构之一,它可以用于实现一个静态的符号表。数组的优点是查找速度快,缺点是插入和删除操作慢,而且数组的大小是固定的。
# Python 代码示例
# 声明一个包含 10 个元素的数组
a = [None] * 10
# 向数组中插入键值对
a[0] = "apple"
a[1] = "banana"
a[2] = "cherry"
# 在数组中查找键对应的值
print(a[0]) # 输出:apple
链表是另一种常用的数据结构,它可以用于实现一个动态的符号表。链表的优点是插入和删除操作快,缺点是查找速度慢。
# Python 代码示例
# 声明一个空链表
head = None
# 在链表中插入键值对
head = (0, "apple", head)
head = (1, "banana", head)
head = (2, "cherry", head)
# 在链表中查找键对应的值
p = head
while p:
if p[0] == 0:
print(p[1]) # 输出:apple
break
p = p[2]
二叉查找树是一种常用的数据结构,它可以用于实现一个动态的有序符号表。二叉查找树的优点是插入、删除和查找操作的时间复杂度均为 $O(\log n)$,缺点是最坏情况下时间复杂度为 $O(n)$。
# Python 代码示例
# 声明一个空的二叉查找树节点
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.left = None
self.right = None
# 在二叉查找树中插入键值对
def put(root, key, value):
if root is None:
return Node(key, value)
if key < root.key:
root.left = put(root.left, key, value)
elif key > root.key:
root.right = put(root.right, key, value)
else:
root.value = value
return root
# 在二叉查找树中查找键对应的值
def get(root, key):
while root is not None:
if key < root.key:
root = root.left
elif key > root.key:
root = root.right
else:
return root.value
return None
# 在二叉查找树中删除键
def delete(root, key):
if root is None:
return None
if key < root.key:
root.left = delete(root.left, key)
elif key > root.key:
root.right = delete(root.right, key)
else:
if root.left is None:
return root.right
if root.right is None:
return root.left
t = root
root = min(t.right)
root.right = deleteMin(t.right)
root.left = t.left
return root
红黑树是一种自平衡的二叉查找树,它可以用于实现一个动态的有序符号表。红黑树的优点和二叉查找树相同,但是它的最坏情况下的时间复杂度为 $O(\log n)$。
# Python 代码示例
# 声明一个空的红黑树节点
RED = True
BLACK = False
class Node:
def __init__(self, key, value, color):
self.key = key
self.value = value
self.color = color
self.left = None
self.right = None
# 在红黑树中插入键值对
def put(root, key, value):
if root is None:
return Node(key, value, RED)
if key < root.key:
root.left = put(root.left, key, value)
elif key > root.key:
root.right = put(root.right, key, value)
else:
root.value = value
if isRed(root.right) and not isRed(root.left):
root = rotateLeft(root)
if isRed(root.left) and isRed(root.left.left):
root = rotateRight(root)
if isRed(root.left) and isRed(root.right):
flipColors(root)
return root
# 在红黑树中查找键对应的值
def get(root, key):
while root is not None:
if key < root.key:
root = root.left
elif key > root.key:
root = root.right
else:
return root.value
return None
# 在红黑树中删除键
def delete(root, key):
if root is None:
return None
if key < root.key:
if not isRed(root.left) and not isRed(root.left.left):
root = moveRedLeft(root)
root.left = delete(root.left, key)
else:
if isRed(root.left):
root = rotateRight(root)
if key == root.key and root.right is None:
return None
if not isRed(root.right) and not isRed(root.right.left):
root = moveRedRight(root)
if key == root.key:
x = min(root.right)
root.key = x.key
root.value = x.value
root.right = deleteMin(root.right)
else:
root.right = delete(root.right, key)
return fixUp(root)
# 工具函数
def isRed(n):
if n is None:
return False
return n.color == RED
def rotateLeft(n):
x = n.right
n.right = x.left
x.left = n
x.color = n.color
n.color = RED
return x
def rotateRight(n):
x = n.left
n.left = x.right
x.right = n
x.color = n.color
n.color = RED
return x
def flipColors(n):
n.color = not n.color
n.left.color = not n.left.color
n.right.color = not n.right.color
def moveRedLeft(n):
flipColors(n)
if isRed(n.right.left):
n.right = rotateRight(n.right)
n = rotateLeft(n)
flipColors(n)
return n
def moveRedRight(n):
flipColors(n)
if isRed(n.left.left):
n = rotateRight(n)
flipColors(n)
return n
def deleteMin(n):
if n.left is None:
return None
if not isRed(n.left) and not isRed(n.left.left):
n = moveRedLeft(n)
n.left = deleteMin(n.left)
return fixUp(n)
def fixUp(n):
if isRed(n.right):
n = rotateLeft(n)
if isRed(n.left) and isRed(n.left.left):
n = rotateRight(n)
if isRed(n.left) and isRed(n.right):
flipColors(n)
return n
def min(n):
while n.left is not None:
n = n.left
return n
哈希表是一种高效的数据结构,它可以用于实现一个动态的无序符号表。哈希表的优点是插入、删除和查找操作的时间复杂度均为 $O(1)$,缺点是空间开销较大,而且哈希函数的设计需要考虑到冲突的情况。
# Python 代码示例
# 声明一个空的哈希表
class HashTable:
def __init__(self):
self.size = 16
self.table = [None] * self.size
# 哈希函数
def _hash(self, key):
return hash(key) % self.size
# 插入键值对
def put(self, key, value):
index = self._hash(key)
if self.table[index] is None:
self.table[index] = []
self.table[index].append((key, value))
# 查找键对应的值
def get(self, key):
index = self._hash(key)
if self.table[index] is None:
return None
for k, v in self.table[index]:
if k == key:
return v
return None
# 删除键
def delete(self, key):
index = self._hash(key)
if self.table[index] is None:
return
for i, (k, v) in enumerate(self.table[index]):
if k == key:
del self.table[index][i]
return
以上就是常用的符号表数据结构的介绍和实现代码,程序员可以根据实际需求选择合适的数据结构来实现符号表,以便更好地完成任务。