【问题标题】:How to keep track of an array element after sorting in java?在java中排序后如何跟踪数组元素?
【发布时间】: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 现在将包含3int 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 我考虑过TreeSetPriorityQueue,但它们不支持index 概念,因此我想简化问题并改用数组.
  • @KevinL 你是对的,但避免二分搜索仍然更有效,只需使用 O(1) 获取新索引。

标签: java arrays sorting


【解决方案1】:

将这些数字保存在有序数组中会非常低效。每当您在正确的位置插入一个新整数时,您都需要移动所有具有较高值的​​数组,从而使插入效率非常低。使用不同的结构。

无论您选择何种结构,跟踪最后插入的项目都很容易。创建变量

int lastItemInserted

每次你插入一些东西时,写给它。

【讨论】:

  • 我必须跟踪新元素的 index,而不是元素的值。
  • 然后使用变量'indexOfLastItemInserted'并将索引写入该变量。
  • 只有列表和数组支持索引,我不能使用堆或树
猜你喜欢
  • 2015-03-17
  • 2015-10-29
  • 1970-01-01
  • 2014-06-28
  • 2014-08-26
  • 1970-01-01
  • 2011-10-07
  • 2021-11-25
  • 2021-03-04
相关资源
最近更新 更多