다음 'cons'함수가 O (n) 시간이 아닌 일정 시간이 걸릴 수있는 방법 (예 : 인수 유형 수정)이 있습니까? 즉, 목록을 작성하는 것은 O (n^2) 시간이 아닌 O (n) 시간이 걸릴 것입니다.Constant time 'cons'
나는 다음과 같은 조건에서 수행 할 수 있습니다 :
(1) 아니오 동적 메모리 없습니다 할당
(2) x는 여전히
(3) 입력 HEAD (즉 임시직에 대한 참조가 없을 수 있습니다) 유효합니다 (inlinable되지 않음) 개별적으로 컴파일되어 생성자의 작동 방법에
#include <type_traits>
template <typename HEAD, typename TAIL>
struct List
{
List(HEAD head, TAIL tail) : head(head), tail(tail) {}
typename std::remove_reference<HEAD>::type head;
typename std::remove_reference<TAIL>::type tail;
};
template <typename HEAD, typename TAIL>
List<HEAD, TAIL> cons(HEAD head, TAIL tail)
{
return List<HEAD, TAIL>(head, tail);
}
struct Empty {};
int main()
{
auto x = cons(1, cons(2, cons(3, Empty())));
// x should still be valid here
}
예를 가질 수있다.
컴파일러는 x의 유형을 알고 있으므로 스택에 공간을 할당합니다.
그래서 스택은 다음과 같습니다
p
가 임의의 주소입니다
| Int1 | Int2 | Int3 |
| p | p+4 | p+8 |
.
컴파일러는 cons(2, cons(3, Empty()))
이라는 호출을 생성하고 반환 값을 p+4
으로 지정합니다.
cons(2, cons(3, Empty()))
내부 컴파일러는 cons(3, Empty())
에 대한 호출을 생성하여 p+8
으로 반환합니다.
이렇게하면 cons
이 호출 될 때마다 tail
을 복사 할 필요가 없습니다.
컴파일러가이 최적화를 수행 할 수 있도록 코드를 잘 모르겠습니다. 일정한 실행 시간을 얻는 다른 방법이 있다면, 나는 그것을 사용하게되어 기쁠 것이다.
"동적 메모리 할당 없음"요구 사항을 이해하지 못합니다. 'cons'는 정상적으로 * 않습니다 * 않습니다? –
현재 'cons'가 정확히 선형이라는 것을 설명 할 수 있습니까? 어떠한 방식 으로든 검사되지 않는 고정 된 수의 논쟁이 있습니다. 최종 표현 이요? –
그래서 당신은 연결된 목록을 만들고 있습니다. 그리고 그것은 사물에 대한 언급이 아니라 그 사본을 포함합니다. 따라서 O (n^2)는 모든 중첩 된'cons' 호출이 이전에 생성 된 모든 객체를 새로운 것으로 복사하는 인수의 복사본을 수행한다는 사실에서 비롯된 것 같습니다. –