用途
该工具用于在共享Kotlin多平台代码中实现字符串编辑距离计算和模糊候选选择,避免引入外部依赖。典型场景包括:在候选列表中查找与查询字符串最接近的条目,并在相似度不足时明确拒绝匹配。
主要能力
- 双行编辑距离算法:使用两个整数数组(而非完整矩阵)计算Levenshtein距离,空间复杂度为O(n),避免每次迭代重新分配数组。
- 候选选择:基于距离值选择最佳匹配索引,可设置长度归一化的相似度阈值,在无合适匹配时返回null而非强行近似。
- 归一化处理:建议在计算前对小写、空白、重音符号等进行归一化,避免格式差异干扰距离度量。
- 索引安全:示例展示了如何避免压缩数组导致索引错位的问题,通过携带原始索引来保证结果正确。
- 无平台依赖验证:提供grep命令检查代码中是否混入java/android导入,确保可放入共享代码。
使用方式
核心函数为levenshtein(lhs: CharSequence, rhs: CharSequence): Int,通过嵌套循环计算距离。选择辅助函数bestMatchingIndex(query: String, candidates: List<String>): Int?返回最佳匹配的索引或null。用户可自定义阈值(建议使用1.0 - distance / maxOf(query.length, candidate.length, 1)计算相似度,并设置如0.8的阈值)。代码示例可直接复制到Kotlin多平台项目中。
适用场景
- 需要在KMP共享模块中进行简单模糊匹配,且不愿引入第三方库。
- 候选列表规模不大,且可以接受O(候选数 × 查询长度 × 候选长度)的时间复杂度。
- 需要明确区分“匹配”与“不匹配”,而不是总是返回最接近项。
限制
- 算法无提前退出,候选列表很大时性能较低,建议先用廉价键(首字符、长度范围、共享词元)过滤。
- 不适合用于自动补全前缀匹配、存在稳定ID的精确匹配、或跨文字/转写字符串的匹配。
- 绝对距离阈值在不同长度字符串间不等价,必须使用长度归一化相似度。
- 模糊匹配不应替代精确标识符匹配或已有排序信号。
- 日志不应放在匹配函数内部,以免影响性能。
暂未提供
资料未提供安装命令、包名、版本信息、许可证、具体收费模式或性能基准数据。