根据最小时差

时间:2016-12-27 09:34:13

标签: c# linq

有两个不同大小的时间戳列表以及一个idx。例如,

L1 = {(1,t1), (2,t2),..., (M,tM)} and
L2 = {(1,T1), (2,T2),..., (N,TN)} with M < N

对于这两个列表,我们都有t1<t2<...<tMT1<T2<...<TN。每个列表的时间戳表示来自两个不同来源的项目到达时间。我们的目标是将(m,tm)(n,tn)的{​​{1}}和dist(tm,tn)->min分组为distdist(tm,tn)->min作为here?这意味着,最短列表将被上采样。一个有用的obervationn,只要C:\Windows\system32>pip install pydns Collecting pydns Using cached pydns-2.3.6.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\Shiva\AppData\Local\Temp\pip-build-294324_x\pydns\setup.py", line 12, in <module> import DNS File "C:\Users\Shiva\AppData\Local\Temp\pip-build-294324_x\pydns\DNS\__init__.py", line 14, in <module> import Type,Opcode,Status,Class ImportError: No module named 'Type' ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in C:\Users\Shiva\AppData\Local\Temp\pip-build-294324_x\pydns\ 完整填充,就足以停止遍历最长的列表。鉴于我完全不熟悉linq逻辑,你能否提出一个有效的方法来进行这样的分组?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为这基本上将两个列表合并在一起,假设它们已经排序。为了有效地做到这一点,你有两个选择,取决于M和N是否具有相似的大小,或者如果M <&lt;&lt; N(M的大小远小于N) 在这两种情况下,您都希望首先通过时间戳(升序

)对L2中的元素进行排序

M和N的大小相似
 在这种情况下,我们执行合并,类似于合并排序。

  1. 按升序对L1中的元素l进行排序
  2. 对于L1中的每个元素,遍历L2中的元素,直到找到时间戳大于l的第一个元素。现在将此元素与之前的元素进行比较,以找到更接近l的时间戳的元素,并将此配对保留在结果集中。
  3. M&lt;&lt; Ñ
    在这种情况下,执行二进制搜索以便在L2中找到最接近的元素可能更快。也就是说,对于L1中的每个元素,进行二分搜索以找到它将被添加到L1的位置。检查L1中的两个相邻元素,找到哪个元素具有最接近的时间戳,并将该对保存在结果集中。

答案 1 :(得分:0)

你的意思是这样的:

L1 = {(1,t1), (2,t2),..., (M,tM)} and
L2 = {(1,t1), (2,t2),..., (N,tN)} with M < N


var result = L1.Select(i => new {idx1 = i.Item1, 
                                 idx2 = L2.Min(l => label(i,l).Item1}
                      );

其中label是一个比较函数,它在时间戳之间为diff赋值(diff最短,值越小)。