如何优化Swift一维数组生成二维数组组合的代码执行速度
问题分析
当前代码执行慢的核心原因有两个:
- 双重循环生成了完整的
n*n规模的二维数组,数组长度随原数组长度呈平方级增长,内存申请、元素写入的开销会随数据量上涨快速升高 - 对全量二维数组做排序的时间复杂度为
O(n² log n),而你的最终需求只是取排序后第k-1位的元素,全量生成数组+全量排序的操作完全是冗余的。
优化思路
你要求的排序规则本质是:先按数对第一个元素升序,第一个元素相同时按第二个元素升序。只要先把原一维数组做升序排序,所有两两组合的排列规律是完全可计算的:
排序后的原数组每个元素作为数对第一位时,会依次搭配排序后数组的所有元素作为第二位,刚好凑齐n个有序数对,不需要遍历生成所有组合,也不需要做全量排序。
优化后代码
let arr = [2, 2, 1] let k = 5 // 仅对原一维数组做升序排序 let sortedSingleArr = arr.sorted() let arrCount = sortedSingleArr.count // 通过整除、取模直接定位第k个数对的索引位置(k从1开始计数,所以先减1转成0基索引) let firstIndex = (k - 1) / arrCount let secondIndex = (k - 1) % arrCount let result = [sortedSingleArr[firstIndex], sortedSingleArr[secondIndex]] print(result)
用你给出的测试用例验证:原数组排序后为[1,2,2],arrCount=3,k=5时firstIndex=(5-1)/3=1,secondIndex=(5-1)%3=1,最终输出[2,2],和原代码运行结果完全一致。
性能对比
- 原实现:时间复杂度
O(n² log n),空间复杂度O(n²),当原数组长度为10000时,需要生成1亿个元素的二维数组,内存占用超过3GB,排序耗时极长 - 优化后实现:时间复杂度
O(n log n)(仅原数组排序的开销),空间复杂度O(n),同等数据量下内存占用仅几百KB,执行速度提升可达上万倍。
内容的提问来源于stack exchange,提问作者pacifistazero
相关产品推荐
相关产品推荐

