重新采样对象数组

计算科学 算法 排序
2021-12-24 01:39:58

语境

我有一个对象数组(或字典列表),根据每个对象的属性按顺序排序,比如time. 在 JSON 中,它看起来像这样:

[
  {'details': 'some details', 'time': 69},
  {'details': 'some details', 'time': 79},
  {'details': 'some details', 'time': 107},
  {'details': 'some details', 'time': 339},
  {'details': 'some details', 'time': 339},
  {'details': 'some details', 'time': 344},
  ...
]

每个条目代表我的程序在某个时间点的状态。这些条目是按顺序排列的,但在时间上间隔不均匀沿着代表时间的数字线的漂亮视觉效果可能如下所示:

在此处输入图像描述

所以我们有一系列称为快照的对象(Sn) 沿着时间线,其时间值在时间上不均匀地放置它们。

目标

我想重新采样这些快照对象,以便生成一个新的快照对象数组,但在时间上均匀分布。快速的视觉效果如下所示:

在此处输入图像描述

在这里您可以看到重新采样的时间线,其中重新采样的快照R对应于最新的可用快照S在对应的时间或之前发生的Rn. 根据定义,R0始终设置为与S0,因为它是不均匀和均匀快照的起点。

通过一些细节思考

有两种情况我们需要考虑 - (1) 当有超过 1 个时S之间Rs 和 (2) 当没有新的S之间Rs。下图演示了这两种情况:

在此处输入图像描述

我们看到R1, 一些Ss 已经过去了,所以我们跳过除了最近的相对R1, 和R1的样本返回S2(场景 1)。为了R2, 没有新的Ss 已经发生,所以基于我们掌握的信息的应用程序的状态仍然在S2, 和R2样品在S2也一样(场景 2)。或许这从上面的描述中已经很明显了。

写一个函数?

我一直在考虑这个问题,我一直在尝试使用一个函数来执行这个采样给定一组快照AS和采样间隔I. 我想让它尽可能高效。我的想法是复制AS(以免改变原来的)称为CS,然后开始从前面弹出快照CS. 这样,对于每一个R我们建立,我们继续从剩下的工作CS,从而减少我们必须通过原始快照进行的迭代次数并提高算法的效率。

我正在努力想出这样一个功能,鉴于这是一个多么简单的概念,我想知道它是否已经存在于某个地方?我需要在 TypeScript/Javascript 中实现这一点,但 python 或伪代码中的解决方案也会非常有帮助,甚至是“嘿,这是一个已经描述/解决的常见问题”的链接。

1个回答

As[1,,m]是一个数组m样品,在哪里说As[i].time给我们时间样本i被采取,并且我们假设项目按拍摄时间的升序排序。定义IR作为间隔新样本的时间间隔值,并定义Tf作为最后一次,在此之后您不想要任何等间距的样本。根据您的描述,您的算法可以用以下方式表示:

  • 输入时(As,I,Tf)
    1. 在里面R=[]作为新样本的空列表
    2. t=As[1].time作为初始时间
    3. i=1
    4. while(tTf)
      1. while(i<m and As[i+1].timet)
        1. 更新ii+1
      2. R.append(As[i])
      3. 更新tt+I
    5. return R

现在我们工作过去之后As[k]对于一些k,我们再也见不到它了。鉴于数组在调整大小时使用了一些加倍策略(这很常见),然后将一条新数据附加到R是一个与字典大小成正比的操作,称之为B. 这意味着我们算法的运行时间是O(m+(Tft1I)B), 在哪里t1=As[1].time. 这应该满足问题陈述中提到的效率标准。如果一个人正在使用一种带有指针的语言,则可以将指向字典的指针存储在R并去除因子B运行时的开销并将其替换为常量。