在这里插入图片描述

数组去重与频率统计是数据处理中的基础操作,用于数据清洗、统计分析和异常检测。数组去重与频率统计器使用哈希表高效统计元素频率,去除重复元素,并按频率或数值排序输出,帮助快速了解数据分布特征。

本案例基于 Kotlin Multiplatform(KMP)与 OpenHarmony,实现了一个数组去重与频率统计器

  • 高效去重:使用哈希表实现 O(n) 时间复杂度的去重操作。
  • 频率统计:统计每个元素的出现次数和占比。
  • 多维度排序:支持按频率降序和按数值升序两种排序方式。
  • 统计分析:提供最高/最低频率、平均频率等统计摘要。

一、问题背景与典型场景

典型场景:

  1. 数据清洗:去除数据中的重复记录,保证数据唯一性。
  2. 统计分析:统计数据中每个值出现的频率,了解数据分布。
  3. 异常检测:识别高频或低频元素,发现数据异常模式。
  4. 日志分析:分析日志中的错误码、状态码等出现的频率。
  5. 用户行为分析:统计用户访问路径、操作类型等的出现频率。

优势:

  • 高效算法:使用哈希表实现 O(n) 时间复杂度,O(k) 空间复杂度(k 为唯一值数量)。
  • 灵活排序:支持按频率和数值两种维度排序,满足不同分析需求。
  • 直观展示:清晰展示去重结果、频率统计和占比信息。
  • 易于扩展:可扩展为 Top-K 高频元素、低频元素过滤等功能。

二、数组去重与频率统计原理拆解

1. 哈希表统计频率

使用哈希表(Map)统计每个元素的出现频率:

val frequency = mutableMapOf<Double, Int>()
for (value in values) {
    frequency[value] = (frequency[value] ?: 0) + 1
}

复杂度分析

  • 时间复杂度:O(n) - 遍历数组一次
  • 空间复杂度:O(k) - k 为唯一值的数量
2. 去重操作

哈希表的键(keys)即为去重后的唯一值:

val uniqueValues = frequency.keys.toList().sorted()

复杂度分析

  • 时间复杂度:O(k log k) - k 为唯一值数量,排序所需
  • 空间复杂度:O(k)
3. 按频率排序

使用自定义比较器按频率降序排序,频率相同则按数值升序:

val sortedByFreq = frequency.entries.sortedWith(
    compareByDescending<Map.Entry<Double, Int>> { it.value }
        .thenBy { it.key }
)
4. 完整流程示例
输入数组: [1, 2, 3, 2, 4, 3, 5, 1, 2, 6]

步骤1: 统计频率
  frequency = {
    1: 2,   // 出现 2 次
    2: 3,   // 出现 3 次
    3: 2,   // 出现 2 次
    4: 1,   // 出现 1 次
    5: 1,   // 出现 1 次
    6: 1    // 出现 1 次
  }

步骤2: 获取唯一值
  uniqueValues = [1, 2, 3, 4, 5, 6]

步骤3: 按频率排序
  频率降序: [2(3次), 1(2次), 3(2次), 4(1次), 5(1次), 6(1次)]
  数值升序: [1(2次), 2(3次), 3(2次), 4(1次), 5(1次), 6(1次)]

三、Kotlin 数组去重与频率统计引擎

1. 输入格式设计

统一文本输入:

series=1,2,3,2,4,3,5,1,2,6
  • series:数值序列,逗号/空格/分号分隔。
2. 核心算法实现 (arrayDeduplicationAndFrequencyCounter)
@JsExport
fun arrayDeduplicationAndFrequencyCounter(inputData: String): String {
    // 解析输入
    val values = mutableListOf<Double>()
    // ... 解析逻辑 ...
    
    // 统计频率
    val frequency = mutableMapOf<Double, Int>()
    for (value in values) {
        frequency[value] = (frequency[value] ?: 0) + 1
    }
    
    // 获取唯一值(去重)
    val uniqueValues = frequency.keys.toList().sorted()
    
    // 按频率排序
    val sortedByFreq = frequency.entries.sortedWith(
        compareByDescending<Map.Entry<Double, Int>> { it.value }
            .thenBy { it.key }
    )
    
    // 生成报告...
}

实现要点:

  • 哈希表统计:使用 MutableMap 高效统计频率,时间复杂度 O(n)。
  • 自动去重:哈希表的键自动保证唯一性。
  • 灵活排序:支持按频率和数值两种排序方式。
  • 占比计算:计算每个元素出现频率占总数的百分比。
3. 输出格式

报告包含:

  1. 摘要信息:原始数组长度、唯一值数量、重复元素数量。
  2. 原始数组:完整的输入数据序列。
  3. 去重后数组:去除重复元素后的唯一值列表。
  4. 频率统计(按频率降序):每个元素的出现次数和占比。
  5. 频率统计(按数值升序):每个元素的出现次数和占比。
  6. 统计摘要:最高/最低频率、平均频率等。
  7. 重复元素识别:列出所有出现次数 > 1 的元素。

示例输出:

🔍 数组去重与频率统计报告
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
原始数组长度: 10
唯一值数量: 6
重复元素数量: 4

📊 原始数组
索引: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
数值: 1 | 2 | 3 | 2 | 4 | 3 | 5 | 1 | 2 | 6

✨ 去重后数组
长度: 6
数值: 1, 2, 3, 4, 5, 6

📈 频率统计(按频率降序)
数值 | 出现次数 | 占比
-----|---------|------
2 |    3    | 30.00%
1 |    2    | 20.00%
3 |    2    | 20.00%
4 |    1    | 10.00%
5 |    1    | 10.00%
6 |    1    | 10.00%

🔄 重复元素(出现次数 > 1)
- 数值 1: 出现 2 次
- 数值 2: 出现 3 次
- 数值 3: 出现 2 次

四、ArkTS 前端布局与交互(pages/Index.ets

1. 布局设计

采用卡片式垂直布局,与之前的左右分栏布局形成对比:

  • 顶部标题栏:橙色主题(#FF9800)
  • 功能说明卡片:浅橙色背景,展示功能特性
  • 输入卡片:白色卡片,包含输入框和快速填充按钮
  • 执行按钮:醒目的橙色按钮
  • 结果卡片:白色卡片,展示统计结果
2. 交互功能
  • 快速填充示例
    • “示例1”:基础测试数据(含重复)
    • “示例2”:高频重复数据
    • “示例3”:复杂重复模式
  • 清除功能:一键清空输入和结果
  • 实时执行:点击"🚀 开始统计"后,异步调用 Kotlin 函数并显示结果。
  • 状态反馈:加载中显示进度条,执行完成显示详细结果。
3. 调用方式
import { arrayDeduplicationAndFrequencyCounter } from './hellokjs'

private executeCase() {
  this.isLoading = true
  setTimeout(() => {
    try {
      let output: string = arrayDeduplicationAndFrequencyCounter(this.inputValue)
      this.result = output
    } catch (error) {
      this.result = `❌ 执行出错: ${error}`
    } finally {
      this.isLoading = false
    }
  }, 100)
}

布局改动侧重:

  • 卡片式设计:使用白色卡片区分不同功能模块。
  • 橙色主题:采用橙色系(#FF9800)作为主色调,与数据分析特性呼应。
  • 垂直布局:所有内容垂直排列,信息流清晰。
  • 紧凑设计:优化空间利用,减少滚动距离。

五、工程化落地建议

  1. 性能优化

    • 对于大数据集,可考虑流式处理或分块处理。
    • 使用并行处理加速频率统计(适合大规模数据)。
  2. 扩展功能

    • Top-K 高频元素:返回出现频率最高的 K 个元素。
    • 低频元素过滤:过滤出现频率低于阈值的元素。
    • 频率分布直方图:可视化展示频率分布。
  3. 应用场景

    • 数据质量检查:识别数据中的重复记录和异常值。
    • 用户行为分析:统计用户访问路径、操作类型等。
    • 日志分析:分析错误码、状态码等的出现频率。
  4. 错误处理

    • 空数组检查:数组长度至少为 1。
    • 数值验证:确保输入为有效数值。
    • 内存限制:对于超大数组,考虑分批处理。
  5. 可视化建议

    • 绘制频率柱状图,直观展示频率分布。
    • 使用饼图展示各元素的占比。
    • 标注高频和低频元素,突出异常。
  6. 真实场景对接

    • 从数据库或日志文件提取数据。
    • 实时统计流式数据的频率。
    • 结合机器学习,识别数据中的异常模式。

六、算法变种与应用

1. Top-K 高频元素

返回出现频率最高的 K 个元素:

val topK = sortedByFreq.take(k).map { it.key }
2. 低频元素过滤

过滤出现频率低于阈值的元素:

val filtered = frequency.entries
    .filter { it.value >= threshold }
    .map { it.key }
3. 频率分组

按频率范围分组元素:

val freqGroups = frequency.entries.groupBy {
    when {
        it.value >= 10 -> "高频(≥10)"
        it.value >= 5 -> "中频(5-9)"
        else -> "低频(<5)"
    }
}
4. 应用场景扩展
  • 数据清洗:去除重复记录,保证数据唯一性。
  • 统计分析:了解数据分布特征。
  • 异常检测:识别高频或低频异常模式。
  • 推荐系统:统计用户偏好,推荐热门内容。
  • A/B 测试:统计不同版本的访问频率。

七、快速检查清单

  • 输入格式正确:series=数值序列
  • 数组长度验证:数组长度至少为 1。
  • 频率统计准确:每个元素的出现次数正确。
  • 去重结果正确:唯一值列表准确。
  • 排序功能正常:按频率和数值排序正确。
  • 占比计算准确:频率占比计算正确。
  • 重复元素识别:正确列出所有重复元素。
  • 统计摘要完整:提供最高/最低频率、平均频率等。
  • UI 布局清晰:卡片式设计,橙色主题,信息流清晰。
  • 示例加载功能正常:快速填充预设测试数据。

八、总结

数组去重与频率统计器通过哈希表实现了高效的数据处理,帮助我们:

  • 快速去重:使用哈希表实现 O(n) 时间复杂度的去重操作。
  • 频率统计:统计每个元素的出现次数和占比,了解数据分布。
  • 灵活排序:支持按频率和数值两种排序方式,满足不同分析需求。
  • 工程化应用:在数据清洗、统计分析、异常检测等领域广泛应用。

结合 KMP 与 OpenHarmony,我们实现了轻量级的数组去重与频率统计器,为数据处理提供了有力的工具支持。

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

Logo

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

更多推荐