KMP & OpenHarmony 实现二分查找

算法输出

简介

二分查找是一种高效的查找算法,适用于已排序的数组。通过不断将查找范围缩小一半,快速定位目标元素。本文将展示如何使用 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  // 未找到
}

代码说明:

  • 使用两个指针 leftright 标记查找范围
  • 每次计算中间位置 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)
    ↓
控制台输出结果

测试步骤

  1. 编译项目

    bash 复制代码
    cd D:\flutter_Obj\kjsdemo-master
    ./gradlew jsJar
  2. 构建 OpenHarmony 应用

    bash 复制代码
    cd kmp_ceshiapp
    hvigor build
  3. 运行应用

    • 在 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)

优化建议

  1. 递归实现:使用递归方式实现二分查找,代码更简洁
  2. 左闭右开 :使用 [left, right) 的区间表示,避免边界问题
  3. 查找范围:可以扩展为查找第一个和最后一个目标元素

总结

通过 KMP 和 OpenHarmony 的结合,我们可以:

  • 在 Kotlin 中编写高效的查找算法
  • 自动编译为 JavaScript
  • 在 OpenHarmony 应用中无缝调用
  • 在控制台查看实时输出

二分查找是最常用的查找算法,时间复杂度为 O(log n),非常高效。


相关推荐
坚果派·白晓明1 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
熊猫钓鱼>_>3 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
ITUnicorn3 小时前
【HarmonyOS6】ArkTS 自定义组件封装实战:动画水杯组件
华为·harmonyos·arkts·鸿蒙·harmonyos6
晚霞的不甘3 小时前
Flutter for OpenHarmony 构建简洁高效的待办事项应用 实战解析
flutter·ui·前端框架·交互·鸿蒙
廖松洋(Alina)4 小时前
【收尾以及复盘】flutter开发鸿蒙APP之成就徽章页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)4 小时前
【收尾以及复盘】flutter开发鸿蒙APP之打卡日历页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)5 小时前
【收尾以及复盘】flutter开发鸿蒙APP之本月数据统计页面
flutter·华为·开源·harmonyos·鸿蒙
gjxDaniel21 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
我讲个笑话你可别哭啊1 天前
鸿蒙ArkTS快速入门
前端·ts·arkts·鸿蒙·方舟开发框架
mocoding1 天前
使用已经完成鸿蒙化适配的Flutter本地持久化存储三方库shared_preferences让你的应用能够保存用户偏好设置、缓存数据等
flutter·华为·harmonyos·鸿蒙