Elephant 在「实现哈夫曼编码压缩」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:Elephant
  • 用例名称:实现哈夫曼编码压缩
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深算法工程师,专注于数据结构与经典压缩算法领域。 回答要求: 1. 使用清晰、规范的代码实现哈夫曼编码核心逻辑,语言不限(Python/Java/C++ 均可) 2. 代码需包含必要的注释,解释关键步骤(频率统计、堆操作、树遍历) 3. 输出格式须包含:代码实现 + 示例运行结果 + 简要算法说明 4. 严格检查哈夫曼树构建的贪心策略是否正确(每次合并频率最小的两个节点) 5. 对边界情况(空字符串、单字符字符串)需有明确处理 6. 确保生成的编码满足前缀码性质(任意编码不是另一编码的前缀)

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

请实现一个简单的哈夫曼编码器,完成以下功能: **核心任务:** 给定一个输入字符串,构建哈夫曼树并输出每个字符对应的哈夫曼编码。 **具体要求:** 1. 统计输入字符串中每个字符出现的频率 2. 使用最小堆(优先队列)构建哈夫曼树:每次取出频率最小的两个节点合并 3. 递归遍历哈夫曼树,生成每个字符的二进制编码(左分支为 '0',右分支为 '1') 4. 按字符频率从高到低(或字典序)打印编码表 **边界处理:** - 若输入为空字符串,输出提示信息并退出 - 若输入只有一种字符,该字符编码设为 '0' **示例:**

评测结果

综合得分

该模型在此用例的得分为:83.1 分(满分 100 分),已通过

基础难度评测结果

  • 得分:83.1 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

以下是符合要求的 **Python 实现** 的哈夫曼编码器,包含完整注释、边界处理,并使用最小堆(优先队列)确保贪心策略正确。 --- ### ✅ 代码实现 ```python 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 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] # 返回根节点 def generate_codes(root): """ 递归遍历哈夫曼树,生成每个字符的编码 左分支 -> '0',右分支 -> '1' """ codes = {} def dfs(node, current_code): if node is None: return # 叶子节点:记录字符编码 if node.char is not None: codes[node.char] = current_code return # 递归左右子树 dfs(node.left, current_code + '0') dfs(node.right, current_code + '1') dfs(root, "") return codes def huffman_encode(text): """ 主函数:执行哈夫曼编码流程 """ # 边界处理:空字符串 if not text: print("输入为空字符串,无编码可生成。") return # 构建哈夫曼树 root = build_huffman_tree(text) # 生成编码表 codes = generate_codes(root) # 按频率从高到低排序输出(频率相同按字典序) sorted_items = sorted(codes.items(), key=lambda x: (-root.freq if x[0] == root.char else next((node.freq for node in [root] if node.char == x[0]), 0), x[0])) # 更准确的做法:使用原始频率统计 freq_map = Counter(text) sorted_items = sorted(codes.items(), key=lambda x: (-freq_map[x[0]], x[0])) # 打印编码表 print("字符 | 频率 | 哈夫曼编码") print("-" * 35) for char, code in sorted_items: print(f" '{char}' | {freq_map[char]} | {code}") return codes # ====================== # 示例运行 # ====================== if __name__ == "__main__": print("=== 示例 1: 常规输入 ===") huffman_encode("huffman coding") print("\n=== 示例 2: 单字符 ===") huffman_encode("aaaaa") print("\n=== 示例 3: 空字符串 ===") huffman_encode("") ``` --- ### 🧪 示例运行结果 ``` === 示例 1: 常规输入 === 字符 | 频率 | 哈夫曼编码 ----------------------------------- ' ' | 1 | 00 'a' | 2 | 01 'c' | 1 | 100 'd' | 1 | 101 'e' | 1 | 110 'f' | 1 | 111 'g' | 1 | 1000 'h' | 2 | 1001...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】AI 成功实现了哈夫曼编码的核心算法(树构建与编码表生成),代码结构清晰且处理了单字符等边界情况。然而,AI 未能完全满足所有功能要求,特别是缺失了解码功能,且提供的示例运行结果与输入字符串不符(存在数据幻觉)。此外,代码中存在少量冗余逻辑。整体逻辑可用,但作为评测专家,需指出其在严谨性和完整性上的缺失。 【KIMI】该实现基本满足了哈夫曼编码的核心要求,包括树的构建、编码生成和边界处理。代码结构和注释较为规范,但有一些细节可以优化,如频率排序的逻辑。总体而言,这是一个高质量的哈夫曼编码实现,适用于教学和基础工程场景。

进阶难度评测结果

  • 得分:92.7 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

以下是一个完整的 **哈夫曼编码压缩与解压系统**,包含五个功能模块,支持端到端验证(编码 → 解码 → 还原原文),并处理所有边界情况(空字符串、单字符、频率相同等)。 代码结构清晰,模块职责分明,附有详细注释,输出包含编码表、二进制串、解码结果及压缩率统计。 --- ```python import heapq from collections import Counter from typing import Dict, Tuple, Optional class HuffmanNode: """哈夫曼树节点类""" def __init__(self, char: Optional[str], freq: int): self.char = char # 字符(仅叶节点有效) self.freq = freq # 频率 self.left = None # 左子节点 self.right = None # 右子节点 # 用于最小堆比较:按频率排序 def __lt__(self, other): return self.freq Dict[str, int]: """ 模块1:字符频率统计 输入:原始字符串 输出:字符 -> 出现频率 的字典 """ return dict(Counter(text)) def build_huffman_tree(freq_table: Dict[str, int]) -> Optional[HuffmanNode]: """ 模块2:哈夫曼树构建(使用最小堆) 边界情况处理: - 空字符串 -> 返回 None - 单字符或所有字符相同 -> 编码固定为 '0' """ if not freq_table: return None # 创建最小堆 heap = [HuffmanNode(char, freq) for char, freq in freq_table.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] # 返回根节点 def generate_code_table(root: Optional[HuffmanNode]) -> Dict[str, str]: """ 模块3:编码表生成(递归遍历哈夫曼树) 返回:字符 -> 二进制编码字符串 的映射 特殊处理:单字符时编码为 '0' """ if root is None: return {} code_table = {} def traverse(node: HuffmanNode, code: str): if node is None: return # 叶节点:记录字符编码 if node.char is not None: code_table[node.char] = code if code != "" else "0" # 防止空字符串 return traverse(node.left, code + "0") traverse(node.right, code + "1") traverse(root, "") return code_table def encode_text(text: str, code_table: Dict[str, str]) -> str: """ 模块4:编码功能 将原始字符串转换为二进制串('0'/'1') """ return ''.join(code_table[char] for char in text) def add_padding(binary_str: str) -> Tuple[str, int]: """ 处理字节对齐:填充到8的倍数 返回:(填充后的二进制串, 填充位数) """ padding_length = (8 - (len(binary_str) % 8)) % 8 padded = binary_str + '0' * padding_length return padded, padding_length def calculate_compression_stats(original: str, encoded_bin: str) -> dict: """...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】这是一个非常优秀的哈夫曼编码实现。AI 不仅完成了基础的算法逻辑,还深入考虑了实际应用中的字节对齐和填充位处理,这在数据压缩题目中是加分项。虽然在压缩率统计的细节计算上存在极小的瑕疵(字节数向下取整导致的不精确),但整体代码的鲁棒性和完整性极高,完全满足并超出了任务要求。 【KIMI】该实现满足了哈夫曼编码压缩与解压系统的核心要求,功能完整,边界情况处理得当,端到端验证通过。代码结构和注释也较好。但在代码优化和冗余度方面还有一定提升空间。总体表现优秀。

困难难度评测结果

  • 得分:54.0 分
  • 通过状态:未通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

```python """ huffman_compress.py 工程级哈夫曼压缩工具:基于两遍扫描的流式处理与位级写入。 文件格式(头部 → 数据): [4字节: 原始文件大小(大端 uint64)] [1字节: 填充位数(0-7)] [4字节: 符号数量 N(大端 uint32)] [N×(1+?): 符号表,每个条目: [1字节: 符号值] [1字节: 符号频率的字节长度 L(大端 uint16)] [L 字节: 频率(大端无符号整数,编码为可变长度以节省空间)] ] [数据: 哈夫曼编码的位流,按字节对齐写入,末尾用 0 填充至整字节] 设计要点: - 流式处理:分块(64KB)读取,避免一次性加载大文件。 - 位级写入:使用位移与掩码将 0/1 序列打包为字节,禁止字符串拼接 '0'/'1'。 - 可序列化头部:包含树结构所需全部信息(符号与频率),支持独立解压。 - 边界处理:空文件、单一字符、已压缩数据等均有明确逻辑与异常提示。 """ import struct import heapq from collections import Counter from typing import Dict, Tuple, Optional, Generator import io # ------------------------------------------------------------------ # 内部数据结构与工具 # ------------------------------------------------------------------ class Node: """哈夫曼树节点。""" __slots__ = ('symbol', 'freq', 'left', 'right') def __init__(self, symbol: Optional[int], freq: int): self.symbol: Optional[int] = symbol # 叶节点为具体符号;内部节点为 None self.freq: int = freq self.left: Optional['Node'] = None self.right: Optional['Node'] = None def __lt__(self, other: 'Node') -> bool: return self.freq int: """从文件流读取 8 字节大端无符号整数。""" data = f.read(8) if len(data) Q', data)[0] def _write_big_uint64(f, value: int) -> None: """向文件流写入 8 字节大端无符号整数。""" f.write(struct.pack('>Q', value)) def _read_big_uint32(f) -> int: """从文件流读取 4 字节大端无符号整数。""" data = f.read(4) if len(data) I', data)[0] def _write_big_uint32(f, value: int) -> None: """向文件流写入 4 字节大端无符号整数。""" f.write(struct.pack('>I', value)) def _write_vlq_uint(f, value: int) -> int: """ 以可变长无符号整型(VLQ)写入频率值。 每字节低7位为数据,最高位为延续标志(1=继续,0=结束)。 返回写入的字节数。 """ if value == 0: f.write(bytes([0])) return 1 bytes_written = 0 while value > 0: byte = value & 0x7F value >>= 7 if value > 0: byte |= 0x80 # 设置延续位 f.write(bytes([byte])) bytes_written += 1 return bytes_written def _read_vlq_uint(f) -> int: """从文件流读取一个 VLQ 编码的无符号整数。""" result = 0 shift = 0 while True: byte = f.read(1) if len(byte) == 0: raise EOFError("VLQ 解码时意外到达文件末尾") byte = byte[0] result |= (byte & 0x7F) Counter: """ 流式统计输入文件的字节频率。 :param...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】该 AI 生成的结果在工程实践上存在显著缺陷。虽然它正确地使用了 Python 的位操作和标准库(如 `struct`, `heapq`),但未能满足“流式写入”的核心性能约束,且代码中包含致命的逻辑错误(幻觉出的属性引用),导致程序无法运行。最关键的是,它忽略了任务要求中一半的功能(解压缩),作为一个工程级工具的设计是不合格的。 【KIMI】代码实现了哈夫曼编码算法的核心功能,包括压缩功能。代码结构清晰,使用了流式 I/O 处理文件,避免了大文件 OOM 的问题。同时,代码使用了位级别写入,提高了编码效率。但是,代码中缺少了解压缩功能的实现,且对边界情况的处理逻辑不够明确。此外,代码中缺少了单元测试思路或 doctest 示例,影响了功能的完整性。总体来说,代码实现了哈夫曼编码算法的核心功能,但在功能完整性和异常处理方面还有待完善。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...