algorithm - 寻找有效的算法(非平凡的)

标签 algorithm data-structures

<分区>

问题“规范”:

圣诞节到了!你必须买礼物!

你有一套已经存在的玩具 bundle ,以及 bundle 对应的价格:

1 0 0 1 0 1 1 1 0 => 58
0 1 0 0 1 1 1 0 0 => 27
1 1 1 0 0 0 1 0 0 => 46
0 0 0 0 1 1 1 1 0 => 73
...

1 表示玩具在 bundle 中,0 表示不在 bundle 中。

现在,圣诞老人促销事件即将到来,我们将以“促销特价”向您提供剩余的 bundle X。如果存在另一个 bundle Y,我们会说 X 是一个交易,这样:

编辑:为了简化操作,我删除了条件 3,但将条件 1 从“子集”更改为“严格子集”

  1. XY
  2. strict 子集
  3. XY

目标是实现一个函数 bool isBadSubset(X),它可以有效地找出 X 是否良好。

鉴于有数百万个 bundle,将其逐个进行比较显然是不可行的。此外,您可以假设在现有的 bundle 集合中,玩具的子集总是比超集便宜。

提示:

  • 比较一个集合是否是另一个集合的子集很容易
  • 可以将比较限制为既包含至少 N 个玩具更便宜 的集合。但是,列表可能仍然很大。
  • 朝筛子方向的东西会很好
  • 你不需要知道哪个 bundle 更好...只要有一个更好

挑战:是否有可能在恒定时间内实现这一目标? (与集合中当前的束数量无关)...或至少在 log(n) 中?

最佳答案

我通过快速搜索找到了一些相关文献,看来一般情况下你的问题并不容易。

Charikar, Indyk and Panigrahy (2002)研究子集查询问题:给定一个包含 m 个元素的宇宙 U 的 N 个子集的集合 P 和一个查询集合 Q,P 中是否存在一个集合是 Q 的超集?他们提出了两种以存储空间换取查询速度的算法。为了实现 O(N/k) 查询时间,他们需要按 k 的平方根的指数因子增加空间使用量。

Bevc and Sannik (2010)描述了一个简单的基于 trie 的子集查询数据结构,没有分析查询速度,但很明显它在最坏情况下与存储集的数量 N 呈线性关系。

关于algorithm - 寻找有效的算法(非平凡的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377442/

相关文章:

c++ - 重载 << 运算符以处理指向字符串的指针

database - 如何找到数据库中最长的关系链?

c++ - 用c++解决骑士之旅

c# - 分割自相交多边形的算法

c - 如何解析结构体数组作为参数?

c - 从数组中选择最大子数组

找到一个城市所连接的最大陆地的算法​​?

c# - 为什么大多数时候只能向前遍历?

c - 自引用结构的大小

java - 如何与大量的数字数组?