【发布时间】:2014-06-12 17:33:00
【问题描述】:
我有一个整数数组,它必须保持排序。因此,每次插入元素后,我都会调用Arrays.sort()。此外,我必须跟踪插入的最后一个元素,以便在以O(1) 复杂度进行排序后到达它。
例如,考虑以下场景:
int[] array = new int[10];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 8;
array[4] = 5;
int indexAfterSort = sort(array, 4);
indexAfterSort 现在将包含3。
int sort(int[] array, int elementIndexToTrack) 方法获取数组和 int,它是要跟踪的元素的索引。排序完成后返回该元素的索引。
我正在寻找一种有效的方法来实现这一点,而不会增加通常由Arrays.sort() 执行的排序算法的O(nlogn) 复杂性。因此,我想避免在排序后搜索元素,例如二进制搜索。我最后的手段是复制Array.sort() 算法并在那里实现我需要的更改,但可能有更简单的解决方案。
【问题讨论】:
-
你有没有考虑过使用堆,而不是每次都排序?
-
@fabian 二分查找的最坏情况是 O(log n),O(n) 用于插入数组。
-
如果这些只是整数,您可以使用
Arrays.sort(arr)然后使用Arrays.binarySearch(arr, num)编辑:“不增加 O(nlogn) 复杂度是什么意思?二进制搜索是 O(logn),和 O(nlogn)+O(logn)=O(nlogn) -
@IsmailBadawi 我考虑过
TreeSet和PriorityQueue,但它们不支持index 概念,因此我想简化问题并改用数组. -
@KevinL 你是对的,但避免二分搜索仍然更有效,只需使用 O(1) 获取新索引。