📜  了解竞争性编程的复杂性

📅  最后修改于: 2021-04-29 18:38:24             🧑  作者: Mango

先决条件:时间复杂度分析

通常,在各种站点上进行竞争性编程问题时,面临的最困难的任务是以所需的复杂度编写代码,否则程序将获得TLE(超过时限)。天真的解决方案几乎永远不会被接受。那么如何知道什么复杂度是可以接受的呢?

这个问题的答案与在一秒钟内可以执行的操作数直接相关。如今,大多数站点每秒允许进行10 8次操作,只有少数站点仍然允许10 7次操作。在确定了可以执行的操作数量之后,通过查看问题中给出的约束条件来寻找合适的复杂性。

例子:
给定一个数组A []和一个数字x,请在A []中检查总和为x的一对。
其中N是:

1) 1 <= N <= 103
2) 1 <= N <= 105
3) 1 <= N <= 108

对于案例1
一个使用两个for循环的天真的解决方案,因为它给我们带来了O(N 2 )的复杂性,即使在最坏的情况下,它也会执行10 6个运算,而这些运算远低于10 8 。当然,在这种情况下,O(N)和O(NlogN)也可以接受。

对于案例2
我们必须考虑比O(N 2 )更好的解决方案,因为在最坏的情况下,由于N为10 5 ,它将执行10 10次运算。因此,在这种情况下可以接受的复杂度是O(NlogN)或O(N),O(NlogN)大约在10 8以下可以进行10 6 (10 5 *〜10)个运算。

对于案例3
甚至O(NlogN)也会给我们TLE,因为它执行约10 9的操作,超过10 8 。因此,唯一可以接受的解决方案是O(N),在最坏的情况下,它将执行10 ^ 8运算。

可以在以下网址找到针对特定问题的代码:https://www.geeksforgeeks.org/write-ac-program-that-given-a-set-a-of-n-numbers-and-another-number-x确定其总和完全是x的s中是否存在两个元素