시간복잡도가 list에서 insert()는 중간 위치에서
O(n)이나와야잖아 근데 왜 O(1)이 나오는거냐
어디서 코드를 내가 잘못 쓴거지
int main()
{
int timesToLoop = 1000;
for (int n = 100000; n <= 2000000; n += 100000)
{
list<Student> dll;
list<Student>::iterator it;
Student student1("u1000", "solomon", "physics");
for (int a = 0; a < n; a++)
{
Student student("u1000", "solomon", "physics");
dll.push_back(student);
}
it = dll.begin();
advance(it, dll.size() / 2);
auto startTime = std::chrono::high_resolution_clock::now();
for (int i = 0; i < timesToLoop; i++)
{
dll.insert(it, student1);
}
auto midpointTime = std::chrono::high_resolution_clock::now();
long totalTime =
std::chrono::duration_cast<std::chrono::nanoseconds>(midpointTime -
startTime).count();
long averageTime = totalTime / timesToLoop;
cout << n << "\t" << averageTime << endl;
}
}
이렇게 나오던데
100000 2342
200000 1808
300000 2279
400000 1895
500000 2216
600000 4474
700000 2275
800000 1817
900000 2322
1000000 2782
아 ㅋㅋ O(100000)정도면 O(1)이라고ㅋㅋ
근데 진짜 뭐하는 코드지 설마 실행시간 측정해서 시간복잡도를 분석할 수 있다고 생각한건가
물론 플롯 그려서 추측은 가능하겠지ㅋㅋ - dc App
그냥 list안에다가 대충 중간근처 iterator에서 insert()의 시간복잡도 측정하는거임.
시간복잡도는 걸리는 시간이 아니야. 그래서 측정도 불가능하고, 정적으로 코드를 분석해서 계산해내는거임 - dc App
그니까 플롯 그려서 trend line이 니가 예상한거랑 비슷하게 나오는지 체크 하는게 학교 과제임
아무튼 그거라면 밑에 제시해준 방법을 써먹어보고 안되면 다시 답글 달아보셈 - dc App
Release 빌드 말고 Debug 빌드로 돌려봐 - dc App
아니면 dll의 원소를 쭉 출력해보거나 이걸 왜 시키냐면 컴파일러가 사용 안되는 코드를 삭제하기 때문임 - dc App
volatile이었나 이 키워드로 선언해서 컴파일러 최적화 막을 수도 있읍니다
너무 이상한거 알려주지 말고 그거 순전히 컴파일러 최적화를 막으려고 있는게 아니잖아? - dc App
힝
debugging 돌려보니까 dll의 size가 정상적으로 1계씩 증가하던데
그럼 시간은? - dc App
추가했네 - dc App
그니까 O아직도 문제임 증가선이 나와야하는데 저렇게 상수 trend임
n사이즈가 부족해서 그런가 10곱해서 더 늘려야하나
컴퓨터로 보니까 보이는데 너 list 쓰고있네?
그지
list는 링크드리스트라고 해서 너가 생각하는 그 자료구조가 아니고 다른거임 vector 써라
아니 학교과제가 링크드 리스드의 insert() 측정하는게 맞음 doubly linked list
그러면 삽입할 위치를 알고 있을 때, 상수시간 삽입이 이뤄지는게 맞음 실험성공 ㅊㅋㅊㅋ
O(N)이 나와야하는거 아님??? 사이즈가 내가 100000에서 2000000까지 증가시키는거니까 iterator을 head에서 증가시켜야할 수가 커지잖아
측정 시작: 원소 삽입 (상수시간) 측정 완료
근데 교수님이 insert() function 안에 head에서 시작해서 내가 입력한 iterator까지 1씩 증가시키는 코드가 안에 있다고 했는데
이게 너가 원하는 결과가 아니라면 측정 대상을 잘못 잡고있음 선형시간인건 원하는 원소 위치 찾는 연산임
random access가 아니라
그니까 교수님이 저 insert function에 head에서 원하는 원소 위치 까지 찾는 연산을 가진 코드가 포함되어있다고 나한태 말함
머야시발내가생각한게맞잖아
insert() function 안에 head에서 시작해서 내가 입력한 iterator까지 1씩 증가시키는 코드가 안에 있다 최소한 너가 사용한 insert 함수의 오버로드는 아님
아니 잠깐 학교 슬라이드 가져와보겠음 ㄱㄷ
음 애초에 이터레이터만 받네 교수가 헛소리한거야
https://gall.dcinside.com/mgallery/board/view/?id=ps&no=43669&page=1
advance때매 O(n) 맞는거 아닌가 생각했는데 시간측정 밖에 벗어나있구나 나는 병신