如何降低桶式灌装程序的时间复杂度

How to reduce the time complexity of bucket filling program?

本文关键字:程序 时间复杂度 何降低      更新时间:2023-10-16

我正在解决如下问题:

一行中有n个桶。园丁给桶浇水。每天在位置ij(包括)之间浇桶。对于不同的ij,他对t天这样做。

假设桶内初始体积为零,每次浇水使桶内的体积增加1

输入:第一行包含以空格分隔的tn。接下来的t行包含ij,以空格分隔。

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条信息:

  1. 一个桶号
  2. 水桶里的水量

假设当前桶和下一个桶之间的所有桶的水体积相同。

下面是一个例子:

Input:
5 30
1 5
4 20
7 13
25 30
19 27

这是算法的每一步会发生的事情,第一步是初始状态,而每个后续步骤是解析完一行后所做的事情。

  1. 1:0NULL(所有桶为0)
  2. 1:1 6:0 NULL(1 - 5 1、休息是0)
  3. 1:1 2节 6:1 21:0 NULL(1 - 3有1、4 - 2 6 20 1,其他有0)
  4. 1:1 2节 6:1 2 14:1 21:0 NULL
  5. 1:1 2节 6:1 2 14:1 21:0 25:1 NULL
  6. 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计算结果