【问题标题】:Loop Through a set of Objects循环遍历一组对象
【发布时间】:2011-08-01 19:56:12
【问题描述】:

我有一个巨大的键值对映射,大约 10^7,我必须每秒循环 15 次才能更新其内容 是否有任何类或结构可以提供良好的复杂性并减少循环所需的时间?

目前,我正在使用 TreeMap,但复杂性是 log n 仅用于包含、放置、获取和删除。循环遍历元素的复杂度为 n

您是否知道任何结构或有任何想法可以降低低于 n 的复杂性?

【问题讨论】:

  • 你怎么可能在少于 n 步的时间内遍历 n 个元素?
  • 您确定必须遍历整个内容才能更新其内容吗?更新采用什么形式?这个结构中存储了什么样的数据?
  • 不存在任何我熟悉的算法可以将复杂度降低到 n 以下。这是一个我不熟悉的算法,它可能会也可能不会将复杂度降低到 n - en.wikipedia.org/wiki/Grover%27s_algorithm 以下。如果该算法有用,那么也许有人(即不是我)可以实现它。
  • 由于显而易见的原因,不可能以比 o(n) 更快的速度循环,除非您可以减少集合中需要更新的元素数量
  • @emory:这似乎需要一台量子计算机。

标签: java loops complexity-theory treemap


【解决方案1】:

如果你必须对整个集合进行任意循环,你不会比 n 更好。如果你必须循环整个集合,你可以使用一个简单的 ArrayList。但如果您需要使用键访问集合中的特定数据,TreeMap 就可以了。

【讨论】:

  • +1 以获得好的答案。你到底要如何在不到 n 的时间内查看 n 个项目?我认为具有任意数量内核的假设并行机器可以通过简单地并行检查所有 n 个元素来在线性时间内做到这一点。对于使用固定(有限)数量的处理器的并行算法,问题仍然是 O(n),但您当然可以通过并行性来加速它。
  • 这是一个非常好的实用答案,但我怀疑您可以使用量子计算机遍历 n 以下的整个集合。然而,在量子计算机上实现 java 之前,这是一个有争议的问题。
【解决方案2】:

如果您的问题只是查看所有 O(n) 值,那么您无法超越任何顺序(或有限并行)计算机上的 O(n) 界限。

如果您有一台有限并行机器,并且具体取决于您更新元素的方式,您可以实现加速。例如,使用 CUDA 和 GPU 或 OpenMP/MPI 和集群/多核工作站,您可以计算 A[i] = A[i]^3 或一些具有良好加速的类似。当然,还有沟通的问题……但这可能值得一看。

【讨论】:

  • 我知道循环一组对象所需的时间与该组的大小成正比,但我问是否有人知道任何可以至少提高循环时间的结构。我有一个 2D Double 数组 24X500000 并且这个数组每秒更新 15 次(每个单元格在几何上减少一个系数)。大多数单元格为0;因此更新它们(乘以一个系数不会有任何影响,除了增加计算时间)。
  • 我认为不是拥有这个巨大的二维数组,而是拥有一个 TreeMap 并仅保留非零值,其中 row+Column 作为键,单元格的值作为节点的值。我的问题是:TreeMap 是否需要更多计算而不是 ArrayList。还有其他性能更好的结构吗?
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2016-07-28
  • 2017-01-29
  • 2015-10-15
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多