📜  用于查找随时间重复的数字序列的打字稿算法 - TypeScript (1)

📅  最后修改于: 2023-12-03 14:56:21.409000             🧑  作者: Mango

用于查找随时间重复的数字序列的打字稿算法 - TypeScript

在编写应用程序时,可能需要查找随着时间重复出现的数字序列。以下是一种在 TypeScript 中实现查找算法的打字稿。

算法
/**
 * 查找随时间重复的数字序列。
 * 
 * @param data 要查找的数字序列
 * @param windowSize 移动窗口的大小
 * @param threshold 相似度的阈值,如果两个序列的相似度大于阈值,则认为它们是重复的
 * 
 * @returns 重复数字序列的起始位置
 */
function findRepeatingSequence(data: number[], windowSize: number, threshold: number): number[] {
  const result = [];
  const windowedData = [];
  const patternData = [];

  // 初始化 sliding window 和 pattern data
  for (let i = 0; i < windowSize; i++) {
    windowedData.push(data[i]);
    patternData.push(data[i]);
  }

  // 移动窗口并查找重复序列
  for (let i = windowSize; i < data.length; i++) {
    // 移动窗口
    windowedData.shift();
    windowedData.push(data[i]);

    // 计算相似度
    const similarity = computeSimilarity(patternData, windowedData);

    // 如果相似度大于阈值,则认为它们是重复的
    if (similarity >= threshold) {
      result.push(i - windowSize + 1);
    }
  }

  return result;
}

/**
 * 计算两个数字序列的相似度。
 * 
 * @param sequenceA 第一个数字序列
 * @param sequenceB 第二个数字序列
 * 
 * @returns 相似度,介于 0 到 1 之间,1 表示两个序列完全相同
 */
function computeSimilarity(sequenceA: number[], sequenceB: number[]): number {
  if (sequenceA.length !== sequenceB.length) {
    throw new Error('两个数字序列必须具有相同的长度。');
  }

  let distance = 0;

  for (let i = 0; i < sequenceA.length; i++) {
    distance += Math.abs(sequenceA[i] - sequenceB[i]);
  }

  return 1 - distance / (sequenceA.length * 255);
}
解释

该算法的实现包括两个函数:findRepeatingSequencecomputeSimilarity

findRepeatingSequence 函数接受三个参数:要查找的数字序列 data,移动窗口的大小 windowSize 和相似度的阈值 threshold。首先,该函数初始化一个大小为 windowSize 的滑动窗口和一个与之相等的模式数据(即初始的数字序列)。接着,窗口从左到右移动,每次移动一格。对于每个位置,函数计算滑动窗口和模式数据之间的相似度,并将相似度与阈值进行比较。如果相似度大于阈值,则表示窗口包含了一个重复的数字序列,函数将记录其起始位置。最后,函数返回所有发现的重复数字序列的起始位置。

computeSimilarity 函数接受两个数字序列,计算它们之间的相似度。为了计算相似度,该函数计算序列中每个数字的距离(即两个数字之间的差的绝对值),并将它们累加到一起。最后,函数返回 1 减去距离之和除以数字序列长度乘以 255 的值。这个值介于 0(完全不相似)和 1(完全相同)之间。这个值越接近 1,表示两个数字序列越相似。

结论

该算法可以用于查找随时间重复的数字序列。它的时间复杂度为 O(n),其中 n 是数字序列的长度。要使用该算法,只需调用 findRepeatingSequence 函数,并传递数字序列、移动窗口大小和相似度阈值。函数将返回所有发现的重复数字序列的起始位置。

参考文献
  • "Finding Repeating Patterns in Time Series Data," by Michael J. Kane. Available online at https://computation.llnl.gov/projects/f2j/download/Finding_Repeating_Patterns_in_Time_Series_Data.pdf.