Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用分治法反演计数_Java_Algorithm - Fatal编程技术网

Java 用分治法反演计数

Java 用分治法反演计数,java,algorithm,Java,Algorithm,我正在尝试实现一个计算反转数的程序,但它对大输入量(100000)不起作用 未排序的数字是从txt文件中选取的。该程序适用于较小的输入大小,如10、15甚至20 但是当我从这个链接复制输入时:程序只是持续运行几秒钟而没有产生任何输出 我使用了基于合并排序的分治算法,并在BlueJ中实现 这是代码 import java.util.*; import java.io.*; class INVERSION { private static LinkedList<Integer>arr;

我正在尝试实现一个计算反转数的程序,但它对大输入量(100000)不起作用

未排序的数字是从txt文件中选取的。该程序适用于较小的输入大小,如10、15甚至20

但是当我从这个链接复制输入时:程序只是持续运行几秒钟而没有产生任何输出

我使用了基于合并排序的分治算法,并在BlueJ中实现

这是代码

import java.util.*;
import java.io.*;
class INVERSION
{
 private static LinkedList<Integer>arr;
 private static Scanner s;
 private static long count=0;
 public static void count_inv(int low,int high)
 {
     if(high<=low)
      return ;
     else
     {
         int mid= low + (high-low)/2;
         count_inv(low,mid);
         count_inv(mid+1,high);
         split_inv(low,high);

     }
 }
 public static void split_inv(int low,int high)
 {
     int mid=low+ (high-low)/2;
     int i=low,j=mid+1;
     int k=0;
     int []aa=new int[high-low+1];
     while(i<=mid&&j<=high)
     {
         if(arr.get(i)<=arr.get(j))
          aa[k++]=arr.get(i++);
         else {count+=mid-i+1; aa[k++]=arr.get(j++);}
     }
     while(i<=mid)
      aa[k++]=arr.get(i++);
     while(j<=high)
      aa[k++]=arr.get(j++);
     for(int e:aa)
      arr.set(low++,e);

 }
 public static void main(String []args)throws IOException
 {
  BufferedReader br=new BufferedReader(new FileReader("JJ.txt"));
  arr=new LinkedList<Integer>();
  String s="";
  while((s=br.readLine())!=null)
   arr.add(Integer.parseInt(s));                
  count_inv(0,arr.size()-1);
  System.out.println("the number of inversions is "+count);   
 }
}
import java.util.*;
导入java.io.*;
类反转
{
私有静态LinkedListarr;
专用静态扫描仪;
私有静态长计数=0;
公共静态无效计数(整数低,整数高)
{

如果(高我认为问题可能是您使用的是LinkedList

这将有O(n)个随机访问的访问时间

您不进行O(nlogn)访问,因此您的总时间将是O(n^2logn)


尝试仅使用普通数组,或使用O(1)的其他数据结构访问时间,如ArrayList。

根据您的问题,您不知道它是否正在处理问题大小100000。您正在从20个问题大小跳到100000个问题大小。为什么不先尝试运行数百个大小的程序?然后,尝试数千个大小的程序,等等……可能是程序正在运行很明显,但你只是没有足够的时间来完成。@huck_cussler看到了吗