这是一项家庭作业。
目标是以伪代码呈现算法,该算法将搜索数字数组(不指定是否为整数或> 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:
的比例搜索Mergesort {9,8,6,4,2,1}
由于给定的比率> 1,我们将从左到右进行搜索。
2a上。第一个数字是9.检查9/4> 2.检查9/6< 2下一个号码。 2B。第二个数字是8.检查8/4 = 2.完成
答案 0 :(得分:2)
您提供的分析是正确的,是解决此问题的绝佳方法。排序确实在时间O(n log n)内工作,2n二进制搜索也需要O(n log n)时间。也就是说,我认为你不想在这里使用“摊销”一词,因为这是指不同类型的分析。
作为如何加快解决方案速度的提示,您的解决方案的一般想法是,无论数字是否存在于数组中,都可以有效地查询任何数字。这样,您可以循环遍历所有数字并查找可使比率起作用的任何内容。但是,如果在支持快速访问的阵列外部使用辅助数据结构,则可能会以增加内存使用量为代价来削减运行时。尝试考虑哪些数据结构支持非常快速的访问(例如,O(1)查找),看看你是否可以在这里使用它们。
希望这有帮助!
答案 1 :(得分:2)
解决这个问题,只有O(nlgn)就够了
步骤1,对数组进行排序。花费O(nlgn)
步骤2,检查比率是否存在,此步骤只需要o(n)
你只需要两个指针,一个指向第一个元素(最小的一个),另一个指向最后一个元素(最大的一个)。
计算比率。
如果比率大于指定的比率,则将第二个指针移动到其前一个元素。
如果比率小于指定的比率,则将第一个指针移动到下一个元素。
重复上述步骤,直到:
你找到确切的比例,或者
第一个指针到达结尾,或第二个点到达开头
答案 2 :(得分:1)
算法的复杂性为O( n ²),因为在对数组进行排序后,您将迭代每个元素(最多 n 次)并在每次迭代中执行 n - 1个分区。
相反,在对数组进行排序之后,迭代每个元素,并在每次迭代中将元素除以比率,然后查看结果是否包含在数组中:
时间复杂度的结果O( n log n )
在你的例子中:
答案 3 :(得分:1)
(1)构建此数组的hashmap。时间成本:O(n)
(2)对于每个元素a [i],在HashMap中搜索[i] * x。时间成本:O(n)。
总费用:O(n)