我有一個電話呼叫的數據結構。對於這個問題有兩個字段,CallTime
和NumberDialled
。用於記錄分析的滑動時間窗口
我想執行的分析是「是否有兩個以上的電話在10秒窗口在同一號」集合是通過CallTime
已經排序,是一個List<Cdr>
。
我的解決辦法是
List<Cdr> records = GetRecordsSortedByCallTime();
for (int i = 0; i < records.Count; i++)
{
var baseRecord = records[i];
for (int j = i; j < records.Count; j++)
{
var comparisonRec = records[j];
if (comparisonRec.CallTime.Subtract(baseRecord.CallTime).TotalSeconds < 20)
{
if (comparisonRec.NumberDialled == baseRecord.NumberDialled)
ReportProblem(baseRecord, comparisonRec);
}
else
{
// We're more than 20 seconds away from the base record. Break out of the inner loop
break;
}
}
}
WHIS是醜陋的,至少可以說。有沒有更好,更乾淨,更快捷的方法?
雖然我沒有在大型數據集上測試過,但我會在每小時運行100,000條記錄,因此每條記錄都會有大量的比較結果。
更新的數據是由沒有時間數量排序如問題
如果數據不是按其性質排序的,我可能會對其進行排序並將第二個循環限制在10秒內的下一個循環中。 – kenny
當然,不需要每小時檢查一次所有100.000條記錄?我會假設你只檢查自上次檢查後新調用的那些號碼的通話記錄?表演應該沒問題,不要太重。我不知道你怎麼能更好地做你的推拉窗。 – Jaapjan