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),非常高效。


相关推荐
A0微声z16 小时前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton1 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream2 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam2 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker2 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
糖猫猫cc2 天前
Kite:两种方式实现动态表名
java·kotlin·orm·kite
如此风景3 天前
kotlin协程学习小计
android·kotlin
Kapaseker3 天前
你搞得懂这 15 个 Android 架构问题吗
android·kotlin
zh_xuan3 天前
kotlin 高阶函数用法
开发语言·kotlin
colicode3 天前
安卓Android语音验证码接口API示例代码:Kotlin/Java版App验证开发
android·java·前端·前端框架·kotlin·语音识别