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


相关推荐
方白羽5 小时前
Android多层嵌套RecyclerView滚动
android·java·kotlin
方白羽8 小时前
Kotlin遇上Java 静态方法
android·java·kotlin
用户693717500138411 小时前
11.Kotlin 类:继承控制的关键 ——final 与 open 修饰符
android·后端·kotlin
用户693717500138411 小时前
10.Kotlin 类:延迟初始化:lateinit 与 by lazy 的对决
android·后端·kotlin
KotlinKUG贵州11 小时前
SpringGateway-MVC对SSE转发出现阻塞响应问题的分析和解决
spring·spring cloud·kotlin
zhangphil12 小时前
Android宽高不均等Bitmap缩放为指定宽高FitCenter到正方形Bitmap,Kotlin
android·kotlin
alexhilton1 天前
深入理解withContext和launch的真正区别
android·kotlin·android jetpack
g***B7381 天前
Kotlin协程在Android中的使用
android·开发语言·kotlin
A***27951 天前
Kotlin反射机制
android·开发语言·kotlin