algorithm - 在 O(nlogm) 时间内计算两个未排序数组的并集和交集
问题描述
需要帮助用算法解决这个问题...给定两个集合 A 和 B,分别具有 m 和 n 个元素,来自线性顺序。这些集合不一定是排序的。还假设 m ≤ n。展示如何在 O(nlogm) 时间内计算 A∪B 和 A ∩ B。
解决方案
正如 vivek_23 所说,您可以使用高概率的哈希表做得更好。
但是,要实现O(n log m ),并假设您的集合存储为数组,您可以在O(m log m)时间内对A进行排序,然后对B的每个元素进行n二进制搜索以查看它是否也在一个。每次查找需要 O (log m)时间,总共需要O(n log m)时间。
因此,对于A∪B,您可以在O(m)时间内将A复制到新的集合C中。然后对于 B 的每个元素,您在 A 上进行查找(二进制搜索)。如果它不在 A 中,则将其添加到 C。这样,您将花费O(m + n log m)时间来构造C和O(m log m)* 对 A 进行排序。由于m < n,总时间为O(n log m)如您所愿。
对于A ∩ B,您将从空集D开始。对于B的每个元素,您在A中进行查找。如果它在那里,您将其添加到D。完成后,您将在A上完成n次查找,总共(n log m)。
如果要将列表 A 的所有元素插入哈希表而不是对它们进行排序,则可以在O(m + n)时间内以高概率完成所有操作。
推荐阅读
- python - 每种类型的电影镜头收视率分布
- python - 创建基于列的子图
- sql - 在简单查询中转换值时遇到问题:“将 nvarchar 转换为数字数据类型的算术溢出错误”
- php - 使用 laraval eloquent 获取日期时间边缘案例
- javascript - 反应地图不返回地图数组
- dialogflow-es - 从 DialogFlow 对话中取消关联 Google 帐户
- ios - Apple Pay - PKPassLibrary isSecureElementPassActivationAvailable
- javascript - 错误:使用 Formik 和传递值时,对象作为 React 子项无效
- google-apps-script - 使用 Google 表单中的数字答案在 Google 表格中为 Google 表单中的动态文本选择行号?
- api - 从通道名称中获取松弛通道详细信息