Java在流中查找中位数

时间:2018-02-12 16:32:21

标签: java median

我试图在Java中找到输入流中的中位数。在每次用户输入之后,应该有一个输出更新新的中位数。例: 在读取流5的第1个元素后,中位数为5 在读取流5的第2个元素后,15个中值为10 在读取流5的第3个元素后,15,1个中值为5 在读取流5的第4个元素后,15,1,3中位数为4,所以

这是我的代码到目前为止,但它不适用于过去4的输入。

public static void main(String[] args){
    Scanner s = new Scanner(System.in); 
    System.out.print("Enter a integer for number of streams: ");
    int n=s.nextInt();
    int[] x=new int[n];
    for(int i=0;i<n;i++) {
        System.out.println("Enter a integer: ");
        x[i]=s.nextInt();
        if(i==0) { //first input number
            System.out.println(x[i]+" goes to stream --> Median is: "+x[i]);
        }
        else if(i==1) {   //when i =1, it is technically second input 
            System.out.println(x[i]+" goes to stream --> Median is: "+(float)(x[i]+x[0])/2);
        }
        else if(i>=2 && i%2==0) {  //3rd input so # of inputs is odd        
            Arrays.sort(x);
            System.out.println(x[i]+" goes to stream --> Median is: "+x[n/2]);
        }
        else if(i>=3 && i%2!=0) {  //when # of input is more than 3 and even
            Arrays.sort(x);
            int j=n/2;
            float med=(x[j]+x[j-1])/2;
            System.out.println(x[i]+" goes to stream --> Median is: "+med);
        }

我还没有完成,但我的问题是:这种方法有效吗?基本上我只是使用迭代器i来查看输入的数量是奇数还是偶数。如果是奇数,则对输入数组进行排序,找到中间的#。如果均匀,找到中间2并添加和分割。我已经看过使用堆等的其他解决方案,但我只是严格使用数组。

1 个答案:

答案 0 :(得分:2)

你的代码看起来还不错,显然它可以改进,因为它是一种天真的方法。

我在您的解决方案中看到的错误是您在第3和第4 n块中使用i(完整数组的长度)而不是else-if(当前长度)

此外,使用ArrayList而不是Array,因为数组被初始化为其默认值(此处为0),因为您输出错误。

尝试使用以下更正:

public static void main(String[] args){
    Scanner s = new Scanner(System.in); 
    System.out.print("Enter a integer for number of streams: ");
    int n=s.nextInt();
    List<Integer> x = new ArrayList<>();
    for(int i=0;i<n;i++) {
        System.out.println("Enter a integer: ");
        x.add(s.nextInt());
        if(i==0) { //first input number
            System.out.println(x.get(i)+" goes to stream --> Median is: "+x[i]);
        }
        else if(i==1) {   //when i =1, it is technically second input 
            System.out.println(x.get(i)+" goes to stream --> Median is: "+(float)(x.get(i)+x.get(0))/2);
        }
        else if(i>=2 && i%2==0) {  //3rd input so # of inputs is odd        
            Collections.sort(x);
            System.out.println(x.get(i)+" goes to stream --> Median is: "+x.get(i/2));
        }
        else if(i>=3 && i%2!=0) {  //when # of input is more than 3 and even
            Collections.sort(x);
            int j=i/2;
            float med=(x.get(j)+x.get(j-1))/2;
            System.out.println(x.get(i)+" goes to stream --> Median is: "+med);
        }
 }
}

现在,让我们谈谈时间的复杂性。

正如我上面所说的天真的方法。下一步可以是提高时间复杂度,这可以通过使用数据结构来存储元素来完成,这些元素在每次新添加时自行排序,而不是每次排序。我的意思是,如果我们使用某种SortedList

但是,在java中没有像SortedList这样的类。但是有一类基于类似的概念,即 PriorityQueue 。我建议你阅读它并尝试自己降低复杂性。