문자열의 각 문자를 반복하여 개별적으로 복사해야한다고 가정하기 때문에 O (n)으로 설명 된 문자열을 복사하는 작업을 보았습니다. 여기서 n은 문자열의 길이입니다. 그러나 컴파일러가 일정 시간 동안 전체 메모리 블록을 복사 할 수있는 명령어를 생성 할 수 없습니까? 오늘날의 일반적인 아키텍처에도 이러한 기능이 존재합니까?문자열을 일정 시간에 복사 하시겠습니까?
답변
제가 아는 한 멀쩡합니다.
그러나 O() 표기법이 의미가 있으려면 먼저 각 기본 작업의 비용을 정의해야합니다. 이것은 "생략 가능"하기 때문에 종종 생략됩니다. 그리고 대부분의 시간은 정말로 그렇습니다. 귀하의 (가설적인) 시나리오는 비용을 정의하는 것이 필수적인 상황의 좋은 예입니다.
또 다른 유용한 예제는 디스크 또는 테이프 저장소 검색/정렬 알고리즘을 분석하는 것입니다.
임의로 큰 데이터 블록을 복사하는 명령어를 사용하는 경우 해당 단일 명령어는 O (n) 시간 자체를 취하도록 바인딩됩니다.
하드웨어에서 어떻게 구현되는지에 따라 다릅니다. 예를 들어, 64 비트 컴퓨터는 특수한 SIMD 명령을 사용하고 레지스터를 레지스터에 복사하는 경우 8 비트의 "문자열"을 한 번에 병렬로 복사 할 수있는 충분한 하드웨어가 있습니다. 특히 그래픽 프로세서에서 훨씬 더 큰 블록을 복사 할 수있는 것보다 명령 및 메모리 아키텍처를 상상하는 것은 그리 오래 걸리지 않았습니다. 우리는 18 개월마다 칩에 맞는 여분의 트랜지스터를 모두 사용해야합니다. 기술적으로는 여전히 O (n)이지만 관심 대상 범위 내에서 O (1) 일 것입니다. –
@Karl Big-O를 '작은 값'으로 제한하면 의미가 없습니다. –
일부 CPU 아키텍처는 하나의 위치에서 다른 위치로 메모리 블록을 복사하는 단일 명령을 가지고 있지만 그 단일 명령에는 많은 사이클이 걸렸으므로 여전히 O (n)이었습니다. 무슨 일이 있어도 CPU는 주소 버스를 통해 각 문자를 읽어야하므로 O (n)을 벗어날 방법이 없습니다.
O (n)이 선형이므로 일정 시간 또는 선형 미만이라고 생각합니다.
메모리가 작동하기 때문에 불가능합니다. 복사 할 때 무언가는 기억의 각 세포에 접근하고 그것을 다른 세포에 베낄 필요가있다. 여러 셀을 병렬로 만들 수는 있지만 가변 개수의 셀을 만들 수는 없습니다. 결국 모든 비트는 전선을 사용하여 복사해야하며 메모리가 시스템을 연결하는 와이어의 수보다 크다고 가정해야합니다. DMI와 같은 독립 요소가 있기 때문에 프로세서 시간을 절약 할 수 있고 다른 것들을 병렬로 계산할 수 있으므로 계산 시간을 소비 할 필요가 없습니다.
P. 귀하의 질문은 이론적 인 컴퓨터 과학을 실제 기술과 구현과 혼합하여 질문의 정신으로 대답하기는 어렵지만 제기 한 요점을 다루려고 노력했습니다.
.NET 문자열은 변경 불가능한 참조 개체입니다. 참조 만 복사해야하므로 일정 시간에 "복사"됩니다.
- 1. Java에서 일정 시간에 두 개의 목록을 병합
- 2. 리스트에서 두 요소를 일정 시간에 비교하는 방법
- 3. 현재 시간에 일정 시간을 추가하고 내가 사용하고 그것을
- 4. actionscript 3에서 일정 시간에 일정을 호출하는 방법은 무엇입니까?
- 5. ScriptScope를 복사 하시겠습니까?
- 6. 개발 중에 일정 금액의 트랜잭션을 롤백 하시겠습니까?
- 7. 건설 시간에 기본지도의 스타일을 지정 하시겠습니까?
- 8. Django/Python의 특정 시간에 메서드를 호출 하시겠습니까?
- 9. VideoView에서 시간에 따라 텍스트보기를 표시 하시겠습니까?
- 10. 사용자가 지정한 시간에 앱을 시작 하시겠습니까?
- 11. UrlMappings에서 문자열을 연결 하시겠습니까?
- 12. 스프링으로 문자열을 빌드 하시겠습니까?
- 13. 여러 문자열을 연결 하시겠습니까?
- 14. VBS 문자열을 계속 하시겠습니까?
- 15. jquery 문자열을 삭제 하시겠습니까?
- 16. 문자열을 배열에 저장 하시겠습니까?
- 17. regexp 문자열을 탈출 하시겠습니까?
- 18. base64 문자열을 디코딩 하시겠습니까?
- 19. 일정 관리
- 20. 문자열을 Linq.Expressions로 변환하거나 문자열을 선택기로 사용 하시겠습니까?
- 21. 배열을 거꾸로 복사 하시겠습니까? Array.Copy?
- 22. System.Windows.Forms.Clipboard없이 클립 보드에 복사 하시겠습니까?
- 23. NSFileManager : 파일을 자동으로 복사 하시겠습니까?
- 24. C++ : L ""문자열을 WCHAR []에 할당 하시겠습니까?
- 25. 소멸자와 (왜이이 시간에 전화를받을 않습니다)를 호출 복사 생성자 ..
- 26. 안드로이드에서 EditText의 안드로이드에서 문자열을 문자열 변수로 복사
- 27. 문자열을 한 열에서 다른 열로 복사
- 28. ASP.NET에서 일정/일정 표 만들기
- 29. 일정 캘린더 채우기
- 30. 안드로이드 일정 SMS
두 번째 문장에서 "선형"대신 "상수"를 사용 했었습니까? – sepp2k
예, 나는 거기에 "상수"를 의미했습니다. 결정된. – newdayrising