从阵列计算元素的条件子集有哪些算法/优化?

时间:2010-09-20 01:26:51

标签: algorithm optimization data-structures c++builder

我的程序经常处理大量数据,其中一个特定组件根据条件创建该数据的子集。您可以将其视为具有字符串

10457038005502

问题是返回前五个(比如说)非0元素,即返回:

14573

实际上,此字符串的每个元素都是一个包含大量数据的大型数据结构,整个数据集的大小通常为几千兆字节,包含数万个元素,为弄清楚是否应该包含元素(不是'0'),每个元素都需要处理。我已经用上面两种语言来试图清楚地解释它,并试图将其集中在算法或技术上,而不是我们的具体实现和数据。

  • 编辑:感谢那些到目前为止已经回复的人。所有建议 围绕多线程,这是 我同意这是一个很好的方法(我们做到了 这有一个线程化的任务框架 很适应。)我希望如此 问题本身可以视为 一个算法问题 - 我怀疑, 虽然我不知道,这是一个 适用于的一般问题 搜索各种数据。 从这个角度来看,一个很棒的回复会 是“施瓦辛格等人提出的 算法X在1995年,谷歌 这个词。“

我们当前的方法是从输入数据集中已知的第一个点开始,沿着数组进行单线程线性搜索,计算是否需要保留元素并按原样构建结果。通常所请求的数据子集不在开头 - 使用字符串示例,您可能需要知道,例如,元素8-15(如果存在15,您可能不知道,直到您到达输入数据的末尾。 )当然,在我们从头开始处理之前,我们不知道输入数据集中输出数据集的哪个元素8。

我们还应该如何解决这个问题?

我正在寻求任何完全不同的方法或算法的输入来解决这类问题。

  • 还有哪些方法可以解决这个问题,即快速获取任意子集?

  • 知道当前的解决方案是由于每个元素的处理量而受到计算限制,或者更确切地说,因为它需要生成每个元素以便检查它以查看它是否为'0',是什么算法或者您可以建议解决问题吗?有没有办法尽量减少程序的工作?

如果它影响特定的库或工具,我们使用C ++(不管理;我们使用Embarcadero C++ Builder 2010。)例如,我们不能使用LINQ,如果没有使用它,我认为可能是有用的这类问题的工具/语言功能。但是,我们当然可以实现您通常可以在另一个环境中以较少的工作实现的任何算法解决方案。

2 个答案:

答案 0 :(得分:1)

假设每个计算可以独立于其他计算进行(即,项目的结果不依赖于前一项的结果),显而易见的第一步是使用多线程并行执行计算。 / p>

答案 1 :(得分:1)

通过快速阅读您的问题,我想您可能希望实现某种主工作并行化。让一个线程(或您选择的进程)读取前N个条目,启动N个线程(或进程)并将一个任务传递给每个。然后,每个线程独立工作,并在完成(成功或失败)时向主服务器报告。然后,Master确定是否需要创建更多任务并将其传递给员工。

这方面的主要潜在问题可能是确保跨工作人员的良好负载平衡,并确保主线程不会成为瓶颈。

OpenMP 3.0支持这种类型的任务并行性,并且具有相当温和的学习曲线。