多重集合是一种允许元素重复出现的数据结构,在某些应用场景中非常有用。本文将对比几种常见的多重集合的存储方式,包括数组列表、哈希表和平衡二叉搜索树(如红黑树)。
class ArrayList:
def __init__(self, initial_size=10):
self.data = [None] * initial_size
self.size = 0
def add(self, value):
if self.size == len(self.data):
# 扩容处理
self.resize()
self.data[self.size] = value
self.size += 1
def resize(self):
new_data = [None] * (len(self.data) * 2)
for i in range(len(self.data)):
new_data[i] = self.data[i]
self.data = new_data
# 示例使用
arr_list = ArrayList()
arr_list.add(3)
arr_list.add(5)
print(arr_list.data)
class HashTable:
def __init__(self, capacity=10):
self.capacity = capacity
self.table = [None] * self.capacity
def hash_function(self, value):
return value % self.capacity
def add(self, value):
index = self.hash_function(value)
if self.table[index] is None:
self.table[index] = []
self.table[index].append(value)
# 示例使用
hash_table = HashTable()
hash_table.add(3)
hash_table.add(5)
print(hash_table.table)
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
self.color = 'RED'
class RedBlackTree:
def __init__(self):
self.NIL = Node(0)
self.root = self.NIL
def insert(self, key):
node = Node(key)
node.left = self.NIL
node.right = self.NIL
parent = None
current = self.root
while current != self.NIL:
parent = current
if node.key < current.key:
current = current.left
else:
current = current.right
node.parent = parent
if parent is None:
self.root = node
elif node.key < parent.key:
parent.left = node
else:
parent.right = node
node.color = 'RED'
self.fix_insert(node)
def fix_insert(self, k):
while k.parent.color == 'RED':
if k.parent == k.parent.parent.left:
u = k.parent.parent.right # 兄弟节点
if u.color == 'RED':
k.parent.color = 'BLACK'
u.color = 'BLACK'
k.parent.parent.color = 'RED'
k = k.parent.parent
else:
if k == k.parent.right:
k = k.parent
self.left_rotate(k)
k.parent.color = 'BLACK'
k.parent.parent.color = 'RED'
self.right_rotate(k.parent.parent)
else:
u = k.parent.parent.left # 兄弟节点
if u.color == 'RED':
k.parent.color = 'BLACK'
u.color = 'BLACK'
k.parent.parent.color = 'RED'
k = k.parent.parent
else:
if k == k.parent.left:
k = k.parent
self.right_rotate(k)
k.parent.color = 'BLACK'
k.parent.parent.color = 'RED'
self.left_rotate(k.parent.parent)
self.root.color = 'BLACK'
def left_rotate(self, x):
y = x.right
x.right = y.left
if y.left != self.NIL:
y.left.parent = x
y.parent = x.parent
if x.parent is None:
self.root = y
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y
def right_rotate(self, x):
y = x.left
x.left = y.right
if y.right != self.NIL:
y.right.parent = x
y.parent = x.parent
if x.parent is None:
self.root = y
elif x == x.parent.right:
x.parent.right = y
else:
x.parent.left = y
y.right = x
x.parent = y
# 示例使用
rbt = RedBlackTree()
rbt.insert(3)
rbt.insert(5)
print(rbt.root.key) # 假设输出为根节点的键值
通过以上三种不同的存储方式,我们可以根据具体的应用需求选择合适的多重集合实现方案。每种方法都有其特点和适用场景,在实际开发中需要结合具体情况灵活运用。