🧾 一、类结构概览
1️⃣ MenuItem 类
- 表示食物或饮品条目。
- 属性:
name:名称(字符串)rating:评分(1–10 的整数或浮点数)
- 实现了排序逻辑(
__lt__、__eq__),保证: - 评分高的排前;
- 评分相同时按名字字典序(字母顺序)升序。
伪代码:
2️⃣ Restaurant 类
- 表示注册到 FoodFlight 的餐厅。
- 属性:
name:餐厅名称(唯一)block_number:所在区块编号(唯一)menu:餐厅菜单(ArrayR 存储)
- 初始化时:
- 先对
initial_menu按评分降序、字典序升序排序; - 使用
mergesort排序算法实现。
伪代码:
3️⃣ FoodFlight 类
- 主系统类,管理所有餐厅与菜单操作。
- 使用
HashTableSeperateChaining存储餐厅信息(key 为餐厅名)。
🍽️ 二、主要功能模块
① add_restaurant() — 添加餐厅
- 将餐厅对象插入
HashTable。
- 名称唯一,不重复添加。
- 复杂度:
O(log R + len(name))
伪代码:
② get_menu() — 获取菜单
- 根据餐厅名返回菜单(评分降序)。
- 若名称不存在 → 抛出 KeyError。
- 复杂度:
O(len(name))
伪代码:
③ add_to_menu() — 增加菜单项
- 新菜单项先排序(评分降序 + 名称字典序)。
- 然后与原菜单合并(保持降序有序)。
- 使用归并(
merge)方法实现。
伪代码:
④ meal_suggestions() — 推荐菜品
- 输入:
- 用户所在区块号
user_block_number - 最大步行距离
max_walk
- 步骤:
- 遍历所有餐厅;
- 筛选出在可步行范围内的餐厅;
- 将各餐厅菜单加入数组;
- 使用 最大堆(Max Heap) 实现 K 路归并;
- 依次产出评分最高的菜品。
伪代码:
⚙️ 三、复杂度分析(整体)
函数 | 平均复杂度 | 说明 |
add_restaurant | O(log R + len(name)) | 哈希插入 |
get_menu | O(len(name)) | 哈希查找 |
add_to_menu | O(len(name) + n + m²) | 排序 + 合并 |
meal_suggestions | O(n × log R) | 堆排序 + 多路归并 |