编写线性算法

时间:2015-09-21 16:25:49

标签: algorithm

这是我的一项任务的问题。

  

给定四个N名称列表,设计一个线性算法来确定是否有任何四个列表共有的名称。

最接近满足O(n log n)的解决方案,只有在只有两个数据集的情况下才有效。迭代其中一个集合并使用二进制搜索来查找匹配项。

有关如何解决此问题的任何提示?我首先在programmers.stackexchange上发布了这个,但是大多数回复都将linearithmic误认为是线性的。

2 个答案:

答案 0 :(得分:3)

您建议的算法可以扩展为使用任何(常量)列表:

  • 使用O(n * log n)排序对所有列表排序,但只有一个。
  • 迭代未排序的列表。
  • 对于每个项目,在每个已排序的列表上使用二进制搜索,以查看它是否全部存在。

这需要与解决方案相同的时间量乘以常量(列表数)。所以它仍然是O(n * log n)。

请注意,通过使用哈希表而不是排序+二进制搜索,也可以获得O(n)平均大小写运行时。

答案 1 :(得分:0)

在O(N.Log(N))中对所有四个列表进行排序。

然后依次选择四个列表中最小的一个(这需要每个元素进行一个恒定的比较),直到所有列表都用完为止,在O(N)中。如果是关系,您将在具有相同值的所有列表中前进(报告四联)。