关注B站可以观看更多实战教学视频:hallo128的个人空间
与数据开发或者数据平台搭建有关的数据结构算法(Python实现)
目录
- 与数据开发或者数据平台搭建有关的数据结构算法(Python实现)
- 1. 哈希表 (Hash Table)
- 2. 布隆过滤器 (Bloom Filter)
- 3. 并查集 (Union-Find)
- 4. Trie 树 (前缀树)
- 5. 分布式一致性算法(如 Paxos 和 Raft)
- 6. 堆 (Heap)
- 7. 图的最短路径算法 (Dijkstra 和 Bellman-Ford)
1. 哈希表 (Hash Table)
- 场景:
- 数据查找:数据平台中经常需要快速查找用户数据或查询日志等,哈希表可以将查找的时间复杂度降到 O(1)。
- 缓存系统:许多分布式系统如 Redis、Memcached 使用哈希表来实现高效的缓存机制。
- 示例:设计简单的哈希表
class HashMap:
def __init__(self):
self.size = 1000
self.table = [None] * self.size
def _hash(self, key):
return hash(key) % self.size
def put(self, key, value):
idx = self._hash(key)
if not self.table[idx]:
self.table[idx] = []
for i, kv in enumerate(self.table[idx]):
if kv[0] == key:
self.table[idx][i] = (key, value)
return
self.table[idx].append((key, value))
def get(self, key):
idx = self._hash(key)
if not self.table[idx]:
return -1
for kv in self.table[idx]:
if kv[0] == key:
return kv[1]
return -1
def remove(self, key):
idx = self._hash(key)
if not self.table[idx]:
return
for i, kv in enumerate(self.table[idx]):
if kv[0] == key:
del self.table[idx][i]
return
# 测试
hash_map = HashMap()
hash_map.put("name", "Alice")
print(hash_map.get("name")) # 输出 'Alice'
hash_map.remove("name")
print(hash_map.get("name")) # 输出 -1
2. 布隆过滤器 (Bloom Filter)
- 场景:
- 去重:用于快速检测某个数据是否存在,布隆过滤器非常适合用于防止重复数据导入。
- 大规模数据集查询:布隆过滤器常用于大型数据系统中进行快速的存在性查询,虽然会有一定的误判率,但非常节省空间。
- 示例:实现一个简单的布隆过滤器
from bitarray import bitarray
import mmh3
class BloomFilter:
def __init__(self, size, hash_count):
self.size = size
self.hash_count = hash_count
self.bit_array = bitarray(size)
self.bit_array.setall(0)
def add(self, item):
for i in range(self.hash_count):
digest = mmh3.hash(item, i) % self.size
self.bit_array[digest] = True
def check(self, item):
for i in range(self.hash_count):
digest = mmh3.hash(item, i) % self.size
if self.bit_array[digest] == False:
return False
return True
# 测试
bloom = BloomFilter(1000, 10)
bloom.add("data_platform")
print(bloom.check("data_platform")) # 输出 True
print(bloom.check("other_data")) # 输出 False
3. 并查集 (Union-Find)
- 场景:
- 集群节点合并:在分布式系统中,经常需要进行动态的节点管理或节点分配,使用并查集可以高效处理集群间的连接和合并问题。
- 社交网络中的关系图计算:用于确定两个用户是否属于同一个社交网络。
- 示例:实现并查集
class UnionFind:
def __init__(self, size):
self.parent = list(range(size))
self.rank = [1] * size
def find(self, p):
if self.parent[p] != p:
self.parent[p] = self.find(self.parent[p])
return self.parent[p]
def union(self, p, q):
rootP = self.find(p)
rootQ = self.find(q)
if rootP != rootQ:
if self.rank[rootP] > self.rank[rootQ]:
self.parent[rootQ] = rootP
elif self.rank[rootP] < self.rank[rootQ]:
self.parent[rootP] = rootQ
else:
self.parent[rootQ] = rootP
self.rank[rootP] += 1
# 测试
uf = UnionFind(10)
uf.union(1, 2)
uf.union(2, 3)
print(uf.find(1) == uf.find(3)) # 输出 True
print(uf.find(1) == uf.find(4)) # 输出 False
4. Trie 树 (前缀树)
- 场景:
- 字符串匹配与前缀查询:Trie 在数据平台的搜索系统中应用广泛,用于快速检索带有相同前缀的字符串(如自动补全、关键词推荐)。
- 日志分析:可以用于对查询日志进行前缀分析,帮助优化查询系统。
- 示例:Trie 的实现
class TrieNode:
def __init__(self):
self.children = {}
self.is_end_of_word = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end_of_word = True
def search(self, word):
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.is_end_of_word
def starts_with(self, prefix):
node = self.root
for char in prefix:
if char not in node.children:
return False
node = node.children[char]
return True
# 测试
trie = Trie()
trie.insert("data")
trie.insert("database")
print(trie.search("data")) # 输出 True
print(trie.search("dat")) # 输出 False
print(trie.starts_with("dat")) # 输出 True
5. 分布式一致性算法(如 Paxos 和 Raft)
- 场景:
- 分布式系统一致性:在分布式数据平台中,需要确保多个节点在同一个时刻对于某个数据的一致性,Paxos 和 Raft 是常用的分布式一致性算法。
- 分布式数据库管理:这些算法可以帮助多个数据库实例在数据更新时保持同步。
由于 Paxos 和 Raft 的实现比较复杂,面试中更多的是测试对这些算法的理解,而不要求实现。但可以了解它们的基本工作原理,比如:
- Paxos:通过提出者、接受者和学习者来决定某个值在一组分布式节点中的共识。
- Raft:通过领导选举、日志复制和一致性检查确保所有节点在分布式系统中的同步。
6. 堆 (Heap)
- 场景:
- 数据流中的Top-K 问题:在流处理系统中,堆用于维护流中前 K 大或者前 K 小的元素。
- 任务调度:堆可以高效管理任务队列,通过最小堆或最大堆管理任务的优先级。
- 示例:最大堆实现 Top-K 问题
import heapq
def find_top_k(nums, k):
return heapq.nlargest(k, nums)
# 测试
nums = [3, 1, 5, 12, 2, 11]
k = 3
print(f"Top {k} numbers: {find_top_k(nums, k)}") # 输出 [12, 11, 5]
7. 图的最短路径算法 (Dijkstra 和 Bellman-Ford)
- 场景:
- 分布式网络中的路径优化:用于在分布式网络中查找不同节点间的最短路径,优化数据传输路径。
- 物流或任务调度:在数据平台中用于优化任务调度的最优执行路径。
- 示例:Dijkstra 算法
import heapq
def dijkstra(graph, start):
min_heap = [(0, start)] # (distance, node)
distances = {node: float('inf') for node in graph}
distances[start] = 0
while min_heap:
current_dist, current_node = heapq.heappop(min_heap)
if current_dist > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
distance = current_dist + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(min_heap, (distance, neighbor))