有哪些算法/优化可用于计算数组中元素的条件子集?
Posted
技术标签:
【中文标题】有哪些算法/优化可用于计算数组中元素的条件子集?【英文标题】:What algorithms / optimisations are there for calculating a conditional subset of elements from an array? 【发布时间】:2010-09-20 01:26:51 【问题描述】:我的程序经常处理大量数据,其中的一个特定组件会根据条件创建该数据的子集。您可以将其视为具有字符串,
10457038005502
问题是返回前五个(比如说)非0元素,也就是返回:
14573
实际上,这个字符串的每个元素都是一个包含大量数据的大型数据结构,整个数据集通常有几千兆字节大小并包含数万个元素,和确定是否应该包含元素(不是“0”)每个元素都需要处理。我用上面的措辞来尝试清楚地解释它,并尝试将重点放在算法或技术上,而不是我们的具体实现和数据。
编辑:感谢到目前为止回复的人。所有建议 围绕多线程,其中 我同意这是一个好方法(我们确实 有一个线程任务框架 会适合。)我希望 问题本身可以被视为 一个算法问题 - 我怀疑, 虽然我不知道,这是一个 适用于的一般问题 搜索各种数据。 在这种情况下,一个很棒的回复会 是“施瓦辛格等人提出的 1995 年的算法 X,谷歌 这个词。”我们当前的方法是从我们已经知道的输入数据集中的第一个点沿数组进行单线程线性搜索,计算是否需要保留一个元素,并在执行过程中构建结果。请求的数据子集通常不在开头 - 使用字符串示例,您可能需要知道元素 8-15(如果存在 15 个元素,您可能要到输入数据的末尾才知道。 ) 当然,我们不知道输出数据集的第 8 个元素在输入数据集中是什么,直到我们从一开始就处理了这么多。
我们还应该如何解决这个问题?
我正在寻求有关解决此类问题的任何完全不同的方法或算法的意见。
还有哪些其他方法可以解决这个问题,即快速获取任意子集?
知道当前的解决方案是计算受限的,因为每个元素的处理量,或者更确切地说,因为它需要生成每个元素才能检查它是否为“0”,什么算法或您可能建议解决问题的方法?有什么办法可以最小化程序所做的工作?
如果它影响特定的库或工具,我们使用的是 C++(非托管;我们使用 Embarcadero C++ Builder 2010。)例如,我们不能使用 LINQ,如果没有使用它,我认为它可能是一个有用的工具 /此类问题的语言功能。但是,我们当然可以实现任何算法解决方案,您通常可以在其他环境中通过较少的工作来实现。
【问题讨论】:
您唯一的问题是找到字符串(或数据结构的等效向量)中的第一个 k 个非零元素,还是有其他问题要解决?另外,如何检查数据结构是否为0
?您是否有一个函数应用于每个元素,该函数返回它是否为0
?
它是任何子集,即元素 k-k+100,不一定来自元素 0。我们在每个数据结构上运行一个方法,它返回是否为 0,是的。
【参考方案1】:
假设每个计算都可以独立于其他计算进行(即一个项目的结果不依赖于前一个项目的结果),显而易见的第一步是使用多线程并行执行计算。
【讨论】:
对于输入数据,每个元素的值一般都是独立的。它的生成方式可能千差万别,但假设存在一个元素,它就是独立的。对于输出数据,似乎包含一个项目(假设您请求特定的索引子集)取决于处理每个先前的输入数据项目。关于多线程,您是指对输入数据进行分区并在线程中处理每个分区还是作为任务对象以获取0 /非0元素的列表,然后重新组装? 是的——这个想法是,如果(例如)你被要求输入前 5 个非零项,你读取前五个输入,然后启动五个线程来处理这五个项目并行。我可以看到包含非零项目的位置可能取决于之前找到了多少,但是如果您被要求提供 N,那么您可以至少并行处理第一个 N,并确保将使用任何积极的结果.是的,当您得到结果后,您可以将它们重新组装回原来的顺序。【参考方案2】:通过快速阅读您的问题,我想您可能想要实现某种主从并行化。让一个线程(或您选择的进程)读取前 N 个条目,启动 N 个线程(或进程)并向每个线程传递一个任务。然后每个线程独立工作,并在完成(成功或失败)后向主服务器报告。然后,Master 确定是否需要创建更多任务并将其传递给工作人员。
这样做的主要潜在问题可能是确保工作人员之间的良好负载平衡,并确保主线程不会成为太大的瓶颈。
OpenMP 3.0 支持这种类型的任务并行性并且具有相当平缓的学习曲线。
【讨论】:
不幸的是,OpenMP 不适用于 C++ Builder(请参阅 openmp.org/wp/openmp-compilers 。)感谢您的回复/算法/方法建议!以上是关于有哪些算法/优化可用于计算数组中元素的条件子集?的主要内容,如果未能解决你的问题,请参考以下文章