📜  用于符号表的DS(1)

📅  最后修改于: 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

以上就是常用的符号表数据结构的介绍和实现代码,程序员可以根据实际需求选择合适的数据结构来实现符号表,以便更好地完成任务。