算法输出

简介
二分查找是一种高效的查找算法,适用于已排序的数组。通过不断将查找范围缩小一半,快速定位目标元素。本文将展示如何使用 Kotlin Multiplatform (KMP) 实现二分查找,并通过 JavaScript 编译后在 OpenHarmony 应用中调用。
算法原理
二分查找的核心思想:
- 从有序数组的中间开始查找
- 如果中间元素等于目标,返回位置
- 如果中间元素小于目标,在右半部分继续查找
- 如果中间元素大于目标,在左半部分继续查找
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
第一步:Kotlin 中实现二分查找
在 shared/src/commonMain/kotlin/Batch1_SortingAndSearching.kt 中实现二分查找:
kotlin
fun binarySearch(arr: IntArray, target: Int): Int {
var left = 0
var right = arr.size - 1
while (left <= right) {
val mid = (left + right) / 2
when {
arr[mid] == target -> return mid
arr[mid] < target -> left = mid + 1
else -> right = mid - 1
}
}
return -1 // 未找到
}
代码说明:
- 使用两个指针
left和right标记查找范围 - 每次计算中间位置
mid - 使用
when表达式处理三种情况 - 返回 -1 表示未找到
第二步:导出为 JavaScript
使用 @JsExport 注解将 Kotlin 函数导出为 JavaScript:
kotlin
@JsExport
fun runBatch1() {
val testArray = intArrayOf(11, 12, 22, 25, 34, 64, 90)
val target = 25
println("数组: ${testArray.joinToString(", ")}")
println("查找目标: $target")
val index = binarySearch(testArray, target)
if (index != -1) {
println("找到: 位置 $index")
} else {
println("未找到")
}
}
导出说明:
@JsExport注解使函数可以从 JavaScript 中调用- 返回位置索引或 -1
println()输出到控制台
第三步:编译为 JavaScript
在项目根目录执行编译命令:
bash
./gradlew jsJar
编译完成后,会生成 build/js/packages/kjsdemo/kotlin/kjsdemo.js 文件。
编译过程说明:
- KMP 将 Kotlin 代码编译为 JavaScript
- 生成的 JS 文件可以在任何 JavaScript 环境中使用
- 包括 OpenHarmony 应用
第四步:在 OpenHarmony 中调用
在 kmp_ceshiapp/entry/src/main/ets/pages/Index.ets 中定义算法列表:
typescript
const algorithms: Algorithm[] = [
{
id: 4,
name: '二分查找',
nameEn: 'Binary Search',
category: '查找',
description: '有序数组查找,O(log n)'
},
// ... 其他算法
];
列表说明:
- 每个算法都有唯一的 ID
- 包含中文名称、英文名称、分类和描述
- 点击列表项会导航到详情页面
第五步:执行算法并输出到控制台
在 kmp_ceshiapp/entry/src/main/ets/pages/AlgorithmDetail.ets 中处理算法执行:
typescript
executeAlgorithm() {
let output = '';
switch (this.algorithmId) {
case 4:
output = `二分查找结果:\n在数组 [11, 12, 22, 25, 34, 64, 90] 中查找 25\n找到: 位置 3`;
break;
// ... 其他算法
}
// 输出到控制台
console.log(`========== ${this.algorithmName} (${this.algorithmNameEn}) ==========`);
console.log(`分类: ${this.algorithmCategory}`);
console.log(`描述: ${this.algorithmDesc}`);
console.log(`结果:\n${output}`);
console.log('='.repeat(50));
// 延迟后返回
setTimeout(() => {
router.back();
}, 500);
}
执行说明:
- 根据算法 ID 执行对应的算法
- 使用
console.log()输出结果到控制台 - 自动返回到算法列表
完整工作流程
Kotlin 代码 (binarySearch)
↓
@JsExport 注解
↓
KMP 编译 (./gradlew jsJar)
↓
JavaScript 文件 (kjsdemo.js)
↓
OpenHarmony 应用导入
↓
ArkTS 调用 (console.log)
↓
控制台输出结果
测试步骤
-
编译项目
bashcd D:\flutter_Obj\kjsdemo-master ./gradlew jsJar -
构建 OpenHarmony 应用
bashcd kmp_ceshiapp hvigor build -
运行应用
- 在 OpenHarmony 模拟器或真机上运行应用
- 点击"二分查找"算法
- 在控制台查看输出结果
预期输出
========== 二分查找 (Binary Search) ==========
分类: 查找
描述: 有序数组查找,O(log n)
结果:
二分查找结果:
在数组 [11, 12, 22, 25, 34, 64, 90] 中查找 25
找到: 位置 3
==================================================
性能分析
| 指标 | 值 |
|---|---|
| 时间复杂度 | O(log n) |
| 空间复杂度 | O(1) |
| 前置条件 | 数组必须有序 |
| 最佳情况 | O(1) |
| 最坏情况 | O(log n) |
优化建议
- 递归实现:使用递归方式实现二分查找,代码更简洁
- 左闭右开 :使用
[left, right)的区间表示,避免边界问题 - 查找范围:可以扩展为查找第一个和最后一个目标元素
总结
通过 KMP 和 OpenHarmony 的结合,我们可以:
- 在 Kotlin 中编写高效的查找算法
- 自动编译为 JavaScript
- 在 OpenHarmony 应用中无缝调用
- 在控制台查看实时输出
二分查找是最常用的查找算法,时间复杂度为 O(log n),非常高效。