kmp openharmony 数组去重与频率统计器
本文介绍了一个基于Kotlin Multiplatform和OpenHarmony的数组去重与频率统计器。该工具采用哈希表实现O(n)时间复杂度的去重操作,支持按频率或数值排序,提供统计分析功能如最高/最低频率、平均频率等。文章详细拆解了哈希表统计频率、去重操作和排序等核心算法原理,并展示了Kotlin实现和ArkTS前端交互设计。工具适用于数据清洗、统计分析、异常检测等场景,具有高效算法、灵活排
数组去重与频率统计是数据处理中的基础操作,用于数据清洗、统计分析和异常检测。数组去重与频率统计器使用哈希表高效统计元素频率,去除重复元素,并按频率或数值排序输出,帮助快速了解数据分布特征。
本案例基于 Kotlin Multiplatform(KMP)与 OpenHarmony,实现了一个数组去重与频率统计器:
- 高效去重:使用哈希表实现 O(n) 时间复杂度的去重操作。
- 频率统计:统计每个元素的出现次数和占比。
- 多维度排序:支持按频率降序和按数值升序两种排序方式。
- 统计分析:提供最高/最低频率、平均频率等统计摘要。
一、问题背景与典型场景
典型场景:
- 数据清洗:去除数据中的重复记录,保证数据唯一性。
- 统计分析:统计数据中每个值出现的频率,了解数据分布。
- 异常检测:识别高频或低频元素,发现数据异常模式。
- 日志分析:分析日志中的错误码、状态码等出现的频率。
- 用户行为分析:统计用户访问路径、操作类型等的出现频率。
优势:
- 高效算法:使用哈希表实现 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 的元素。
示例输出:
🔍 数组去重与频率统计报告
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
原始数组长度: 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)作为主色调,与数据分析特性呼应。
- 垂直布局:所有内容垂直排列,信息流清晰。
- 紧凑设计:优化空间利用,减少滚动距离。
五、工程化落地建议
-
性能优化:
- 对于大数据集,可考虑流式处理或分块处理。
- 使用并行处理加速频率统计(适合大规模数据)。
-
扩展功能:
- Top-K 高频元素:返回出现频率最高的 K 个元素。
- 低频元素过滤:过滤出现频率低于阈值的元素。
- 频率分布直方图:可视化展示频率分布。
-
应用场景:
- 数据质量检查:识别数据中的重复记录和异常值。
- 用户行为分析:统计用户访问路径、操作类型等。
- 日志分析:分析错误码、状态码等的出现频率。
-
错误处理:
- 空数组检查:数组长度至少为 1。
- 数值验证:确保输入为有效数值。
- 内存限制:对于超大数组,考虑分批处理。
-
可视化建议:
- 绘制频率柱状图,直观展示频率分布。
- 使用饼图展示各元素的占比。
- 标注高频和低频元素,突出异常。
-
真实场景对接:
- 从数据库或日志文件提取数据。
- 实时统计流式数据的频率。
- 结合机器学习,识别数据中的异常模式。
六、算法变种与应用
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
更多推荐


所有评论(0)