arrays - 对数组进行排序并检索排序后的索引
问题描述
我想按他的索引对数组进行排序。
看下面的代码:
var distances = [530, 0, 24, 335, 274, 591];
console.log(sortIndex(distances));
function sortIndex(toSort) {
return toSort.map(
(e,i) => {return {index: i, value: e};}
).sort(
(a,b) => a.value - b.value
).map(
(e,i) => {return e.index;},[]
);
}
输出是:
[1, 2, 4, 3, 0, 5]
有人能告诉我如何降低这个片段的复杂性吗?这个算法是O(n^3)
,我想知道你是否可以用更好的解决方案来解决同样的问题?
外面有人吗?谢谢。
解决方案
您可以通过创建数组和索引结构来获得更好的性能,其中复杂性在于我们只迭代数组一次。copy
hash
O(N)
var distances = [530, 0, 24, 335, 274, 591];
var copy = Object.assign([], distances);
var indexes = distances.reduce((hash, elem, i) => {
hash[elem] = i;
return hash;
}, {});
sortIndex = (toSort) => toSort.sort().map(el => indexes[el]);
console.log(sortIndex(copy));
所以,算法的最终复杂度是函数的复杂度sort
加上map
函数的复杂度。
因为sort
复杂度是Θ(n log(n))
。
对于该map
方法,复杂性是O(n)
因为您只迭代一次数组以通过提供的函数映射每个项目。callback
推荐阅读
- sas - 创建一个字符串在每个 ID 中出现多次的计数
- rest - 不允许使用 Spring Boot REST 方法 - 405 错误请求方法“GET”不支持
- sql - ACCESS 2016 SQL - 仅获取值更改的行
- vb.net - 使用 Linq 对一行中的多行查询进行排序
- xcode10 - Swift:Quick/Nimble 运行异步测试显示错误:'InvalidNimbleAPIUsage',原因:'expect(...).toEventually(...) 只能在主线程上运行。
- php - 如何使用 php 在网页中的任何文本元素旁边添加翻译按钮?
- java - 检查获取链中的任何对象是否为空,而无需检查每个深度
- python - Matplotlib 无法生成准确的滑块图
- python - 如何在 GUI 应用程序的 PyQtGraph 中等待鼠标交互时返回一个值
- angular - Karma istanbul 覆盖率报告在 Angular 中的代码更改时自动刷新