保存排序数组 - 反向排序输入案例

问题描述

我从用户那里(一个接一个)获取整数,并通过运行二分搜索并找到插入索引将其插入到已排序的 vec 中的正确位置。 问题是当用户决定提供一个反向排序的输入(一个一个)时,插入将是昂贵的,O(n^2),因为在每次插入时,vec 中的所有当前元素都必须向右移动.有没有一种算法可以用更少的时间处理这个问题?

示例:

[] <- 10
[10] <- 9 // Shift x1
[9,10] <- 8 // Shift x2
[8,9,10] <- 7 // Shift x3
[7,8,10] <- 6 // Shift x4
.
.
.

解决方法

问题是当用户决定提供一个反向排序的输入(一个接一个)时,插入将是昂贵的,O(n^2),因为在每次插入时,vec 中的所有当前元素都必须移动向右。

Vec 实现将一次移动所有内容(使用 memcpy),因此移动 20 项和移动 1 并没有真正的区别。如果集合巨大,内存流量将开始成为一个问题,但在低数量时,您可以将其视为常量。

有没有一种算法可以用更少的时间处理这个问题?

一种内在排序的基于树的数据结构。但是 Rust 标准库在这方面有些限制,并且 BTreeSet 仅在您进行重复数据删除时才有效。不过不确定它是否会击败常规 Vec,因为它会有更多的分配。

虽然 LinkedList 理论上提供 O(1) 插入,但 Rust 不提供插入 API,因为没有 Cursor,因此您需要支付 O(n-i) 来查找插入索引,之后 insert() 将再次支付该费用以遍历相关索引并插入新项目。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...