【问题标题】:Best data structure for a collection of data with only changes between each iteration数据集合的最佳数据结构,每次迭代之间只有变化
【发布时间】:2014-08-16 11:31:45
【问题描述】:

我正在实现短时傅里叶变换,每帧之间有 70% 的重叠(每帧 256 个样本)。因为每次迭代之间只有前 75 个样本发生变化,我正在伤害在 JAVA 中实现这一点的最佳方法是什么。意思是在java中删除前70个样本并附加新的70个样本的最快方法是什么?

【问题讨论】:

    标签: java performance signal-processing


    【解决方案1】:

    这听起来像是循环缓冲区的工作。

    这是一个复制/粘贴的简单实现:Circular Array List for Java

    这是来自Apache Commons CollectionsCircularFifoQueue

    【讨论】:

      【解决方案2】:

      您需要某种Queue 集合,它允许您删除最旧的元素(位于队列顶部)并将新元素添加到末尾。

      LinkedListQueue 的可能实现,它可以工作。使用addaddAll 将元素添加到末尾,使用remove 从列表中删除第一个元素。

      如果您想创建自己的自定义数据结构,长度有限的循环队列(在您的情况下为 256)将是理想的。每次添加新样本时,这样的队列都会覆盖旧样本。我没有在 Java API 中找到现有的此类数据结构。

      编辑:您没有指定每个样本包含什么类型的数据。如果它是 maaartinus 评论中所建议的原语 - 双倍,那么您可能最好不要使用 Java 的标准集合,因为它们在用于存储原语时涉及装箱开销。相反,您可以按照上一段中的建议创建自己的循环队列。正如 maaartinus 所建议的,它可以由数组支持,double[256],这将非常有效。

      【讨论】:

      • LinkedList 是有史以来最糟糕的数据结构之一。虽然理论上很好,但真正有意义的情况很少见。特别是在这里,当 OP 需要处理原语时,与new double[256] 循环缓冲区相比,any collection 的开销太高(很容易实现)。
      • @maaartinus 我不知道每个样本都是双重的。我认为这是一些非原始对象。我同意在这种情况下使用 double[256] 会更好。
      • 理论上,离散傅里叶变换需要任意的field,但实数肯定是最常见的,尤其是在信号处理中。
      • 使用 double[512] 可能更容易/更快,而不是处理 double[256] 附带的环绕(处理 256 个样本的帧时)。
      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2019-12-13
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多