mimo-v2-pro 在「实现布隆过滤器」的评测结果

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

基本信息

  • 模型名称:mimo-v2-pro
  • 用例名称:实现布隆过滤器
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

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

你是一名资深算法工程师,擅长数据结构与概率型数据结构的设计与实现。 回答要求: 1. 使用 Python 实现,代码结构清晰,包含必要的注释。 2. 在实现前简要说明所选哈希函数的原理及其优缺点(2-4 句话即可)。 3. 位数组操作必须使用 bytearray 或 bitarray 等显式位级结构,不得用普通 Python list of bool 代替。 4. 代码需包含简单的测试用例,验证 add() 和 contains() 的基本行为(包括正例和误判说明)。 5. 保持实现简洁,聚焦于核心逻辑,不需要引入复杂的工程化设计。

用户提示词(User Prompt)

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

请用 Python 实现一个基础的布隆过滤器(Bloom Filter)。 **背景说明:** 布隆过滤器是一种空间高效的概率型数据结构,用于判断一个元素「可能存在」或「一定不存在」于集合中。 它的核心原理是:通过多个哈希函数将元素映射到一个位数组的多个位置,查询时若所有对应位均为 1, 则判定元素「可能存在」(存在误判);若任意一位为 0,则元素「一定不存在」。 **实现要求:** 1. 实现 `BloomFilter` 类,构造函数签名为 `__init__(self, size: int = 1000)`, 其中 `size` 为位数组的大小(默认 1000)。 2. 实现 `add(item: str) -> None` 方法,将元素添加到过滤器中。 3. 实现 `contains(item: str) -> bool` 方法,检查元素是否可能存在于过滤器中。 4. 使用**至少 2 个相互独立**的哈希函数(不得仅用 Python 内置 `hash()` 的单次调用)。 5. 位数组必须使用 `bytearray` 实现(每个字节存储 8 位),不得使用 `list` 直接存储布尔值。 **哈希函数说明:** 在代码注释或文字说明中,简要描述你所选用的哈希方案(例如:基于 hashlib 的多种算法、 双重哈希技巧 `h(i) = h1 + i*h2`,或其他方案),并说明其优缺点。 **测试验证:** 在代码末尾编写测试,验证以下场景: - 已添加的元素调用 `contains()` 必须返回 `True`(零假阴性)。 - 未添加的元素调用 `contains()` 大概率返回 `False`(允许少量误判,需说明)。

任务要求

AI 模型需要满足以下要求:

  1. 位数组使用 bytearray 实现,通过位运算(移位、与、或)正确读写单个比特位,不得用 list of bool 替代。
  2. 至少使用 2 个独立的哈希函数,且哈希函数之间具有实质性差异(不同种子、不同算法或双重哈希),不得仅对同一哈希结果做简单加减偏移。
  3. add() 方法能将元素正确映射到位数组的多个位置并置 1;contains() 方法检查所有对应位均为 1 时才返回 True,任意一位为 0 时返回 False。
  4. 已添加的元素调用 contains() 必须始终返回 True(无假阴性),测试用例需覆盖此断言。
  5. 代码包含对哈希函数选择的简要说明,指出其优点(如分布均匀性)和局限性(如计算开销或冲突概率)。

评测结果

综合得分

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

基础难度评测结果

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

模型生成产物

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

我来实现一个基础的布隆过滤器。我将使用双重哈希技巧来生成多个哈希函数。 ```python import hashlib import math class BloomFilter: """ 布隆过滤器实现 使用双重哈希技巧生成多个哈希函数 """ def __init__(self, size: int = 1000): """ 初始化布隆过滤器 Args: size: 位数组的大小(位数) """ self.size = size # 使用 bytearray 存储位数组,每个字节8位 # 需要 ceil(size/8) 个字节 self.byte_array_size = (size + 7) // 8 self.bit_array = bytearray(self.byte_array_size) self.hash_count = 3 # 使用3个哈希函数 def _hash_functions(self, item: str): """ 使用双重哈希技巧生成多个哈希值 h_i(x) = (h1(x) + i * h2(x)) % m 原理: 1. 使用两个基础哈希函数 h1 和 h2 2. 通过线性组合生成多个哈希函数 3. 这种方法在理论上可以提供较好的独立性 优点: - 只需计算两个基础哈希,效率高 - 实现简单,不需要多个独立的哈希函数 缺点: - 生成的哈希函数之间可能存在相关性 - 理论上不如完全独立的哈希函数效果好 """ # 将字符串转换为字节 item_bytes = item.encode('utf-8') # 第一个哈希函数:MD5 h1 = int(hashlib.md5(item_bytes).hexdigest(), 16) # 第二个哈希函数:SHA1 h2 = int(hashlib.sha1(item_bytes).hexdigest(), 16) # 生成多个哈希值 for i in range(self.hash_count): # 双重哈希公式 hash_value = (h1 + i * h2) % self.size yield hash_value def _set_bit(self, position: int): """ 将指定位设置为1 Args: position: 位的位置(0-based) """ byte_index = position // 8 bit_index = position % 8 self.bit_array[byte_index] |= (1 bool: """ 获取指定位的值 Args: position: 位的位置(0-based) Returns: 该位的值(True表示1,False表示0) """ byte_index = position // 8 bit_index = position % 8 return bool(self.bit_array[byte_index] & (1 None: """ 将元素添加到布隆过滤器中 Args: item: 要添加的字符串元素 """ for position in self._hash_functions(item): self._set_bit(position) def contains(self, item: str) -> bool: """ 检查元素是否可能存在于布隆过滤器中 Args: item: 要检查的字符串元素 Returns: True: 元素可能存在(可能有误判) False: 元素一定不存在(无假阴性) """ for position in self._hash_functions(item): if not self._get_bit(position): return False return True def test_bloom_filter(): """测试布隆过滤器的基本功能""" print("=== 布隆过滤器测试 ===") # 创建一个较小的布隆过滤器用于测试 bf = BloomFilter(size=100) # 添加一些测试元素 test_items = ["apple", "banana", "orange", "grape", "melon"] for item in test_items: bf.add(item) print(f"添加: {item}") print("\n--- 测试已添加的元素(应该全部返回True) ---") for item in test_items: result = bf.contains(item) print(f"检查 '{item}': {result} (预期:...

AI 评审点评

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

【CLAUDE】候选输出整体质量较高,核心三要素(bytearray 位操作、双重哈希、add/contains 逻辑)均正确实现,代码结构清晰,注释和说明完整。与参考答案相比,主要差距在于:缺少 h2=0 的退化保护、越界检查,以及测试覆盖的边界场景略少。额外加分项是主动计算并输出了理论误判率公式,体现了对布隆过滤器原理的深入理解。 【GEMINI】模型高质量地完成了布隆过滤器的实现。代码结构严谨,位操作逻辑准确,哈希函数设计符合概率型数据结构的理论要求,测试用例充分验证了核心特性。文档说明详尽,完全满足题目设定的各项约束。 【KIMI】该实现是一个高质量的布隆过滤器,完整满足了核心要求:正确使用 bytearray 进行位级操作,采用双重哈希技巧生成多个哈希函数,add() 和 contains() 方法功能正确,测试覆盖了零假阴性验证和误判说明。代码结构清晰,注释充分,哈希方案说明完整。主要改进空间:可考虑对 h2 添加非零保护以增强哈希独立性,以及增加边界情况测试。

进阶难度评测结果

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

模型生成产物

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

```python import math import hashlib from typing import Iterable, Union from bitarray import bitarray class BloomFilter: """ 可配置的布隆过滤器实现,基于数学原理自动推导最优参数。 布隆过滤器是一种空间效率很高的概率数据结构,用于判断元素是否属于一个集合。 可能存在误判(false positive),但不会漏判(false negative)。 """ def __init__(self, n: int, p: float): """ 初始化布隆过滤器,根据预期元素数量和期望误判率计算最优参数。 参数: n (int): 预期要插入的元素数量,必须为正整数 p (float): 期望的误判率,必须在(0, 1)范围内 异常: ValueError: 当参数不满足条件时抛出 """ # 参数校验 if not isinstance(n, int) or n list: """ 使用双重哈希技术生成k个哈希值。 哈希算法: 使用MurmurHash3作为基础哈希函数,通过双重哈希生成多个哈希值。 优点: - 计算速度快 - 分布均匀 - 冲突率低 缺点: - 不是加密哈希函数,不适合安全场景 - 需要第三方库mmh3(这里使用hashlib模拟) 参数: item: 要哈希的元素,支持字符串和数字类型 返回: list: 包含k个哈希值的列表,每个值在[0, m)范围内 """ # 将元素转换为字节串 if isinstance(item, int): item_bytes = item.to_bytes((item.bit_length() + 7) // 8, byteorder='big') else: item_bytes = str(item).encode('utf-8') # 使用双重哈希: hash_i(x) = (hash1(x) + i * hash2(x)) % m # 这里使用两个不同的哈希函数作为hash1和hash2 hash1 = int.from_bytes(hashlib.sha256(item_bytes).digest()[:4], 'big') hash2 = int.from_bytes(hashlib.md5(item_bytes).digest()[:4], 'big') hashes = [] for i in range(self.k): hash_val = (hash1 + i * hash2) % self.m hashes.append(hash_val) return hashes def add(self, item: Union[str, int]) -> None: """ 将单个元素添加到布隆过滤器中。 参数: item: 要添加的元素,支持字符串和数字类型 """ hashes = self._hash_functions(item) for pos in hashes: if not self.bit_array[pos]: self.bit_array[pos] = 1 self.bits_set += 1 self.n_inserted += 1 def add_batch(self, items: Iterable) -> None: """ 批量添加元素到布隆过滤器中。 参数: items: 可迭代的元素集合,每个元素支持字符串和数字类型 """ for item in items: self.add(item) def contains(self, item: Union[str, int]) -> bool: """ 检查元素是否可能存在于布隆过滤器中。 参数: item: 要检查的元素,支持字符串和数字类型 返回: bool: True表示元素可能存在,False表示元素一定不存在 """ hashes = self._hash_functions(item) for pos in hashes: if not self.bit_array[pos]: return False return True def approximate_element_count(self) -> int: """ 根据当前置位数量估算已插入的元素数量。 公式: n_estimated = -m / k * ln(1 - X/m) 其中X为当前置1的位数 返回: int: 估算的已插入元素数量 """ if self.bits_set == 0: return 0 # 防止除零错误和对数为负的情况 ratio =...

AI 评审点评

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

【CLAUDE】整体实现质量较高,结构清晰,文档完整,数学公式说明详尽。代码可读性好,变量命名与数学符号一致。主要缺陷集中在整数 0 的边界处理 bug 和哈希函数选择与注释不一致(声称 MurmurHash3 但实际用 SHA-256+MD5),以及双重哈希 hash2=0 的退化场景未防护。这些问题在生产环境中可能引发隐患,但对于算法演示和教学用途已足够完善。 【GEMINI】该模型出色地完成了布隆过滤器的实现任务。代码结构严谨,数学原理说明详尽,且严格遵循了系统提示中的各项工程实践要求。代码可读性高,边界条件处理完善,是一个高质量的算法实现示例。 【KIMI】该实现整体结构清晰,文档完善,数学公式实现基本正确,是一个合格的布隆过滤器实现。主要问题在于:(1) 哈希算法选择与注释描述不符,且SHA-256/MD5组合性能较差;(2) bits_set计数逻辑缺陷影响估算准确性;(3) 依赖外部库bitarray影响可移植性。建议改用标准库实现位数组(如array模块或整数位运算),修正哈希算法描述或改用更轻量的哈希(如FNV-1a),并完善重复添加场景下的计数逻辑。

困难难度评测结果

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

模型生成产物

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

我来实现一个完整的高级布隆过滤器系统。由于代码较长,我将分模块实现: ```python import math import threading import time import pickle import hashlib import struct from typing import List, Tuple, Optional, Callable, Dict, Any from dataclasses import dataclass from concurrent.futures import ThreadPoolExecutor import random # ==================== 哈希函数工具 ==================== class HashFunction: """双重哈希策略实现类""" @staticmethod def double_hash(key: str, seed: int) -> int: """ 使用 MurmurHash3 作为基础哈希函数 选择理由: 1. 分布均匀性好,冲突率低 2. 计算速度快,适合大数据量场景 3. 对字符串处理友好 """ # 使用 hashlib 作为后备方案,实际生产环境建议使用 mmh3 h = hashlib.md5((str(seed) + key).encode()).digest() return int.from_bytes(h[:8], byteorder='little', signed=False) @staticmethod def create_hash_functions(k: int, m: int) -> List[Callable[[str], int]]: """ 创建 k 个哈希函数,使用双重哈希策略 h_i(x) = (h1(x) + i * h2(x)) % m """ def hash_func_factory(i: int): def hash_func(key: str) -> int: h1 = HashFunction.double_hash(key, seed=0) h2 = HashFunction.double_hash(key, seed=1) return (h1 + i * h2) % m return hash_func return [hash_func_factory(i) for i in range(k)] # ==================== 标准布隆过滤器 ==================== class StandardBloomFilter: """标准布隆过滤器实现""" def __init__(self, capacity: int, error_rate: float = 0.01, hash_func: Optional[Callable] = None): """ 初始化布隆过滤器 参数: capacity: 预期元素数量 error_rate: 期望的误判率 hash_func: 自定义哈希函数 最优参数计算公式来源: m = -n * ln(p) / (ln2)^2 k = (m/n) * ln2 其中 n=capacity, p=error_rate """ if capacity None: """添加元素到布隆过滤器""" if not item: raise ValueError("Cannot add empty item") for hash_func in self.hash_functions: index = hash_func(item) self.bit_array[index] = 1 self._item_count += 1 def contains(self, item: str) -> bool: """检查元素是否可能存在""" if not item: return False for hash_func in self.hash_functions: index = hash_func(item) if not self.bit_array[index]: return False return True def union(self, other: 'StandardBloomFilter') -> 'StandardBloomFilter': """ 计算两个布隆过滤器的并集 要求:两个过滤器必须具有相同的 m 和 k """ if self.m != other.m or self.k != other.k: raise ValueError("Bloom filters...

AI 评审点评

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

【GEMINI】这是一个高质量的实现。模型展示了深厚的算法功底和工程经验,特别是在处理并发安全时的分段锁和死锁预防逻辑非常专业。虽然在双重哈希的闭包实现上存在重复计算的性能小瑕疵,但整体功能完整性、代码鲁棒性以及对高级特性的理解均达到了优秀水平。 【KIMI】整体上,该实现提供了完整的高级布隆过滤器功能,包括计数布隆过滤器、可扩展过滤器和并发安全过滤器。代码结构清晰,模块化程度高,边界条件处理得当。测试示例全面,有效验证了实现的正确性。在算法正确性、工程完整性和高级特性逻辑方面都表现出色,满足了所有要求。

相关链接

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

加载中...