java - 在排序数组中间添加值的最快方法 - Java

标签 java arrays

我有一个排序数组,假设 D={1,2,3,4,5,6},我想在中间添加数字 5。我可以通过在中间添加值 5 并将其他值向右移动一步来做到这一点。

问题是我有一个长度为 1000 的数组,我需要执行该操作 10.000 次,所以我需要一种更快的方法。

我有什么选择?我可以使用 LinkedList 来获得更好的性能吗?

最佳答案

这取决于您如何添加这些数字。如果仅按升序或降序排列 - 那么是的,LinkedList 可以解决问题,但前提是您在插入之间保留节点引用。

如果您以任意顺序添加数字,您可能需要解构数组,添加新条目并再次重建它。通过这种方式,您可以使用擅长添加和删除条目的数据结构,同时保持“排序”。然而,您必须放松您的假设之​​一。

选项 1
假设您在添加数字时不需要恒定时间随机访问:

使用二叉排序树。

缺点 - 在添加时,您无法通过元素的位置读取或引用元素,至少不容易。最好的情况 - 您使用的树可以跟踪左节点有多少个元素,并且可以在 log(n) 时间内获取第 i 个元素。如果您只是迭代元素,您仍然可以获得相当好的性能。

总运行时间从 n^2 降至 n * log(n)。随机访问是log(n)

选项 2
假设您在添加元素时不需要对元素进行排序。

使用普通数组,但在其末尾添加元素,完成后对其进行排序。

总运行时间:n * log(n)。随机访问的时间复杂度为O(1),但元素未排序。

选项 3
(这有点作弊,但是......)
如果您的值数量有限,那么采用 BucketSort 的思想将帮助您实现出色的性能。本质上 - 您可以用排序的映射替换数组。

运行时为O(n),随机访问为O(1),但只适用于极少数情况。

TL;DR
获取任意值、快速添加和恒定时间位置访问,同时保持排序性是很困难的。我不知道任何这样的结构。您必须放松一些假设才能有优化空间。

关于java - 在排序数组中间添加值的最快方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238427/

相关文章:

java - 创建对话框时如何设置模糊背景

java - 使用凭据缓存的 Kerberos 身份验证通过 Eclipse 工作,但不能通过命令行工作

java - JTidy java API toConvert HTML to XHTML

php - 如何检查 PHP 哈希表中是否存在键?

java - 使用线程填充 JList

java - 是否可以使用 Maven 生成带有日期的文本文件?

c - 使用 stdlib.c 中的 qsort() 根据每个 *char 中的第三个字母对 C 中的字符串数组进行排序

java - 如何从jni将数组传递给java方法

javascript - 如何递归合并 2 个 javascript 对象?

php - 复杂的 Laravel 集合