如何降低桶式灌装程序的时间复杂度
How to reduce the time complexity of bucket filling program?
我正在解决如下问题:
一行中有n个桶。园丁给桶浇水。每天在位置i和j(包括)之间浇桶。对于不同的i和j,他对t天这样做。
假设桶内初始体积为零,每次浇水使桶内的体积增加1
。
输入:第一行包含以空格分隔的t和n。接下来的t行包含i和j,以空格分隔。
Output:单行显示以空格分隔的n个桶中的音量。
例子:
输入: 2 2
1
1 2
2 1
约束条件包括:0 <= t <= 104;1 <= n <= 105
我试过这个问题。但我用的是O(n*t)算法。在每一步中,我将桶从I增加到j。但这显示了时间限制错误。有没有有效的算法来解决这个问题?一个小小的提示就足够了。
p。S:我用c++和Java作为标签,因为这个程序可以用这两种语言编写。
不要记住每个桶的水量,而要记住每个桶与前一个桶的区别。
有两个区间列表,一个按上界排序,一个按下界排序
则从体积v为0开始遍历n
On each iteration over n
check if the next interval starts at n
if so increase v by one and check the next interval.
do the same for the upper bounds but decrease the volume
print v
repeat with the next n
我认为这里的关键观察是,您需要找到一种方法来表示(可能)105桶,而不是实际为每个桶分配空间,并分别跟踪它们。您需要想出一个稀疏表示来跟踪您的水桶和里面的水。
输入的范围给了你一个很好的提示:你可能应该在你的稀疏表示中使用范围。您可以通过跟踪每个范围末端的桶来实现这一点。
我建议你用链表来做。每个列表节点将包含2条信息:
- 一个桶号
- 水桶里的水量
假设当前桶和下一个桶之间的所有桶的水体积相同。
下面是一个例子:
Input:
5 30
1 5
4 20
7 13
25 30
19 27
这是算法的每一步会发生的事情,第一步是初始状态,而每个后续步骤是解析完一行后所做的事情。
- 1:0→
NULL
(所有桶为0) - 1:1 → 6:0 →
NULL
(1 - 5 1、休息是0) - 1:1 → 2节→ 6:1 → 21:0 →
NULL
(1 - 3有1、4 - 2 6 20 1,其他有0) - 1:1 → 2节→ 6:1 → 2 → 14:1 → 21:0 →
NULL
- 1:1 → 2节→ 6:1 → 2 → 14:1 → 21:0 → 25:1 →
NULL
- 1:1 → 2节→ 6:1 → 2 → 14:1 →十九2 → 21 → 25:2 → 28:1 →
NULL
你应该能够从上面的例子中推断出这个方法的复杂度实际上是O(t2)而不是O(n×t),所以这应该比快得多。正如我在上面的评论中所说,这种方式的瓶颈实际上应该是解析和输出,而不是实际的计算。
这是一个时空复杂度为O(n)的算法
我正在使用java,因为我已经习惯了它
1)创建一个包含n个元素的哈希集2)每次浇水时增加各自元素的数量3)文件解析完成后,遍历hashset计算结果
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 降低程序的时间复杂度
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 有没有办法降低程序的时间复杂度?
- 初始化二维数组时程序的时间复杂度
- 如何降低桶式灌装程序的时间复杂度