如何解决保存排序数组 - 反向排序输入案例
我从用户那里(一个接一个)获取整数,并通过运行二分搜索并找到插入索引将其插入到已排序的 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()
将再次支付该费用以遍历相关索引并插入新项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。