2011-11-10 11 views
0

私はこの比較をより速くするための助けをしたいと思います(下記のサンプル)。サンプルは配列内の各値を取り、比較変数に1時間を付けます。一致する値がない場合、値は2番目の配列に追加されます(後で連結されます)。日付比較タスクのためのより良いアルゴリズム

if (ticks.TypeOf == Period.Hour) 
    while (compareAt <= endAt) 
    { 
     if (range.Where(d => d.time.AddMinutes(-d.time.Minute) == compareAt).Count() < 1) 
     gaps.Add(new SomeValue() { 
      ...some dummy values.. }); 

     compareAt = compareAt.AddTicks(ticks.Ticks); 
    } 

時間が過ぎてもこの実行は多すぎます。たいていの場合、この配列には365 * 24 = 8760の値があります。将来的には、月に分/秒(60*24*31=44640)となります。つまり、は使用できません。です。

アレイが最も頻繁に完了した場合(空白/空きスロットがないことを意味します)、簡単にif (range.Count() == (hours/day * days))をバイパスすることができます。しかし、その日は今日ではありません。

どうすればより効果的に解決できますか?

1つの例:配列内の値が7800の場合、約950が欠けています。しかし、ギャップ・エンディングだけを見つけて欠損値を作成することはできますか?これは、o表記法が値の量ではなく、ギャップの量に依存するようになります。

他の歓迎の答えはほんの一層効果的なループです。

[編集] 申し訳ありませんが、英語が苦手です。

+0

私はあなたの質問を2回読みましたが、私はあなたがここで何を求めているのかまだ分かりません。 "配列の空白"は、配列の空のスロットについて話していますか?または間隔?もっと理にかなっているように質問を書き直してください。 –

+0

申し訳ありませんが、あなたがしたいことを理解できません。 – Jodrell

+0

@Lasse Gapsは空のスロットを意味します!英語のために申し訳ありません。時間は '20110101 00:00 - 20110601 23:00'からですが、' 20110303 14:00 20110304 04:00'との間に欠けている値があります – Independent

答えて

0

範囲検索でインデックスが使用されておらず、毎回範囲全体が再チェックされるため、パフォーマンスが低下します。

これをより迅速に行う方法の1つです。

if (ticks.TypeOf == Period.Hour) 
    { 
     // fill a hashset with the range's unique hourly values 
     var rangehs = new HashSet<DateTime>(); 
     foreach (var r in range) 
     { 
      rangehs.Add(r.time.AddMinutes(-r.time.Minute)); 
     } 

     // walk all the hours 
     while (compareAt <= endAt) 
     { 
      // quickly check if it's a gap 
      if (!rangehs.Contains(compareAt)) 
       gaps.Add(new SomeValue() {  ...some dummy values..}); 

      compareAt = compareAt.AddTicks(ticks.Ticks); 
     } 
    }