add python code

This commit is contained in:
2026-06-16 09:35:51 +08:00
parent daecbf4603
commit daf9e50938
17 changed files with 763 additions and 19 deletions
+64
View File
@@ -0,0 +1,64 @@
"""
Huffman 编码 — 贪心算法
构建最优前缀码实现数据压缩
"""
import heapq
from collections import Counter
class HuffmanNode:
def __init__(self, char, freq):
self.char = char
self.freq = freq
self.left = None
self.right = None
def __lt__(self, other):
return self.freq < other.freq
def build_huffman_tree(text):
"""构建 Huffman 树"""
freq = Counter(text)
heap = [HuffmanNode(char, f) for char, f in freq.items()]
heapq.heapify(heap)
while len(heap) > 1:
left = heapq.heappop(heap)
right = heapq.heappop(heap)
merged = HuffmanNode(None, left.freq + right.freq)
merged.left = left
merged.right = right
heapq.heappush(heap, merged)
return heap[0] if heap else None
def generate_codes(node, prefix="", code_map=None):
"""从 Huffman 树生成编码"""
if code_map is None:
code_map = {}
if node is None:
return code_map
if node.char is not None:
code_map[node.char] = prefix or "0"
else:
generate_codes(node.left, prefix + "0", code_map)
generate_codes(node.right, prefix + "1", code_map)
return code_map
if __name__ == "__main__":
text = "ABRACADABRA"
print(f"原文: {text}")
root = build_huffman_tree(text)
codes = generate_codes(root)
print("\nHuffman 编码:")
for char, code in sorted(codes.items()):
print(f" '{char}': {code}")
encoded = "".join(codes[c] for c in text)
print(f"\n编码结果: {encoded}")
print(f"原始大小: {len(text) * 8} bits")
print(f"压缩大小: {len(encoded)} bits")
@@ -0,0 +1,30 @@
"""
活动选择问题 — 贪心算法
选择最多的不重叠活动
"""
def activity_selection(start, finish):
"""贪心选择最早结束的活动"""
n = len(start)
# 按结束时间排序
activities = sorted(zip(start, finish), key=lambda x: x[1])
selected = [activities[0]]
last_finish = activities[0][1]
for i in range(1, n):
if activities[i][0] >= last_finish:
selected.append(activities[i])
last_finish = activities[i][1]
return selected
if __name__ == "__main__":
start = [1, 3, 0, 5, 8, 5]
finish = [2, 4, 6, 7, 9, 9]
result = activity_selection(start, finish)
print("选择的活动 (开始, 结束):")
for s, f in result:
print(f" [{s}, {f})")
print(f"{len(result)} 个活动")
+42
View File
@@ -0,0 +1,42 @@
"""
找零问题 — 贪心算法
使用最少硬币凑出指定金额
"""
def min_coins_greedy(coins, amount):
"""贪心找零(硬币面额需满足贪心选择性质)"""
coins_sorted = sorted(coins, reverse=True)
result = []
remaining = amount
for coin in coins_sorted:
while remaining >= coin:
result.append(coin)
remaining -= coin
return result
def min_coins_dp(coins, amount):
"""动态规划找零(通用解法)"""
MAX = float('inf')
dp = [MAX] * (amount + 1)
dp[0] = 0
for i in range(1, amount + 1):
for coin in coins:
if i >= coin:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != MAX else -1
if __name__ == "__main__":
coins = [1, 5, 10, 25]
amount = 63
greedy_result = min_coins_greedy(coins, amount)
dp_result = min_coins_dp(coins, amount)
print(f"硬币面额: {coins}")
print(f"需要凑出: {amount}")
print(f"贪心结果: {greedy_result} (共 {len(greedy_result)} 枚)")
print(f"DP最少数量: {dp_result}")