在未排序的数组中查找特定比率。时间复杂

时间:2012-12-30 18:59:17

标签: algorithm optimization complexity-theory big-o mergesort

这是一项家庭作业。

目标是以伪代码呈现算法,该算法将搜索数字数组(不指定是否为整数或> 0)并检查任何两个数字的比率是否等于给定的x。时间复杂度必须低于O(nlogn)。

我的想法是合并数组(O(nlogn)时间),然后是| x | > 1以降序开始检查每个数字(使用二进制遍历算法)。对于每个数字,检查也应该花费O(logn)时间,n个检查的最坏情况给出总共O(nlogn)。如果我没有遗漏任何东西,这应该在赋值的参数范围内给出O(nlogn)+ O(nlogn)= O(nlogn)的最坏情况。

我意识到排序后我开始检查比率并不重要,但时间成本按1/2分摊。

我的逻辑是否正确?有更快的算法吗?

一个例子,如果不清楚:

给定一个数组{4,9,2,1,8,6}

如果我们想以2:

的比例搜索
  1. Mergesort {9,8,6,4,2,1}

  2. 由于给定的比率> 1,我们将从左到右进行搜索。

  3. 2a上。第一个数字是9.检查9/4> 2.检查9/6< 2下一个号码。 2B。第二个数字是8.检查8/4 = 2.完成

4 个答案:

答案 0 :(得分:2)

您提供的分析是正确的,是解决此问题的绝佳方法。排序确实在时间O(n log n)内工作,2n二进制搜索也需要O(n log n)时间。也就是说,我认为你不想在这里使用“摊销”一词,因为这是指不同类型的分析。

作为如何加快解决方案速度的提示,您的解决方案的一般想法是,无论数字是否存在于数组中,都可以有效地查询任何数字。这样,您可以循环遍历所有数字并查找可使比率起作用的任何内容。但是,如果在支持快速访问的阵列外部使用辅助数据结构,则可能会以增加内存使用量为代价来削减运行时。尝试考虑哪些数据结构支持非常快速的访问(例如,O(1)查找),看看你是否可以在这里使用它们。

希望这有帮助!

答案 1 :(得分:2)

解决这个问题,只有O(nlgn)就够了

步骤1,对数组进行排序。花费O(nlgn)

步骤2,检查比率是否存在,此步骤只需要o(n)

你只需要两个指针,一个指向第一个元素(最小的一个),另一个指向最后一个元素(最大的一个)。

计算比率。

如果比率大于指定的比率,则将第二个指针移动到其前一个元素。

如果比率小于指定的比率,则将第一个指针移动到下一个元素。

重复上述步骤,直到:

  1. 你找到确切的比例,或者

  2. 第一个指针到达结尾,或第二个点到达开头

答案 2 :(得分:1)

算法的复杂性为O( n ²),因为在对数组进行排序后,您将迭代每个元素(最多 n 次)并在每次迭代中执行 n - 1个分区。

相反,在对数组进行排序之后,迭代每个元素,并在每次迭代中将元素除以比率,然后查看结果是否包含在数组中:

  • 师:O(1)
  • 在排序列表中搜索:O(log n
  • 重复每个元素: n

时间复杂度的结果O( n log n

在你的例子中:

  • 9/2 = 4.5(未找到)
  • 8/2 = 4(找到)

答案 3 :(得分:1)

(1)构建此数组的hashmap。时间成本:O(n)

(2)对于每个元素a [i],在HashMap中搜索[i] * x。时间成本:O(n)。

总费用:O(n)