알고리즘 문제풀이/시간복잡도

함수 인자(parameter) 전달 방식 속도 : call by value VS call by reference

이제ise이제 2024. 8. 17. 11:26
Q. vector를 함수의 파라미터로 전달할 때 call by value와 call by reference의 속도가 다를까?

 

GPT 답변

C++에서 std::vector를 함수의 파라미터로 전달할 때 call by value와 call by reference의 속도는 다릅니다.

Call by Value (값에 의한 전달)
작동 방식: std::vector가 함수에 전달될 때, 벡터의 모든 요소가 복사됩니다.
비용: 이 과정은 벡터의 크기(n)에 비례하는 O(n) 시간과 공간 복잡도를 가집니다. 벡터가 클수록 복사하는 데 시간이 오래 걸리고 메모리도 더 많이 사용됩니다.

Call by Reference (참조에 의한 전달)
작동 방식: std::vector가 함수에 전달될 때, 벡터 자체가 아닌 벡터에 대한 참조(포인터와 유사한 개념)가 전달됩니다.
비용: 참조는 단순히 주소값을 전달하므로, O(1)의 시간과 공간 복잡도를 가집니다. 벡터의 크기와 무관하게 일정한 시간이 소요되며, 추가 메모리 사용도 거의 없습니다.

성능 차이
Call by Value: 벡터의 모든 요소를 복사하기 때문에 시간이 더 오래 걸립니다. 특히 벡터가 클수록 이 차이가 더욱 두드러집니다
Call by Reference: 벡터의 주소만 전달되므로 훨씬 더 빠릅니다.

따라서 일반적으로 벡터를 함수에 전달할 때는 call by reference를 선호합니다.

 

 

백준에서 이분탐색 연습하려 1920번 수 찾기 풀다가

 

위에서 부터 순서대로 

1 - call by reference로 넘겼을 때 = 48ms

(2- 수정하다 변수 선언 빠진거. 무시) 

3 - 전역 변수로 선언했을 때 = 44ms

4 - call by value로 넘겼을 때 = 시간초과

 

call by reference는 gpt 말대로 주소값만 넘기면 O(1)인 만큼, 전역 변수로 선언할 때와 메모리 면에서는 크게 차이가 없음.

시간은 주소를 통해 탐색하는 속도가 있긴해서인지 4ms 만큼 차이가 있지만 크지 않았음.

 

코테 용으로 시간 빨리 내고 싶으면 전역, 코드 완성도는 call by reference를 택하면 될듯!