2011-03-27 4 views
1

문자열의 각 문자를 반복하여 개별적으로 복사해야한다고 가정하기 때문에 O (n)으로 설명 된 문자열을 복사하는 작업을 보았습니다. 여기서 n은 문자열의 길이입니다. 그러나 컴파일러가 일정 시간 동안 전체 메모리 블록을 복사 할 수있는 명령어를 생성 할 수 없습니까? 오늘날의 일반적인 아키텍처에도 이러한 기능이 존재합니까?문자열을 일정 시간에 복사 하시겠습니까?

+0

두 번째 문장에서 "선형"대신 "상수"를 사용 했었습니까? – sepp2k

+0

예, 나는 거기에 "상수"를 의미했습니다. 결정된. – newdayrising

답변

1

제가 아는 한 멀쩡합니다.

그러나 O() 표기법이 의미가 있으려면 먼저 각 기본 작업의 비용을 정의해야합니다. 이것은 "생략 가능"하기 때문에 종종 생략됩니다. 그리고 대부분의 시간은 정말로 그렇습니다. 귀하의 (가설적인) 시나리오는 비용을 정의하는 것이 필수적인 상황의 좋은 예입니다.

또 다른 유용한 예제는 디스크 또는 테이프 저장소 검색/정렬 알고리즘을 분석하는 것입니다.

1

임의로 큰 데이터 블록을 복사하는 명령어를 사용하는 경우 해당 단일 명령어는 O (n) 시간 자체를 취하도록 바인딩됩니다.

+2

하드웨어에서 어떻게 구현되는지에 따라 다릅니다. 예를 들어, 64 비트 컴퓨터는 특수한 SIMD 명령을 사용하고 레지스터를 레지스터에 복사하는 경우 8 비트의 "문자열"을 한 번에 병렬로 복사 할 수있는 충분한 하드웨어가 있습니다. 특히 그래픽 프로세서에서 훨씬 더 큰 블록을 복사 할 수있는 것보다 명령 및 메모리 아키텍처를 상상하는 것은 그리 오래 걸리지 않았습니다. 우리는 18 개월마다 칩에 맞는 여분의 트랜지스터를 모두 사용해야합니다. 기술적으로는 여전히 O (n)이지만 관심 대상 범위 내에서 O (1) 일 것입니다. –

+1

@Karl Big-O를 '작은 값'으로 제한하면 의미가 없습니다. –

1

일부 CPU 아키텍처는 하나의 위치에서 다른 위치로 메모리 블록을 복사하는 단일 명령을 가지고 있지만 그 단일 명령에는 많은 사이클이 걸렸으므로 여전히 O (n)이었습니다. 무슨 일이 있어도 CPU는 주소 버스를 통해 각 문자를 읽어야하므로 O (n)을 벗어날 방법이 없습니다.

1
  1. O (n)이 선형이므로 일정 시간 또는 선형 미만이라고 생각합니다.

  2. 메모리가 작동하기 때문에 불가능합니다. 복사 할 때 무언가는 기억의 각 세포에 접근하고 그것을 다른 세포에 베낄 필요가있다. 여러 셀을 병렬로 만들 수는 있지만 가변 개수의 셀을 만들 수는 없습니다. 결국 모든 비트는 전선을 사용하여 복사해야하며 메모리가 시스템을 연결하는 와이어의 수보다 크다고 가정해야합니다. DMI와 같은 독립 요소가 있기 때문에 프로세서 시간을 절약 할 수 있고 다른 것들을 병렬로 계산할 수 있으므로 계산 시간을 소비 할 필요가 없습니다.

P. 귀하의 질문은 이론적 인 컴퓨터 과학을 실제 기술과 구현과 혼합하여 질문의 정신으로 대답하기는 어렵지만 제기 한 요점을 다루려고 노력했습니다.

0

.NET 문자열은 변경 불가능한 참조 개체입니다. 참조 만 복사해야하므로 일정 시간에 "복사"됩니다.

+1

문자열 복사가 아닙니다. –

+0

.NET에서 그것은 문자열 복사입니다. – mgronber

+1

음, .NET 속임수; p –

관련 문제