使元素有效地落入数组的范围内

时间:2012-11-01 05:04:10

标签: java arrays algorithm

在Java中,如果我想从一个属于特定范围的数组中获取元素,那么最有效的方法是什么呢?

例如

数组

A = [25,32,54,23,76,34];

我想得到

element between 45 and 55.

这是元素:

54

那么获得它的最有效方法是什么?

5 个答案:

答案 0 :(得分:3)

如果要重复搜索数组,那么最好的选择是对数组进行排序并使用二进制搜索来查找低限和高限。在通过足够的搜索进行摊销时,这将为您提供O(log n)性能。

如果是一次性搜索,你不能只是扫描数组并将每个元素与其他人建议的低/高边界进行比较 - 这是O(n)。

答案 1 :(得分:0)

你可以尝试这样的事情

int dLimit=45, uLimit =55, result[] = new int[A.length],j=0;
for(int i : A){
    if(i>dLimit && i<uLimit)
        result[j++] = i;
}

答案 2 :(得分:0)

我不确定它是否会效率最高,但我会做这样的事情。

    int[] rangeTracker = new int[100];
int rangeTrackIndex = 0;
For (int j = 0; j < A.getLength(); j++) {

     if ((A[j] >= 45) && (A[j] <= 55)) {
          rangeTracker[rangeTrackIndex] = A[j];
          rangeTrackIndex++;
}
}
For (int j=0; j < rangeTracker.getLength(); j++) {
     System.out.println(rangeTracker[j]);
}

我的一些语法可能会关闭,这可能是错误的方法,但我只使用Java约2个月。此外,我只用了大约4个月的编程工作。我希望这会有所帮助。

答案 3 :(得分:0)

它需要最小的O(n)复杂度,因为为了知道给定的游侠之间有多少元素,我们必须至少遍历所有元素一次,因为我们计算n个元素有n个元素,因此复杂度为O (n)的

来解决AFAIK。

N'LT; -array.length;

for(int i=0;i<n;i++)
{
  if((a[i]<upperLimit) && (a[i]>lowerLimit))
   {
      SOP(a[i]);//or store in temp array based on your requirement
   } 
}

答案 4 :(得分:0)

您必须知道数组中有哪些元素才能回答您的查询(a和b之间的元素)。

如果您要回答n个这样的查询,那么您可以对数组进行排序(n log n),然后找到大于或等于a的最接近元素(a小于a和b)和最接近的元素通过使用二进制搜索(n log n + n log n)小于或等于b,然后检索它们之间的元素。

如果a和b之间的no.of元素很小,你可以在n个查询中实现O(n log n)复杂度,使得每个查询的平均价值大约为O(log n),但是如果a之间的元素数量不同并且b是n的量级,每个查询将值得O(n)复杂度。