2

这是我上一次的comp stat qual。我给出了一个我认为很好的答案。我们只是在考试中获得分数,而不是我们是否正确回答了具体问题。希望社区可以对此提供指导,我对答案不感兴趣,而是对正在测试的内容以及我可以去哪里阅读更多相关信息并在下次考试前进行一些练习感兴趣。

乍一看,这似乎是一个时间复杂度问题,但当它开始谈论映射函数和预排序数据时,我不知道如何处理。那你会怎么回答?

这里是:

给定从某个域 Z 中抽取的一组项目 X = {x1, x2, ..., xn},您的任务是查找 Z 中的查询项目 q 是否出现在集合中。为简单起见,您可以假设每个项目在 X 中只出现一次,并且需要 O(l) 时间来比较 Z 中的任何两个项目。

(a) 为检查 q 是否在 X 中的算法编写伪代码。算法的最坏情况时间复杂度是多少?

(b) 如果 l 非常大(例如,如果 X 的每个元素都是一个长视频),那么需要有效的算法来检查 q \in X 是否。假设您可以访问 k 个函数 h_i: Z -> {1, 2 , ..., m} 将 Z 的一个元素统一映射到 1 到 m 之间的一个数,并且让 k << l 和 m > n。为使用函数 h_1...h_k 来检查 q \in X 的算法编写伪代码。请注意,您可以预处理数据。你的算法的最坏情况时间复杂度是多少?

明确说明伪代码中的输入、输出和假设。

4

1 回答 1

1

第一个似乎是简单的线性扫描。时间复杂度是O(n * l),最坏的情况是比较所有元素。注意 - 它不能与 亚线性n,因为如果数据已排序,则没有信息。

第二个(b)实际上是bloom-filter的变体,它是一种表示集合的概率方式。使用布隆过滤器 - 您可能会有误报(假设某物在集合中,但它不在),但绝不会误报(假设某物不在集合中,而它在集合中)。

于 2012-09-20T11:23:00.487 回答