2016-10-07 2 views
0

지금 Hackerrank에서 문제를 해결하고 있으며 논리가 다소 정확하다고 믿지만 큰 데이터 세트는 성능이 저하되어 "잘못된"답변을 얻습니다. 당신이 그것을 확인할 수 있도록 여기에 문제에 대한 링크는 다음과 같습니다큰 배열을 조작 할 때 성능을 향상시키는 방법은 무엇입니까?

https://www.hackerrank.com/challenges/qheap1

내가 큰 데이터 세트를 허용하기 위해이 스크립트의 성능을 향상하는 방법을 궁금해하고있다. 나는 스캐너와 관련이 있다는 직감이 있지만 그 이유는 모르겠다.

public class Solution { 
    private static final int ADD = 1; 
    private static final int DELETE = 2; 
    private static final int GET = 3; 
    private static final int TICK = 1; 
    public static void main(String[] args) { 
     /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ 
     Scanner in = new Scanner(System.in); 
     PrintStream out = System.out; 
     int n = in.nextInt(); 
     int[] heap = new int[n]; 

     int a = 0; 
     while (a < n) { 
      a = 0; 
      int q = in.nextInt(); 

      switch(q) { 
       case(ADD): 
        int nextAdd = in.nextInt(); 
        /*out.println("ADD " + next);*/ 
        int b = 0; 
        while (b < n) { 
         /*out.println(heap[b]);*/ 
         if (heap[b] == 0) { 
          heap[b] = nextAdd+TICK; 
          /*printArray(heap);*/ 
          b = n-1; 
         } 
         b++; 
        } 
        /*printArray(heap);*/ 
        break; 
       case(DELETE): 
        int c = 0; 
        int nextDelete = in.nextInt(); 
        while (c < n) { 
         if (heap[c]-TICK == nextDelete) { 
          heap[c] = 0; 
          c = n-1; 
         } 
         c++; 
        } 
        /*printArray(heap);*/ 
        break; 
       case(GET): 
        Arrays.sort(heap); 
        int d = 0; 
        while (d < n) { 
         if (heap[d] != 0) { 
          out.println(heap[d]-TICK); 
          d = n-1; 
         } 
         d++; 
        } 
        /*printArray(heap);*/ 
        break; 
      } 
      a++; 
      /*printArray(heap);*/ 
     } 
    } 

    public static void printArray(int[] ar) { 
     String str = ""; 
     for (int i : ar) { 
      str += i + " "; 
     } 
     System.out.println(str); 
    } 
} 
+1

힌트 : "작업"코드는 일반적으로 codereview.stackexchange.com – GhostCat

+0

로 전환 될 수 있습니다 여기에

모든 테스트를 통과 구현 당신이 ** 가독성을 작업 할 수 있습니다 ** 먼저. 나는 당신의 코드가 무엇을하는지 계산하는 데 정말로 힘든 시간을 보냈다. 예를 들어, 스위치 케이스를 개별 메소드 (메소드 및 변수에 대한 올바른 이름 포함)로 푸시하는 경우 유용합니다. 코드를 보는 것에서 그러한 성능을 해결하는 것은 어렵습니다 **. 그 코드가 읽기 어려운 방식으로 쓰여지는 경우 쉽게 이해할 수 없습니다. – GhostCat

+0

당신의 alghoritm이 단지 2 차적인 복잡성을 가지기 때문에, 즉 모든 반복에서 'a'에 의해 모든 힙을 가로 지르기 때문에, 힘들게됩니다. 의미는''a'' 반복을 할 것이고, 각각'n' 반복을 할 것입니다 ('b','c'' 또는'd'를 통해'd'에 대해 더 많이 할 것입니다 - 'n * logn'). @Lashane이 제안한 목적에 맞는 올바른 데이터 구조를 구현하면 향상 될 수 있습니다. 'PriorityQueue'의 소스 코드를 살펴보십시오 - 배열을 기반으로 만들어졌지만 요소의 특별한 순서를 적용하므로 요소의 큰 부분을 건너 뛰고 속도를 높일 수 있습니다. – bashnesnos

답변

1

코드를 보면, 내가 발견 할 수있는 유일한 즉시 문제는이 라인

out.println(heap[d]-TICK); 

이 주석되지 않는다는 사실이다. 그건 당신의 자바 프로그램 (아니, 스크립트, 당신의 말을 염두에 두지 마라.) 많은 IO 작업을하고있다. 그리고 그들은 매우 비싼 다른 어떤 프로그램에 비해.

그래서 댓글을 달아서 어떻게되는지 확인하십시오.

+0

나는 그것이 의미가 있음을 안다. 'out.println (heap [d] -TICK)'대신에 다른 출력 프로세스를 사용하여 프로그램을 실행하려고했습니다. 정적 인 빈 문자열 인 HEAP을 초기화하고 HEAP + = Integer.valueOf (heap [d] - TICK) .toString() + "
"; 그런 식으로 대량의 입력이 끝난 후에는 단순히 해당 문자열을 분할하여 각 번호를 인쇄 할 수있었습니다. 그러나 이전과 동일한 성능 문제가 발생했습니다. 이론 상으로는 그것이 적절한 프로세스라고 생각합니다. –

1

힙을 사용하지 않는 (챌린지에서 요구하는 것처럼) 힙을 사용하지 않는 주된 문제점은 배열 작업에 너무 많은 시간을 소비하고 있다는 것입니다.

public static void main(String[] args) { 
    final Scanner in = new Scanner(System.in); 

    final int n = in.nextInt(); 
    final PriorityQueue<Integer> q = new PriorityQueue<>(n); 
    for (int i = 0; i < n; i++) { 
     final int command = in.nextInt(); 
     switch (command) { 
     case 1: 
      q.add(in.nextInt()); 
      break; 
     case 2: 
      q.remove(in.nextInt()); 
      break; 
     case 3: 
      System.out.println(q.peek()); 
      break; 
     } 
    } 
} 
+0

아마도 정답입니다. 그러나 나는 그러한 "해킹"문제를 해결하려고하는 누군가 정말로 "완전한"대답을 얻는 것에 정말로 관심이 있는지 궁금해하고있다. 당신은 "해결할 수있는 도움"을 요청할 때 다른 사람들이 완벽한 해결책을 받아 퍼즐을 "해결"하는 것이 무엇인지 알고 있습니다 ... – GhostCat

+0

@GhostCat 나는 그것이 해킹이나 퍼즐이라는 것을 의아스럽게 생각합니다. 당신이 적절한 데이터 구조를 사용하지 않는 한 간단한 알고리즘 연습 - 모든 테스트를 통과 할 수 없을 것입니다. –

+0

@Lashane, 왜 그런지 모르지만, Hackerrank에서 모든 퍼즐을 해결하려고합니다.컬렉션 프레임 워크 (당신이 제공 한 우아한 솔루션이 있음)에서 무언가를 사용하는 것에 대한 호소력을 분명히 볼 수 있습니다. 전문가로서, 그렇게하는 것이 현명하다고 생각하지만,이 경우 성능에 대해서는 여전히 궁금합니다. –

관련 문제