2017-10-11 1 views
-5

중복 요소를 찾고 부울 값을 반환하는 메서드를 작성하는 작업이 있습니다.중복 문자열 복잡성 검색

아래 코드는 내가 가지고있는 코드입니다.

import java.util.ArrayList; 
import java.util.List; 

public class DuplicateEle { 
    public static void main(String args[]) { 
     String[] arr = { "hello", "hi", "hello", "howru" }; 
     DuplicateEle de = new DuplicateEle(); 
     for (int i = 0; i < arr.length; i++) { 
      boolean isDup = de.isDuplicate(arr[i]); 
      System.out.println(arr[i]+" is duplicate :" +isDup); 
     } 
    } 

    List<String> dList = new ArrayList<String>(); 

    private boolean isDuplicate(String str) { 
     boolean isDup = false; 
     if (dList.contains(str)) { 
      isDup = true; 
     } else 
      dList.add(str); 
     return isDup; 
    } 

} 

예상대로 작동합니다. 출력 :

hello is duplicate :false 
hi is duplicate :false 
hello is duplicate :true 
howru is duplicate :false 

나는 위의 코드에 대한 시간 복잡도를 찾고 싶어요. 이 튜토리얼은 시간 복잡성에 대해서는 one과 같은 방식으로 작동합니다.

누군가 위의 코드에 대한 의견을 알려주고 시간 복잡성에 대한 이해를 도울 수 있습니까?

미리 감사드립니다.

+0

그냥 링크를 사용하십시오. 그들은 모든 것을 설명합니다[email protected]는 링크를 사랑합니다 : D – sheplu

+0

@lexicore : 나는 그것을 이해했는지 확신 할 수 없습니다. 같은 추론? 작업에 대해 더 구체적으로 말합니까? – lr14

+2

@ lr14 당신은 우리에게 과제를 던집니다. 당신은 이것을 수행하는 방법조차도 가지고 있고, 그런 다음 당신은 "투입물"과 "이해하는데 도움"을 요구합니다. 누군가가 당신과 함께 앉아서 당신이 그 가이드를 읽고 그것을 당신의 과업에 적용하도록 도와 주면 무엇을 기대합니까? 그런 일은 없을 것이다. 실제로 링크 된 가이드에 쓰여진 내용을 적용하고 질문에 추론을 적어 누군가가 오류를 발견 할 수 있는지 물어 보면 실제로 도움이 될 수 있습니다. 그러나 지금 서 있기 때문에 당신은 단순히 우리에게 당신을 위해 숙제를하라고 요구합니다. – lexicore

답변

0

코드가 너무 복잡하므로 HashSet<String>을 사용하면 고유성을 보장하고 요소가 이미 세트에 있는지 여부를 반환합니다. 그것은 단지 다음 전체 '비싼'할 equals를 사용할 필요, 버킷을 찾을 문자열의 int 해시를 사용으로 HashSet를 사용

public class DuplicateEle { 
    public static void main(String args[]) { 
     Set<String> seen = new HashSet<>(); 
     String[] arr = { "hello", "hi", "hello", "howru" }; 

     for (String word : arr) { 
     boolean unique = seen.add(word); 
     System.out.printf("%s is duplicate: %b%n", word, !unique); 
     } 
    } 
} 

이 매우 효율적입니다 같습니다.

+0

알기. 고맙습니다 !! 시간 복잡성을 더 잘 이해할 수 있도록 자습서를 게시 할 수 있습니까? – lr14

0

즉, n은 검사 할 요소의 수이고 m은 가장 긴 단어의 크기입니다. 따라서 요소 배열을 살펴보고 각 요소에 대해 dList에 있는지 확인하십시오.

시작시 빈 시간이므로 요소를 추가하십시오. 그래서, 질문은, 방법이 얼마나 빠릅니다 contains입니다. ArrayList의 소스 코드를 살펴보면 배열을 통해 각 요소가 equal인지 확인하고 끝에서부터 시작하여 각 문자를 검사하여 완료됩니다 (먼저 동일한 크기인지 확인) .

그래서 최악의 경우 모든 요소는 크기가 같고 첫 번째 요소가 다릅니다. 그래서 첫 번째 요소에서는 아무것도하지 않으므로 기본 작업은 1로 계산됩니다. 2 단계에서 1 단계 검사를 수행하고 3 단계에서는 2 단계 검사를하고 1 단계에서 n-1 검사를 수행합니다. .

0+1+2+...+n-1 = n(n-1)/2 

지금, 최악의 시나리오는, 각 요소는 동일한 크기와 그들이 첫 번째 요소에서 다른, 그래서 당신은 크기 m의 또 다른 루프를 가지고 : 그래서, 당신은. 여기서 m은 평균 문자열 크기 또는 문자열의 끝에서 다른 char의 위치에 대한 통계적 예상을 나타낼 수도 있습니다.

따라서 O(mn^2)이지만 임의의 숫자가 m 인 경우이를 Ω(n^2)이라고 할 수 있습니다.

하지만 좋은 소식이 있습니다. HashSet을 사용하면 더 빠른 방법이 있습니다. HashSet을 사용하여 dList를 변경하고 초기 목록을 살펴 가면서 각 요소를 배치해야하므로 각 요소를 확인하는 작업은 O(1)에서 완료됩니다. 즉, 전체 속도는 O(n)이됩니다.

+0

Arraylist의 시간 복잡성에 대해 자세히 설명해 주셔서 감사합니다. 또한 복잡성에 대한 튜토리얼 링크도 게시 할 수 있습니다. – lr14

+0

음, 처음에는 약간의 수학과 정확한 시퀀스와 계열을 공부해야합니다. https://www.codecademy.com/en/courses/big-o/0/1을 사용해보십시오. 알고리즘의 복잡성을 이해할 수있는 실질적인 경험을 제공해야합니다. 그러나이 주제에 대한 책을 읽는 것이 가장 좋을 것입니다. 이는 복잡한 웹 튜토리얼에서 다루기 위해 많은 수학을 적용하기 때문입니다. 나는이 책을 추천한다 : 스티브 S. 스키 나 (Steve S. Skiena)의 "The Algorithm Design Manual". –

+0

그게 도움이. 그것을 들여다 볼 것입니다. 고맙습니다 ! – lr14