kimi-k2.6 在「实现哈夫曼编码压缩」的评测结果
这是该 AI 模型在此测试用例上的详细评测结果。
基本信息
- 模型名称:kimi-k2.6
- 用例名称:实现哈夫曼编码压缩
- 测试类型:文本生成
- 评测维度:代码生成
系统提示词(System Prompt)
这是给 AI 模型的背景设定和角色指令:
你是一名资深算法工程师,专注于数据结构与经典压缩算法领域。 回答要求: 1. 使用清晰、规范的代码实现哈夫曼编码核心逻辑,语言不限(Python/Java/C++ 均可) 2. 代码需包含必要的注释,解释关键步骤(频率统计、堆操作、树遍历) 3. 输出格式须包含:代码实现 + 示例运行结果 + 简要算法说明 4. 严格检查哈夫曼树构建的贪心策略是否正确(每次合并频率最小的两个节点) 5. 对边界情况(空字符串、单字符字符串)需有明确处理 6. 确保生成的编码满足前缀码性质(任意编码不是另一编码的前缀)
用户提示词(User Prompt)
这是用户给 AI 模型的具体任务要求:
请实现一个简单的哈夫曼编码器,完成以下功能: **核心任务:** 给定一个输入字符串,构建哈夫曼树并输出每个字符对应的哈夫曼编码。 **具体要求:** 1. 统计输入字符串中每个字符出现的频率 2. 使用最小堆(优先队列)构建哈夫曼树:每次取出频率最小的两个节点合并 3. 递归遍历哈夫曼树,生成每个字符的二进制编码(左分支为 '0',右分支为 '1') 4. 按字符频率从高到低(或字典序)打印编码表 **边界处理:** - 若输入为空字符串,输出提示信息并退出 - 若输入只有一种字符,该字符编码设为 '0' **示例:**
评测结果
综合得分
该模型在此用例的得分为:91.8 分(满分 100 分),已通过
基础难度评测结果
- 得分:91.8 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
以下是用 **Python** 实现的完整哈夫曼编码器。代码利用标准库 `heapq` 实现最小堆,严格遵循“每次合并频率最小两个节点”的贪心策略,并妥善处理了空串与单字符两种边界情况。 --- ### 1. 代码实现 ```python import heapq from collections import Counter class HuffmanNode: """哈夫曼树节点""" def __init__(self, char, freq): self.char = char # 字符;内部节点为 None self.freq = freq # 出现频率 self.left = None self.right = None def build_huffman_tree(text): """ 构建哈夫曼树。 返回: (root_node, freq_dict)。若为空串返回 (None, {})。 """ if not text: return None, {} # 1. 统计每个字符的频率 freq_map = Counter(text) # 边界情况:只有一种字符,无需建树 if len(freq_map) == 1: return None, freq_map # 2. 将叶子节点放入最小堆 # 元组格式: (频率, 自增序号, 节点) # 自增序号用于在频率相同时打破平局,避免直接比较对象 heap = [] counter = 0 for ch, fq in freq_map.items(): heapq.heappush(heap, (fq, counter, HuffmanNode(ch, fq))) counter += 1 # 3. 贪心策略:每次取出频率最小的两个节点合并 while len(heap) > 1: f1, c1, left = heapq.heappop(heap) # 最小 f2, c2, right = heapq.heappop(heap) # 次小 merged = HuffmanNode(None, f1 + f2) merged.left = left merged.right = right heapq.heappush(heap, (f1 + f2, counter, merged)) counter += 1 root = heap[0][2] return root, freq_map def generate_codes(root, prefix, code_map): """ 递归遍历哈夫曼树,生成编码。 左分支标记为 '0',右分支标记为 '1'。 """ if root is None: return # 到达叶子节点(字符节点) if root.char is not None: # 单字符已在调用前处理,这里 prefix 不可能为空; # 保留 fallback '0' 以防万一 code_map[root.char] = prefix if prefix else '0' return # 向左走加 '0',向右走加 '1' generate_codes(root.left, prefix + '0', code_map) generate_codes(root.right, prefix + '1', code_map) def huffman_encoder(text): """主入口:构建编码表并按频率降序打印""" if not text: print("[提示] 输入为空字符串,无需编码。") return root, freq_map = build_huffman_tree(text) code_map = {} # 边界:单字符,编码直接设为 "0" if len(freq_map) == 1: only_char = next(iter(freq_map)) code_map[only_char] = '0' else: generate_codes(root, '', code_map) # 按频率降序打印;频率相同则按字符字典序升序 sorted_items = sorted(freq_map.items(), key=lambda x: (-x[1], x[0])) print(f"输入字符串: {repr(text)}") print(f"字符种类数: {len(freq_map)}") print("\n哈夫曼编码表(按频率降序):") print("-" * 36) print(f"{'字符': **说明**:示例 1 中,字符 `'c'` 频率最高(3),被安排在离根最近的叶子,编码为...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】这是一个高质量的哈夫曼编码实现。算法逻辑严谨,完全符合哈夫曼编码的贪心策略和前缀码性质要求。代码结构清晰,注释详尽,边界情况处理完善。示例运行结果准确验证了算法正确性,输出格式规范易读。复杂度分析和算法说明表格进一步增强了答案的专业性。主要扣分点在于代码中出现的 HTML 实体转义(> <)影响了代码的直接可运行性,这在实际工程场景中需要修正。整体而言,该实现完全满足评测要求,展现了扎实的算法功底和良好的工程实践。 【GEMINI】这是一份非常优秀的哈夫曼编码实现。AI 准确理解了贪心算法的核心,并在代码健壮性(如堆冲突处理)和边界处理(单字符编码为'0')上表现出色。虽然漏掉了任务描述中提到的‘解码’功能,但其编码逻辑的完整性和代码规范性足以证明其专业水准。 【KIMI】整体来看,这段代码实现了哈夫曼编码算法的核心功能,包括构建哈夫曼树、生成编码表,并正确处理了边界情况。代码结构清晰,关键步骤有注释,输出格式规范。但在一些细节处理上还有优化空间,如单字符编码的处理、未使用变量的清理等。总体来说,这是一段高质量的哈夫曼编码算法实现。
进阶难度评测结果
- 得分:92.3 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
下面给出**完整、可直接运行**的 Huffman 编解码系统实现。代码严格遵循模块化设计,覆盖了空串、单字符、等频字符等全部边界情况,并保证 **Round-trip correctness**(编码后再解码 100% 还原原文)。 ```python import heapq from collections import Counter # ============================================================================== # 数据结构:哈夫曼树节点 # ============================================================================== class HuffmanNode: """哈夫曼树节点。char 为 None 表示内部节点,否则为叶节点(携带字符)。""" def __init__(self, char, freq, left=None, right=None): self.char = char # 字符(内部节点为 None) self.freq = freq # 权重(出现频率) self.left = left # 左子树(对应编码 0) self.right = right # 右子树(对应编码 1) def __lt__(self, other): """ 最小堆比较器。频率小的优先; 频率相同则按“字符 > 内部节点 > id”稳定排序,确保构建过程确定可复现。 """ if self.freq != other.freq: return self.freq '0'/'1' 字符串 # ========================================================================== # 模块 1:字符频率统计 # ========================================================================== def _build_freq_table(self, text): """统计输入字符串中每个字符的出现频率,返回 Counter 字典。""" if not text: return {} return Counter(text) # ========================================================================== # 模块 2:哈夫曼树构建(最小堆贪心合并) # ========================================================================== def _build_tree(self, freq_table): """ 使用最小堆(优先队列)构建哈夫曼树。 边界情况: - 空串:root 置为 None。 - 单一字符:构造一个“根 -> 左叶子”的二级树,强制编码为 '0', 以便解码器能够按位识别字符边界。 """ if not freq_table: self.root = None return # 单字符边界:强制编码 "0" if len(freq_table) == 1: char = next(iter(freq_table)) self.root = HuffmanNode( None, freq_table[char], left=HuffmanNode(char, freq_table[char]) ) return # 初始化最小堆 heap = [HuffmanNode(ch, f) for ch, f 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, left, right) heapq.heappush(heap, merged) self.root = heap[0] # ========================================================================== # 模块 3:编码表生成(递归遍历生成前缀码) #...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】该实现是一个高质量的哈夫曼编解码系统,五个功能模块完整实现,边界情况覆盖全面,端到端正确性有保障。代码结构清晰,注释详尽,设计决策合理(如单字符二级树处理、比较器稳定性、填充位管理)。主要问题是候选输出中存在HTML实体转义字符(`<`、`>`),导致代码无法直接复制运行,需手动替换,这是一个实际可用性缺陷。整体而言是一个接近满分的实现,综合得分较高。 【GEMINI】这是一个非常优秀的哈夫曼编码实现。AI 不仅完成了基础的算法逻辑,还深入考虑了实际压缩系统中的细节问题,如字节对齐的处理和单字符编码的特殊逻辑。代码健壮性极高,测试用例详尽,完全符合资深算法工程师的角色设定。 【KIMI】整体而言,代码实现了一个完整的哈夫曼编码压缩与解压系统,覆盖了所有要求的功能模块,并且通过了边界情况的测试。代码结构清晰,注释充分,易于理解和维护。尽管在某些实现细节上还有优化空间,但总体上是一个高质量的实现。
困难难度评测结果
- 得分:91.4 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ huffman_compress.py =================== 工程级哈夫曼文件压缩/解压工具。 特性 ---- - 支持任意二进制文件(文本、图片、PDF、可执行文件等)。 - 两遍扫描流式压缩:第一遍统计频率,第二遍编码输出;块大小 64KB,避免 OOM。 - 真正的位级 I/O:通过位移/掩码将编码写入字节流,而非字符串拼接。 - 自包含文件格式:头部携带魔数、版本、原始文件长度、树结构长度、填充位数及 序列化哈夫曼树,可独立解压。 - 边界情况处理:空文件、单字节文件、已压缩文件均有明确分支与异常提示。 文件格式(头部 → 数据) ----------------------- | 字段 | 大小 | 说明 | |----------------|----------|-------------------------------| | Magic | 4 bytes | b'HUFF' | | Version | 1 byte | 0x01 | | Flags | 1 byte | 预留 | | Original Size | 8 bytes | uint64 BE,原始文件精确字节数 | | Tree Size | 4 bytes | uint32 BE,序列化树的字节数 | | Padding Bits | 1 byte | 0-7,末尾补零位数 | | Tree Data | 变长 | 前序遍历序列化的哈夫曼树 | | Compressed Data| 变长 | 位紧密排列的哈夫曼编码 | 设计决策说明 ------------ 1. **两遍扫描**:哈夫曼编码需要全局频率分布,因此必须预先统计。对超大文件 采用 64KB chunk 读取,确保内存占用为 O(1)(相对文件大小)。 2. **位写入器 (BitWriter)**:内部维护 8-bit 缓冲区和计数器,满 8 位立即 `write` 到底层文件对象,避免逐字节系统调用带来的巨大开销;flush 时左移 补零,返回实际填充位数供头部记录。 3. **单字节优化**:若文件中仅出现一种字节,树根即为叶子节点,编码长度记为 0。 此时压缩数据区为空,解压时直接按 Original Size 重复输出该字节,无需读取 任何数据位,也避免了“仅有一种符号时哈夫曼编码为空串”的歧义问题。 4. **精确截断**:解压时严格依据头部记录的 Original Size 停止输出,因此即使 最后一个字节包含填充位,也不会被误解码,保证无损。 """ import heapq import os import struct from collections import Counter from typing import Dict, Tuple, Optional, BinaryIO # ---------------------------------------------------------------------- # 常量 # ---------------------------------------------------------------------- CHUNK_SIZE = 64 * 1024 # 64KB 流式块大小 MAGIC = b'HUFF' # 魔数 VERSION = 1 # 文件格式版本 # 头部布局(大端序,共 19 bytes) # 4s: magic, B: version, B: flags, Q: original_size, I: tree_size, B: padding HEADER_FMT = '>4sBBQIB' HEADER_FIXED_SIZE = struct.calcsize(HEADER_FMT) # 头部各字段偏移 _OFF_MAGIC = slice(0, 4) _OFF_VERSION = 4 _OFF_FLAGS = 5 _OFF_ORIG_SIZE = 6 _OFF_TREE_SIZE = 14 _OFF_PADDING = 18 # ---------------------------------------------------------------------- # 数据结构:哈夫曼树节点 # ---------------------------------------------------------------------- class HuffmanNode: """哈夫曼树节点,支持堆排序与序列化。"""...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】这是一个工程级的哈夫曼压缩工具实现,代码质量极高。算法实现完全正确,真正实现了位级二进制操作而非字符串拼接;流式处理和两遍扫描设计合理,有效避免内存溢出;文件格式自包含且可扩展;边界情况处理全面;代码结构清晰,注释详尽,包含设计决策说明和测试思路。整体达到生产级代码标准,完全满足任务要求的所有技术指标。 【GEMINI】这是一个教科书级别的哈夫曼压缩工具实现。不仅完全符合所有技术约束(位操作、流式 I/O、二进制安全),而且在处理单字符文件和填充位截断等细节上表现出了深厚的算法功底。代码注释详尽,设计决策透明,具备极高的实用价值和参考价值。 【KIMI】总体而言,这段代码实现了哈夫曼压缩的核心功能,满足大部分工程要求。代码结构清晰,关键步骤有注释说明。在正确性、工程质量方面表现较好,功能完整性方面略有欠缺。建议后续在异常处理、单元测试、代码注释等方面进一步完善,提高代码的健壮性和易用性。
相关链接
您可以通过以下链接查看更多相关内容: