c# - 许多 DateTime 的比较速度更快

标签 c# algorithm datetime big-o

在效率方面,我遇到了一项让我苦苦挣扎的任务。我有一个数据库,可以包含数十万笔交易和人员。我的目标是找到经常在彼此附近进行交易的人(X 人在 5 次不同的情况下在 Y 人的 10 分钟内进行了交易)。

我正在努力寻找一种有效的方法来解决这个问题。最简单的方法是:

foreach(var doc in db.Transactions.OrderBy(d => d.TransactionID))
{
    foreach(var doc2 in db.Transactions.Where(d => d.TransactionID > doc.TransactionID))
    {
        if(doc2.DateCreated.IsBetween(doc.DateCreated,minutes))
        {
           // hit found  
        }
    }
} 

(TransactionID 是一个 bigint 身份)。一旦我有了 hits 列表,就很容易计算出现次数。但这显然很差。运行时间是 enter image description here这在 1M+ 交易时会非常慢。我研究了一些算法,但找不到适用于我的情况的算法。任何人都可以提供关于从哪里开始加速的指导吗?

最佳答案

一些提示:

  1. 在数据库端执行(例如存储过程)- 加载和处理超过 100 万条记录会产生开销,即使算法得到改进也是如此。
  2. 将所有数据分成大小为 10 分钟的桶(假设 10 分钟是您的检测阈值)。然后对于每个桶,您只需要检查相邻的桶,这应该会减少比较操作量。
  3. 确保您在例如纪元时间以避免复杂的日期时间操作。

关于c# - 许多 DateTime 的比较速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22479892/

相关文章:

c# - 如何避免以优雅的方式创建不需要的对象?

algorithm - 一种最小化伪丢番图方程的快速算法

mysql - 在mysql中获取24小时后的日期

c# - 设置 Azure Webjob 时区

javascript - momentjs 并转换为 unix 给出了错误的日期

c# - 每分钟在控制台应用程序中执行代码

c# - Visual Studio 2013 和 Resharper 中的自动命名空间

c# - 在 C# 中将视频的所有帧提取为图像的最快方法是什么?

java - QuickSort 实现中的 ArrayIndexOutofBoundsException

java - 从图像样本中获取卷积矩阵?