【问题标题】:Finding greatest change within a period of time within a large set of data with irregular intervals在不规则间隔的大量数据中找到一段时间内的最大变化
【发布时间】:2014-09-03 05:23:57
【问题描述】:

在我的情况下,我必须处理由日期和每个日期对应的数字组成的大量数据。这些日期之间的间隔不是静态的,这意味着一些日期相隔几秒钟,而另一些则相隔几天。此数据具有以下格式:(以 PHP 数组转储格式给出)

Array[2000] {  
   Array[2] {  
      Date: 2014-7-7 7:07:07  
      Data: 29.2934  
   }
   Array[2] {  
      Date: 2014-7-7 7:08:13
      Data: 30.10203
   }
   Array[2] {
      Date: 2014-7-9 3:24:43
      Data: 30.10203
   }
   ...
}

我需要找到在某个时间限制内的两个日期之间的最大数据增量,例如一天、一周等。我一直在使用这个 PHP 代码来实现这一点:

for ($i=0; $i<$numrows-1; $i++) {
    for($o=1; $o<($numrows-1)-$i; $o++) {
        if((strtotime($dataArray[$i+$o]['Date'])-strtotime($dataArray[$i]['Date']))<86400) { //86400 for constraint of one day
            $diffs[$i]['date'] = strtotime($dataArray[$i+$o]['Date']);
            $diffs[$i]['data'] = $dataArray[$i+$o]['data']-$dataArray[$i]['Data'];
        }
    }
}

这将返回一个数组,其中包含数据数组每个元素的边界内的最大结束日期以及它们之间的数量差异。然后,我可以搜索 diffs 数组的最大数据元素,以确定哪一天数据增加最多。这工作正常,但不幸的是,它涉及将我的服务器的 CPU 设置为 100% 超过 20 秒以处理某些数据集,并导致它在此期间对其他请求无响应。

我想弄清楚的是如何以更有效的方式做到这一点;我做了一些研究,我认为这是在 O(n^2) 时间内,但是我似乎找不到使用更有效算法的方法。有什么方法可以使用更少的处理时间和系统资源来实现同样的目标?

【问题讨论】:

    标签: php sorting resources


    【解决方案1】:

    有了数据库,实现起来会容易得多。总之……

    我会添加一个按增量日期增量数据排序的索引(即保留对原始数据的引用的附加数组)。

    Array[2000] {
       Array[2] {
          DeltaDate: 10
          DeltaData: 1.234
          Row: ???
       }
       Array[2] {
          DeltaDate: 66
          DeltaData: 0.80863
          Row: 1
       }
       Array[2] {
          Date: 160000
          Data: 0
          Row: 2
       }
       Array[2] {
          Date: 160000
          Data: 1
          Row: ???
       }
       Array[2] {
          Date: 160000
          Data: 234
          Row: ???
       }
       ...
    }
    

    之后,我将在该索引中查找满足时间限制的最高记录。鉴于索引是有序的,您可以使用二进制搜索 (O=log N)。

    在 SQL 数据库中,这将通过以下查询表示:

    SELECT * FROM Array
        WHERE DeltaDate <= time constraint
        ORDER BY DeltaData DESC LIMIT 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多