我有一个排序数组,比方说D = {1,2,3,4,5,6},我想在中间添加数字5。我可以通过在中间添加值5并将其他值向右移动一步来实现。
问题是我有一个长度为1000的数组,我需要进行10.000次操作,所以我需要更快的方法。
我有哪些选择?我可以使用LinkedLists获得更好的性能吗?
答案 0 :(得分:2)
这取决于你如何添加所述数字。如果只是按升序或降序排列 - 那么是,LinkedList
将完成这一操作,但前提是在插入之间保留节点引用。
如果您以任意顺序添加数字,您可能需要解构数组,添加新条目并重新构建它。这样,您可以使用擅长添加和删除条目的数据结构,同时保持"排序性"。但是你必须放松一下你的假设。
选项1
假设您在添加数字时不需要定时随机访问:
使用二进制排序树。
缺点 - 当你添加时,你不能按照他们的位置阅读或引用元素,至少不容易。最佳案例场景 - 您正在使用一棵树来跟踪左侧节点有多少元素,并且可以在i
时间内获得log(n)
元素。如果你只是迭代这些元素,你仍然可以获得相当不错的表现。
总运行时间从n * log(n)
降至n^2
。随机访问是log(n)
。
选项2
假设您在添加元素时不需要排序元素。
使用普通数组,但在元素末尾添加元素,然后在完成后对其进行排序。
总运行时间:n * log(n)
。随机访问是O(1)
,但元素未排序。
选项3
(这有点作弊,但......)
如果您的数值有限,那么采用BucketSort
的概念将有助于您获得出色的表现。基本上 - 您将使用有序地图替换您的数组。
运行时为O(n)
,随机访问为O(1)
,但它仅适用于极少数情况。
<强> TL; DR 强>
获得任意值,快速添加和恒定时间位置访问,同时保持排序很困难。我不知道任何这样的结构。您必须放松一些假设才能获得优化空间。
答案 1 :(得分:0)
如果有的话,LinkedList
可能对你没什么帮助。基本上,您正在交换将插入上的每个值转换为必须遍历每个节点以便到达插入点的成本。
每次访问每个节点时,也需要支付此遍历成本。 LinkedList
作为队列闪耀,但如果您需要单独访问内部节点,那么它不是一个好选择。
在您的情况下,您需要某种排序树。 BST(平衡搜索树,也称为排序二叉树)是最简单的类型之一,可能是一个很好的起点。
一个好的选项是TreeSet,如果您只是需要跟踪一组已排序的数字,它可能在功能上等同于您使用数组的方式。
答案 2 :(得分:-2)
使用ArrayList,一个整数数组列表。
ArrayList<Integers> intList = new ArryList<Integers>();
在ArrayList中,如果在已经存储了元素的索引处添加元素,则不会覆盖该元素,其索引只会递增,以便保留所有数据。 请点击此链接了解更多
这个类有许多有用的预定义函数,在下面给出的链接中有解释 http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html