Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Can';我不能让这个java代码运行得更快_Java_Performance_Readline - Fatal编程技术网

Can';我不能让这个java代码运行得更快

Can';我不能让这个java代码运行得更快,java,performance,readline,Java,Performance,Readline,我正在参加一个在线评委页面,在那里我解决了一个问题,但我就是不能让我的程序及时运行。代码如下: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Set l = new HashSet(); String line; String[] numStr; while(true){ line = in.readLine(); numStr = line.split("\\s");

我正在参加一个在线评委页面,在那里我解决了一个问题,但我就是不能让我的程序及时运行。代码如下:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Set l = new HashSet();
String line;
String[] numStr;
 while(true){
  line = in.readLine();      
  numStr = line.split("\\s");      
  int a = Integer.parseInt(numStr[0]);
  if(a == 0){
     System.exit(0);
  }
  int n = 0;
  int b = Integer.parseInt(numStr[1]);
  l.clear();
  for(int i=0;i<a;i++){
    l.add(in.readLine());
  }
  for(int i=0;i<b;i++){
    if(l.contains(in.readLine())){
      n++;
    }
  }
  System.out.println(n);
BufferedReader-in=新的BufferedReader(新的InputStreamReader(System.in));
Set l=新的HashSet();
弦线;
字符串[]numStr;
while(true){
line=in.readLine();
numStr=行分割(\\s”);
inta=Integer.parseInt(numStr[0]);
如果(a==0){
系统出口(0);
}
int n=0;
intb=Integer.parseInt(numStr[1]);
l、 清除();

对于(int i=0;i

“按递增顺序”输入规范的一部分是关键:因为两个列表都是预先排序的,所以您可以将第一个列表读入数组,然后使用从最后一个项目的位置到数组末尾的二进制搜索来确定是否匹配。事实上,即使是第一个数组的线性搜索也可能有效,因为您最多需要遍历它一次。

假设第一个输入行是
1000000
;您的程序将读取一百万个值并将它们输入到哈希中,但没有要查找的值,因此输出保证为0。这显然需要比必要的长很多的时间(您需要读取它们,但不能将它们存储在哈希中)


此外,您只检查第一个值是否为0以终止;根据规范,
0 1000000
应产生0的输出,但您的程序将终止。也许法官没有检查这一点,但这样做是合法的。

因为数据已排序,所以非常适合合并处理

i、 e处理的逻辑是

Read Jacks records into array

While (More of jacks record to process)
  and (More of Jills record to process)  {

      if ( jacks_Record < Jills_Record)
         Jacks_Array_Index += 1;
      else if ( jacks_Record > Jills_Record)
         Read the next Jills_Record from the file
      else
         Match processing
}
将Jacks记录读入数组
同时(更多的千斤顶记录以进行处理)
和(更多Jills记录待处理){
if(千斤顶记录<吉尔记录)
Jacks_数组_索引+=1;
否则如果(千斤顶记录>吉尔记录)
从文件中读取下一条Jills_记录
其他的
匹配处理
}
只有一次通过文件,没有搜索。 在某些情况下,二进制搜索可能会更快


另外,在BufferedReader上指定一个大的缓冲区也可能是值得的。注意,1.5s是1500ms。我检查了网站以确保我们在同一页上,是的,你的速度是你需要的两倍。你说的“足够快”是什么意思?谁/什么建议1.5s太慢了?这对我来说似乎很合理。是的,我知道它应该足够快,但它不是。我失败是因为“超过了时间限制”:(我的用户名是Kirby)。可能你的
如果(a==0)
条件未被触发,因此您的程序仍在等待输入,但没有输入,并且计算器将其标记为超出时间限制。我不敢相信我没有意识到这一点。非常感谢,我欠您一个cookie!一个“合并”如果你使用线性搜索,你会得到合并的运行时间。如果你使用二进制搜索,当两组数字不一样时,你会走得更快;当两个列表相同时,它会退化成线性的。这两种情况下的大部分时间都将花在IO上。ave around列表有1000000个条目;合并将进行1000000*2次比较;二进制搜索将进行1000000*20次比较。当二进制搜索列表非常大,而第二个列表非常小时,二进制搜索将做得更好。