7

대학 프로젝트의 경우, 요소 집합과 해당 요소 간의 관계 모음이 주어질 때 등가성 클래스를 계산하는 몇 가지 알고리즘을 구현해야했습니다 .(Dis) 언어 내부로 인해 하나의 알고리즘이 다른 알고리즘보다 빠르게 작동 함을 증명하십시오.

우리는 Union-Find 알고리즘과 그 최적화 (깊이 별, 크기별 조합)를 구현하도록 지시 받았다. 우연히 (알고리즘의 정확성에 필요한 것이라고 생각한 일을하면서) 알고리즘을 최적화하는 다른 방법을 발견했습니다.

유니온 깊이만큼 빠르지 만 닫힙니다. 나는 내 인생에서 왜 그렇게 빠르는지 알 수 없었기 때문에, 알아낼 수없는 조교 중 한 사람과상의했다.

이 프로젝트는 자바에 있었고, 내가 사용하는 데이터 구조체는 나중에 프로젝트의 평가에서, 나는 그것이 아마 자바 '와 어떤 관계가 있다고 들었다 정수의 간단한 배열 (객체가 아닌 int)를 기반으로 한 캐싱 ',하지만 캐싱이 어떻게 영향을 미치는지에 대해서는 온라인으로 찾을 수 없습니다.

알고리즘의 복잡도를 계산하지 않고 가장 좋은 방법은 무엇이겠습니까? 자바의 방식으로 인해 내 최적화가 빠르다는 것을 증명하거나 반증 할 수 있습니까? 그것을 다른 (낮은 수준의) 언어로 구현합니까? 그러나 누가 그 언어가 똑같은 일을하지 않을 것이라고 말하는가? 내가 자신을 분명하게 희망

,

감사

답변

4

유일한 방법은 알고리즘의 최악의 경우 (등 평균 경우) 복잡성을 증명하는 것입니다.

그렇게하지 않으면, 그냥

  • 의 조합의 결과 특정 데이터가 될 수 있기 때문에 데이터
  • 하드웨어의 일부 측면의
  • 크기
  • 일부 언어 구현의 측면
0

소스 코드에 액세스 할 수 있고 JDK 소스 코드를 사용할 수 있다면 믿을 수 있습니다. 그러면 해당 구현 정보를 찾기 위해 트롤 할 수 있습니다.

+2

JIT와 GC 및 컴퓨터 하드웨어 아키텍처에 대한 이해를 시작하기까지 1 년이라는 긴 연구 프로젝트와 같은 소리가납니다 ... –

3

현대 VM의 경우 이러한 작업을 수행하는 것이 일반적으로 매우 어렵습니다! 당신처럼 그들은 뒤에서 모든 종류의 물건을 수행합니다. 메소드 호출은 인라인되고 객체는 재사용됩니다. 가장 중요한 예는 분명히 세는 것 이외의 다른 것을 수행하지 않는다면 사소한 루프가 컴파일되는 것을 보는 것입니다. 또는 함수형 프로그래밍에서 funtioncall이 인라인되거나 꼬리 - 호출 최적화 된 방법.

또한 모든 데이터 세트에서 일반적으로 포인트를 증명하는 데 어려움이 있습니다. O (n^2) 알고리즘은 O (n) 알고리즘보다 훨씬 빠르다. 두 가지 예

  1. 버블 정렬은 정렬에 가까운 데이터 수집을 정렬하는 것이 빠른 정렬보다 빠릅니다.
  2. 일반적인 경우 빠른 정렬은 물론 더 빠릅니다.

일반적으로 big-O 표기법은 실제 상황에서 실제 상황에서 구현에 적용되는 상수를 의도적으로 무시합니다. 그 상수들은 당신을 때린 것일 수도 있습니다. 따라서 실제로는 0.00001 * n ^ 2 (알고리즘 실행 시간)가 1000000 * n보다 빠릅니다. n log n

제공하는 정보가 제한되어 있으므로 추론은 어렵습니다.

1

컴파일러 또는 JVM에서 코드 최적화를 찾은 것 같습니다. javac 컴파일러가 출력하는 바이트 코드를 읽고, -Djava.compiler=NONE 옵션을 사용하여 런타임 JIT 컴파일을 비활성화 할 수 있습니다.

관련 문제