在这里插入图片描述

在时序数据分析中,我们经常需要识别:

数据序列中的局部最大值(峰值)在哪里?
局部最小值(谷值)在哪里?
这些极值点是否对应重要的趋势转折?

序列峰值与谷值检测 (Peak and Valley Detection) 是一种基础但实用的时序分析方法,通过识别数据序列中的局部最大值和最小值,帮助我们快速定位趋势转折点、业务高峰和性能瓶颈。
本案例基于 Kotlin Multiplatform(KMP)与 OpenHarmony,实现了一个序列峰值与谷值检测器

  • 检测局部峰值(当前值大于前后两个值);
  • 检测局部谷值(当前值小于前后两个值);
  • 识别最高峰值和最低谷值;
  • 计算峰值-谷值差值和波动幅度;
  • 通过 ArkTS 单页面展示原始序列、峰值点、谷值点和所有极值点,帮助你直观理解数据波动模式。

一、问题背景与典型场景

典型场景包括:

  1. 性能瓶颈定位
    识别接口耗时序列中的峰值点,快速定位性能瓶颈时段,用于优化重点分析。

  2. 业务高峰识别
    检测订单量、访问量等业务指标序列中的峰值,识别业务高峰时段,用于资源调度和容量规划。

  3. 趋势转折点检测
    通过峰值和谷值的分布,识别上升趋势转为下降趋势的转折点,用于趋势预测和决策。

  4. 周期性模式识别
    分析峰值和谷值的间隔,识别数据的周期性模式,用于预测和资源规划。

  5. 异常波动检测
    当峰值或谷值异常突出时,可能表示发生了异常事件(如故障、攻击、活动爆发等)。

相比复杂模型,峰值谷值检测的优势在于:

  • 实现简单,计算高效,适合实时分析;
  • 结果直观,峰值和谷值直接对应数据的关键转折点;
  • 适用于任何时序数据,无需假设数据分布;
  • 可以快速识别趋势转折和异常波动。

二、Kotlin 峰值谷值检测引擎

1. 输入格式设计

本案例沿用统一的文本输入风格:

series=10,12,11,13,15,18,20,19,17

或直接输入数值序列:

10,12,11,13,15,18,20,19,17
2. 核心算法实现

App.kt 中,我们实现了 peakValleyDetector 函数:

@JsExport
fun peakValleyDetector(inputData: String): String {
    // 1. 解析输入序列
    val values = parseSeries(inputData)
    
    // 2. 检测峰值和谷值
    val peaks = mutableListOf<PeakValley>()
    val valleys = mutableListOf<PeakValley>()
    
    // 检测中间点的峰值和谷值
    for (i in 1 until values.size - 1) {
        val prev = values[i - 1]
        val curr = values[i]
        val next = values[i + 1]
        
        // 峰值:当前值大于前后两个值
        if (curr > prev && curr > next) {
            peaks += PeakValley(i, curr, "峰值")
        }
        // 谷值:当前值小于前后两个值
        else if (curr < prev && curr < next) {
            valleys += PeakValley(i, curr, "谷值")
        }
    }
    
    // 3. 处理边界情况
    // 第一个点:如果大于第二个点,可能是峰值
    if (values[0] > values[1]) {
        peaks += PeakValley(0, values[0], "峰值(起点)")
    }
    // 最后一个点:如果大于倒数第二个点,可能是峰值
    if (values.last() > values[values.size - 2]) {
        peaks += PeakValley(values.size - 1, values.last(), "峰值(终点)")
    }
    
    // 4. 统计摘要
    val maxPeak = peaks.maxByOrNull { it.value }
    val minValley = valleys.minByOrNull { it.value }
    val peakValleyDiff = if (maxPeak != null && minValley != null) {
        maxPeak.value - minValley.value
    } else null
    
    // 5. 生成报告
    return buildReport(...)
}
3. 关键检测逻辑

峰值检测

  • 条件:value[i] > value[i-1] && value[i] > value[i+1]
  • 含义:当前值大于前后两个值,表示局部最大值
  • 用途:识别业务高峰、性能瓶颈、趋势转折点

谷值检测

  • 条件:value[i] < value[i-1] && value[i] < value[i+1]
  • 含义:当前值小于前后两个值,表示局部最小值
  • 用途:识别业务低谷、性能最优点、趋势转折点

边界处理

  • 第一个点:如果大于第二个点,标记为峰值(起点)
  • 最后一个点:如果大于倒数第二个点,标记为峰值(终点)

统计摘要

  • 最高峰值:所有峰值中的最大值
  • 最低谷值:所有谷值中的最小值
  • 峰值-谷值差值:反映数据波动幅度
  • 波动幅度:差值相对于最低谷值的百分比

三、OpenHarmony ArkTS 前端集成

1. 导入 Kotlin/JS 函数

index.ets 中导入:

import { peakValleyDetector } from './hellokjs'
2. 状态变量定义
@State seriesInput: string = "10,12,11,13,15,18,20,19,17"
@State result: string = ""
@State isLoading: boolean = false
3. 执行分析逻辑
executeDemo() {
  this.isLoading = true
  
  const seriesLine = this.seriesInput.includes('series=') 
    ? this.seriesInput 
    : `series=${this.seriesInput}`
  const payload = seriesLine
  
  setTimeout(() => {
    try {
      this.result = peakValleyDetector(payload)
    } catch (e) {
      this.result = "❌ 执行失败: " + e.message
    }
    this.isLoading = false
  }, 100)
}
4. UI 布局设计
  • 顶部标题栏:使用渐变背景(橙色-红色主题),展示"序列峰值与谷值检测"标题
  • 输入区域:单行文本输入框,支持 series=... 格式或直接输入数值序列
  • 执行按钮:运行分析按钮和重置按钮
  • 结果展示区:使用 Scroll 组件展示分析报告,包括原始序列、峰值点列表、谷值点列表、统计摘要和所有极值点

四、算法复杂度分析

  • 时间复杂度:O(n),其中 n 为序列长度。需要遍历序列一次检测峰值和谷值。
  • 空间复杂度:O(n),最坏情况下需要存储所有峰值和谷值点。

五、工程化应用建议

  1. 趋势转折告警
    当检测到峰值后出现谷值,或谷值后出现峰值时,可能表示趋势转折,可以触发告警。

  2. 周期性模式识别
    分析峰值和谷值的间隔,如果间隔相对固定,可能表示数据具有周期性模式。

  3. 异常波动检测
    当峰值或谷值异常突出(如超过历史均值的 3 倍标准差)时,可能表示发生了异常事件。

  4. 资源调度优化
    基于峰值和谷值的分布,优化资源调度策略,在峰值时段增加资源,在谷值时段减少资源。

  5. 容量规划
    基于峰值点的值,进行容量规划,确保系统能够应对峰值负载。

  6. 性能优化重点
    识别峰值点对应的时段,作为性能优化的重点分析对象。


六、算法优化建议

  1. 平滑预处理
    对于噪声较大的数据,可以先进行平滑处理(如移动平均),再检测峰值和谷值。

  2. 阈值过滤
    可以设置最小峰值高度或最大谷值深度阈值,过滤掉不显著的极值点。

  3. 窗口大小调整
    可以调整检测窗口大小(如检测前后 k 个点),适应不同尺度的波动。

  4. 多尺度检测
    在不同时间尺度上检测峰值和谷值,识别短期波动和长期趋势。


七、总结

序列峰值与谷值检测是时序数据分析的基础工具,通过识别局部最大值和最小值,可以快速定位趋势转折点、业务高峰和性能瓶颈。本案例展示了如何在 KMP + OpenHarmony 架构下实现一个轻量级的峰值谷值检测器,适用于性能分析、业务监控、趋势预测等场景。

核心优势

  • 实现简单,计算高效
  • 结果直观,易于理解
  • 适用广泛,无需假设
  • 可扩展性强,可结合其他方法

适用场景

  • 性能瓶颈定位
  • 业务高峰识别
  • 趋势转折点检测
  • 周期性模式识别
  • 异常波动检测

通过本案例,你可以快速掌握峰值谷值检测的核心思想,并在实际项目中灵活应用。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐