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

📅  最后修改于: 2021-10-20 10:31:13             🧑  作者: 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 ) 更好的解决方案,因为在最坏的情况下,它将执行 10 10 次操作,因为 N 是 10 5 。因此,这种情况下可接受的复杂度是 O(NlogN),它大约是 10 6 (10 5 * ~10) 次操作,远低于 10 8或 O(N)。

对于案例 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 -确定是否存在两个元素在 s 中,其总和恰好是 x/