减少给定程序的空间复杂性或时间复杂度是否更好?

问题描述 投票:-1回答:2

网格照明:给定具有灯坐标阵列的NxN网格。每个灯都为x轴上的每个方块,y轴上的每个方块以及位于对角线上的每个方块提供照明(想象国际象棋中的女王)。给定一组查询坐标,确定该点是否被点亮。问题在于,在检查查询时,与该查询相邻或关闭的所有灯都将关闭。变量/数组的范围大约为:10 ^ 3 <N <10 ^ 9,10 ^ 3 <灯<10 ^ 9,10 ^ 3 <查询<10 ^ 9

好像我可以得到一个而不是两个。我试图将其降低到对数时间,但我似乎无法找到解决方案。我可以减少空间复杂度,但事实并非那么快,指数。我应该把注意力放在哪里,速度还是空间?另外,如果您对如何解决此问题有任何意见,请进行评论。

algorithm time-complexity space-complexity
2个回答
1
投票

对于一辆汽车来说,快速行驶或者在一点点燃料上走得更远?这取决于具体情况。

这是一个提案。

首先,请注意,您可以使用第一个点作为nw-se和ne-sw的“原点”,对输入所喜欢的所有对角线进行编号。通过这一点的对角线都编号为零。 nw-se对角线在例如东北方向上增加每像素,并且向西南方向减小(负)。类似地,ne-sw在例如ne-sw中增加。西北方向和东南方向减少(负)。

给定原点,可以很容易地编写从(x,y)坐标到相应对角线数的常量时间函数。

现在每组灯坐标自然与4个数字相关联:(x, y, nw-se diag #, sw-ne dag #)。您不需要显式存储它们。相反,您需要4个地图xMapyMapnwSeMapswNeMap,例如,xMap [x]生成所有灯坐标列表,其中x坐标为x,nwSeMap [nwSeDiagonalNumber(x,y)]生成所有列表对角线上的灯和其他地图类似。

给定一个查询点,查找相应的4个列表。从这些中可以很容易地处理相邻的方块。如果任何列表长于3,则删除相邻的正方形不能使其为空,因此查询点将亮起。如果它只有3或更少,那么它是一个恒定的时间操作,看它们是否相邻。

此解决方案要求输入点以4个列表表示。由于它们需要在一个列表中表示,因此您可以认为该算法仅需要相对于输入的恒定空间因子。 (即与mergesort相同的成本。)

对于4个哈希表查找,每个查询点的运行时间预计是恒定的。

没有太多麻烦,这个算法可以拆分,因此如果灯柱的数量很大,它可以减少地图。

但是在一台大机器上运行它可能就足够了。有了十亿个灯泡和精心的数据结构选择,在C等无盒式结构语言中实现每个灯泡24个字节并不难。所以~32Gb RAM机器应该可以正常工作。使用多个线程构建映射需要一些同步,但只执行一次。查询可以是只读的:不需要同步。一台不错的10核机器应该在不到一分钟的时间内完成10亿次查询。


0
投票

有一个非常简单的答案是有效的

  1. 创建NxN网格
  2. 现在,对于每个Lamp增加灯的所有单元的计数。
  3. 对于每个查询,检查该查询上的单元格是否值> 0;
  4. 对于每个相邻的细胞,找出所有被照射的细胞并将计数减少1

这工作正常,但尝试10000 X 10000网格时大小限制失败

© www.soinside.com 2019 - 2024. All rights reserved.