OCaml 에서 List
값을 효율적으로 다루면서 성능을 최적화 할 수 있어야 한다.
./list [길이]
를 실행하면 먼저 해당 개수만큼 정수 원소를 갖는 List
타입의 값을 생성한다.
그리고 나서 리스트의 모든 원소를 제곱하는 상황을 가정해보자.
마지막으로는, 모든 원소의 제곱 값이 새로 생성된 리스트의 같은 위치에 잘 들어 있는지 check
함수로 검사하는
코드가 이미 구현되어 있다.
OCaml에서 리스트의 원소를 추가하는 방법은 두 가지가 있다. ::
연산과 @
연산이다.
하지만 부주의하게 사용한다면 원소 개수가 많을 때 매우 비효율적이다.
이를 해결하기 위하여, 리스트의 각 원소를 제곱하는 square_opt
함수를 효율적으로 작성하라.
이 모듈은 ./list -opt [길이]
로 실행할 수 있다.
- 순환문은 재귀 호출로 구현하고
for
문을 사용하지 않는다. - 천만개 원소를 생성하고 제곱하는 데 수 초를 넘지 않아야 한다. 참고로, Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz 에서 아래와 비슷한 성능이 나온다.
$ time ./list 10000000
timeout (>5 min)
$ time ./list -opt 10000000
true
./list 10000000 1.70s user 0.25s system 99% cpu 1.954 total