add python code
This commit is contained in:
@@ -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)} 个活动")
|
||||
@@ -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} 枚")
|
||||
Reference in New Issue
Block a user