Task 2 - Restaurants & Menus [30 Marks]b

Cs, Go!

||最后更新: 2025-10-31|
 
 
1️⃣
🧾 一、类结构概览

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
  • 步骤:
      1. 遍历所有餐厅;
      1. 筛选出在可步行范围内的餐厅;
      1. 将各餐厅菜单加入数组;
      1. 使用 最大堆(Max Heap) 实现 K 路归并;
      1. 依次产出评分最高的菜品。
伪代码:

⚙️ 三、复杂度分析(整体)

函数
平均复杂度
说明
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)
堆排序 + 多路归并
Loading...