2017-05-26 94 views
1

我在想,编译器的编译速度会更快。 使用排序或循环方法显示最小值和最大值。 哪一种编译器或程序员更快的方法?查找数组中最小值和最大值的更快方法

我将循环方法作为评论。

import java.util.Scanner; 
import java.util.Arrays; 

public class Day3 
{ 
    public static void main(String[] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Maximum and minimum value array"); 
     System.out.println("--------------------------------\n"); 

     //variable declaration 
     int amount; 
     int[] integerArray; 

     //set amount 
     System.out.print("Enter the amount of numbers to sort: "); 
     amount = scan.nextInt(); 
     integerArray = new int[amount]; 

     //input loop 
     System.out.print("Enter numbers: "); 
     for(int i = 0; i < amount; i++) 
     { 
      integerArray[i] = scan.nextInt(); 
     } 

     System.out.print("\nHere is your array: " + Arrays.toString(integerArray) + "\n"); 

     Arrays.sort(integerArray); 
     System.out.println("Min value = " + integerArray[0]); 
     System.out.println("Max value = " + integerArray[integerArray.length - 1]); 
     System.out.println("Median value = " + integerArray[(integerArray.length -1)/2]); 

     /* 
     int[] arr = new int[10]; 
     Scanner in = new Scanner(System.in); 
     int i, min=0, max=0; 
     for(i=0; i<=arr.length; i++) 
     { 
      System.out.print("Enter any number: "); 
      arr[i] = in.nextInt();   
     } 
     min = arr[0]; 
     for(i=0; i<=9; i++) 
     { 
      if(arr[i] > max) 
      { 
       max = arr[i]; 
      } 
      if(arr[i] < min) 
      { 
       min = arr[i]; 
      } 
     } 
     System.out.println("Maximum is: " + max); 
     System.out.println("Minimum is: " + min); 
     */ 

    } 
} 
+1

*“编译器更快。”*? *“或程序员”*?您应该担心的唯一速度性能是运行时性能。我还没有看到代码需要*更快*编译和更快的程序员不清楚和100%与人有关。 – luk2302

+1

其实,这是错误的。有很多情况下“程序员更快”是很重要的......如果你的意思是程序员编写和调试的速度更快! –

+0

@StephenC好吧,在几乎每一个企业背景下都是如此。我有一个stute deadline的计划。如果我不能减少编程某些功能的时间,我是****。同样的事情关于调试(这很有趣,因为它几乎总是与之前完成的快速开发有关;)) – AxelH

回答

4

对于unosorted数据,循环在阵列上找到最小/最大需要O(n)的时间。对于排序它会是恒定的时间(O(1)),但据我了解,这不是你的情况。

最快的排序算法在O(n * log(n))中工作,所以线性扫描(循环)是最快的选项。

另外,编译器可以为你优化某些东西时情况并非如此。

+0

如果数据排序后发现最小值和最大值是恒定时间,只需访问第一个或最后一个元素 –

+0

当然,我可能需要一些咖啡。修复。 – syntagma

2

在你可以将O(nlogn)一般最快的排序,循环阵列上方将只是为O(n),所以肯定循环

0

迭代一个列表/阵列识别的最小和最大条目可以一次完成。

而且除非您的数据已经排序,否则排序总是需要比读取所有条目更多的工作量。

因此,在运行时排序,只是发现最小和最大转化为一定量的开销。

当然:你的术语是混乱的。编译器将输入转换为输出,它并不关心你作为输入提供的代码的效率。

+1

勇敢downvoter的任何意见? – GhostCat

1

Arrays.sort()使用在O(nlog(n))中运行的mergesort算法的一个版本。通过数组的线性搜索来查找最大值和最小值只需要一次通过数组,使其成为O(n)。

通常,线性搜索循环方法运行得更快。您还可以结合最大/最小的数据输入寻找提高效率:

int[] arr = new int[10]; 
    Scanner in = new Scanner(System.in); 
    int i, min=Integer.MAX_VALUE, max=Integer.MIN_VALUE; 
    for(i=0; i<=arr.length; i++) 
    { 
     System.out.print("Enter any number: "); 
     arr[i] = in.nextInt(); 
     if (arr[i]>max) { max = arr[i]; } 
     if (arr[i]<min) { min = arr[i]; } 
    } 
1

您可以使用JAVA 8 Stream API。我认为Stream必须更快,因为它不存储元素。流直接处理所需的元素。

代码示例:

List<Integer> integerList = Arrays.asList(1,2,13,4,15,6,17,8,19); 
System.out.println("List of Ints= " +integerList); 
IntSummaryStatistics intStats = integerList.stream().mapToInt((x) ->x).summaryStatistics(); 
System.out.println("Max Number= " + intStats.getMax()); 
System.out.println("Min Number= " + intStats.getMin()); 

我已经测试&正常工作的代码。

+0

它不会比循环更快。 – syntagma

相关问题