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