处理连续渗透中的大量数据

时间:2017-05-05 10:16:49

标签: algorithm matlab continuum large-data

对于我目前参与的团体项目,我们必须模拟以下内容: 取一个边长 n 的正方形。在正方形上均匀分布一定量的单位磁盘。找到从正方形的左侧到右侧延伸的连接磁盘组件所需的磁盘数。然后找到所需的磁盘数量,直到方块完全充满磁盘。

没有明确说明,但我们假设这是在Matlab中完成的,因为我们在本课程的其他部分使用它。对于第一个问题,找到从左到右的路径,我写了两个有效的方法。一个使用邻接列表和Matlab中的图形工具来查找连接的节点。这种方法足够快,但占用的内存太多,无法满足我们的需求。另一种方法使用递归搜索算法而不存储邻接信息,但速度太慢。

当我们需要正方形的尺寸 n = 1000 n = 10 000 时,就会出现问题。我们预测这将需要几千万个或更多的圆圈,而我们根本看不出我们应该如何处理这个,因为任何邻接列表或矩阵都会非常大,而不使用它似乎需要大量的时间感谢任何想法和想法,谢谢

1 个答案:

答案 0 :(得分:0)

让我们将你的问题重新表述为这样的决策问题:

  

从PRNG的种子 s 开始,在 n x n 方块中随机分发 m 单位磁盘,并确定它们是否从左侧到右侧形成连接路径。

  

从PRNG的种子 s 开始,在 n x n 方块中随机分发 m 单位磁盘,并确定它们是否覆盖整个广场。

如果您可以解决这些决策问题,那么您可以通过对可能的值进行二进制搜索来找到 m 的最小值。

通过像这样生成磁盘,您可以在不使用大量RAM的情况下解决这些决策问题:

  1. 使用给定的种子 s
  2. 初始化您的PRNG
  3. 对于每个磁盘1 ... m ,随机选择它将进入的列(该地板(center.x))。累计所有列的计数,以确定每个列的磁盘数量。设 COUNT(col) col
  4. 列中要生成的磁盘数
  5. 对于0 ... n -1中的每个col,生成在该列中均匀分布的 COUNT(col)磁盘。
  6. 现在,您主要从左到右生成磁盘。上述两个决策问题的解决方案都是从左到右工作,只需要一次查看一列或两列磁盘,因此您只需要记住一列或两列磁盘。

    对于完整覆盖问题,从左到右工作,并使用该列和相邻列中的磁盘确定是否完全覆盖了整个广场中的每列。没有其他磁盘可以到达。

    对于左右路径问题,使用union-find从左到右工作,以跟踪当前列中的哪些磁盘连接到左侧和彼此。当您到达最后一列时,您可以检查最后一列中的任何磁盘是否连接到左侧并延伸到右侧。