복잡성 분석에서 왜 ++가 2 개의 작업으로 간주됩니까?
-
22-07-2019 - |
문제
내 컴퓨터 과학 II 수업에서 교수는 ++,-,*= 등을 2 작전으로 간주합니다. 그러나 어셈블리 수준에서 이것은 실제로 두 가지 작업이 아닙니다. 누군가가 단순성을 위해서만 설명 할 수 있습니까?
해결책
실제로 읽기, 증분 (또는 무엇이든), 쓰기 : 3 가지 작업이라고 생각합니다. 그것은 일종의 공유 메모리에서 어떤 종류의 로컬 스토리지 (예 : 레지스터 또는 스택)로 읽고 로컬 스토리지에서 작동 한 다음 글을 쓰고 있다고 가정합니다.
어셈블리 수준에서 얼마나 많은 운영이 있는지, 당신이 증분하는 것, 플랫폼, 하드웨어 등에 따라 다릅니다.
다른 팁
++ (예 : B ++)가 단순화하기 때문입니다.
b = b + 1
거기에는 두 가지 작업 (B + 1)이 있으며 원래 변수에 대한 추가 값의 할당이 있습니다.
복잡성 분석을 할 때 왜 귀찮게합니까? 그것은 단지 o (1) :-)입니다.
편집 : 투표 할 때 이유를 알려주십시오. 질문에 태그가 붙어 있으므로 복잡성, 나는 Big O 개념이 실제 상수보다는 가장 중요하다고 생각합니다. 게다가, 다른 답변에서 이미 언급 한 바와 같이, 이것은 얼마나 많은 운영이 이루어지는 요인에 따라 달라집니다 : 운영, 플랫폼, 컴파일러 등을 계산하는 방식.
나는 몇 가지 추측을 던질 것이다.
- 교수가 해석 된 언어를 언급하고 있습니까?
- ++ 나는 i ++와 다릅니다.
아마도 그의 어셈블리 랑 선택 중간 스토리지 변수가 필요할 수 있습니까?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
추가 플러스 세터가 아닌가?
i+= 1과 유사합니까?
교수는 아마도 값을 취하고 1에 1을 추가 한 다음 변수에 다시 할당해야한다고 언급하고있을 것입니다.
어셈블리 수준에서 모든 것이 레지스터로 수행되므로 변수가
ADD AX,1
그러나 컴파일 된 언어에서는 모든 것이 저장되어야합니다.
MOV AX,i
ADD AX, 1
MOV i, AX
기본 아키텍처를 완전히 잊지 않았다면 ...
당신은 나에게 좀 생각해 보았다 "배심원은 나가지 않습니다"오래 전에 들었던 문제.
"사전 진출은 사후 분쟁보다 빠릅니다"
방금 빠른 Google 검색을했습니다.
- 많은 사람들이 여전히 그것을 진실로 붙잡고 있습니다.
- 다른 사람들은 컴파일러가 너무 최적화되어 있으며 비교 고 레벨 코드 코드는 벤치마킹 할 수 없습니다.
- 아직 다른 사람 차이가 없다고 주장합니다.
상황에 따라 두 가지 의미가 있기 때문에 내 의견으로는 2 개 이상이어야하며, 나는 그것을 볼 때 항상 그들을 상기시켜야합니다.
a = b++
와 같다 a = b; b = b + 1
그리고
a = ++b
와 같다 b = b + 1; a = b
이것은 대부분의 첫해 학생들을 절벽에서 파견하기에 충분한 혼란입니다.