하드웨어 / 구현이 알고리즘의 시간 / 공간 복잡성에 영향을 줍니까?


32

나는 CS 학생조차 아니기 때문에 이것은 멍청한 질문 일지 모르지만 나와 함께 견뎌주십시오 ...

컴퓨터 이전 시대에는 서랍 배열과 같은 배열 데이터 구조 만 구현할 수 있습니다. 값을 추출하기 전에 해당 색인이있는 드로어를 찾아야하므로 배열 검색의 시간 복잡도는 이진 검색을 가정하는 입니다.O(log(n))

그러나 컴퓨터의 발명은 큰 차이를 만들었습니다. 최신 컴퓨터는 RAM에서 너무 빨리 읽을 수 있으므로 이제 어레이 조회의 시간 복잡성을 간주합니다 (기술적으로는 그렇지 않습니다. 레지스터를 먼 거리로 이동하는 데 더 많은 시간이 걸리기 때문입니다)O(1)

또 다른 예는 Python 사전입니다. 잘못 작성된 오버로드 된 매직 메소드 (또는 엄청나게 나쁜 운, 즉 해시 충돌이 많은 키 사용하여 의 사전 액세스 복잡성을 얻을 수 있지만 일반적으로 추정됩니다 . 이 경우 시간 복잡도는 파이썬 사전의 해시 테이블 구현과 해시 함수의 키 구현에 따라 다릅니다.O(n)__hash__O(1)

이는 하드웨어 / 구현이 알고리즘의 시간 복잡성에 영향을 줄 수 있음을 의미합니까? (두 예제 모두 알고리즘 대신 데이터 구조에 관한 것이지만 후자는 전자에 기반을두고 있으며 데이터 구조의 시간 복잡성을 들어 본 적이 없으므로 여기서는 "알고리즘"이라는 용어를 사용하고 있습니다.

나에게 알고리즘은 추상적이며 개념적이며 시간 / 공간 복잡성과 같은 속성은 특정 방식으로 구현되는지 여부에 영향을받지 않아야하지만 그렇지 않습니까?


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Gilles 'SO- 악마 그만'

답변:


42

확실한. 확실히. 불편을 조정하는 방법은 다음과 같습니다.

알고리즘의 실행 시간을 분석 할 때 특정 계산 모델 과 관련하여 수행합니다 . 계산 모델은 각 기본 작업을 수행하는 데 걸리는 시간과 같은 항목을 지정합니다 (배열 조회 시간 또는 시간?). 알고리즘의 실행 시간은 계산 모델에 따라 달라질 수 있습니다.O(logn)O(1)

계산 모델을 선택하면 알고리즘 분석은 더 이상 하드웨어에 의존하지 않는 순수하고 추상적이며 개념적이며 수학적인 연습입니다.

그러나 실제로 우리는 일반적으로 하드웨어의 현실을 적어도 합리적인 정도로 반영하는 계산 모델을 선택하려고합니다. 따라서 하드웨어가 변경되면 새로운 하드웨어에 더 적합한 다른 계산 모델로 알고리즘을 분석하기로 결정할 수 있습니다. 이것이 하드웨어가 작동 시간에 영향을 줄 수있는 방법입니다.

이것이 명백하지 않은 이유는 입문 수업에서 종종 계산 모델에 대해 이야기하지 않기 때문입니다. 우리는 명시 적으로 만들지 않고 암시 적으로 몇 가지 가정을합니다. 그것은 교육적 목적을 위해 합리적이지만 비용이 있습니다. 분석의이 측면을 숨 깁니다. 이제 알 잖아


당신이 말했듯이, 우리는 랜덤 액세스 모델을 계산 모델로 사용하지만 특정 계산에 GPU를 사용하면 SIMD 명령어를 사용할 때 일부 알고리즘의 시간 복잡성이 변경됩니다.
Deep Joshi

6
또한 O () 표기법은 상한입니다. 서랍 비유를 사용하더라도 제한된 크기 (실제 메모리는 크기가 제한됨)의 서랍을 찾는 데 O (1) 시간이 걸립니다. 20 분이 메모리에 액세스하기위한 숨겨진 상수이기 때문에 여전히 가장 긴 서랍에 도달하는 데 20 분이 걸리더라도 (모든 캐시 미스 및 스왑에서 데이터를로드해야 함) 여전히 O (1) 시간입니다.
Goswin von Brederlow

2
@GoswinvonBrederlow가 말하는 실제 예를 들어, 해시 맵으로 값을 검색하는 것은 사실상 입니다. 정렬되지 않은 배열에서 값을 검색하는 것은 입니다. 그러나 최근에 작성한 실제 응용 프로그램에서 배열을 사용하는 것이 해시 맵을 사용하는 것보다 빠릅니다. 검색 할 값이 적기 때문에 (10 미만) 더 빨랐으며 해시 및 해시 맵 알고리즘을 수행하는 오버 헤드는 실제로 배열 검색을 강제하는 비용보다 더 컸습니다! 실용적인 크기의 문제의 경우이 방법으로 코드를 3 배까지 올렸습니다. O ( n )O(1)O(n)
Cort Ammon-복원 모니카

1
@CortAmmon : 큰 배열에서도 선형 검색을 사용하는 것이 요소 중 일부만 검색하는 것이 거의 시작에 가까운 경우 해시 맵을 사용하는 것보다 빠를 수 있습니다. 예를 들어 요소의 50 %가 첫 번째 요소와 일치하고 25 %가 두 번째 요소와 일치하고 12.5 %가 세 번째와 일치하는 경우를 제외하고 하나의 홀수 볼 요소가 배열의 임의의 위치에있는 항목과 일치한다는 점을 제외하고 N 크기 목록에서 M 조회를 수행하면 2M + N이됩니다.
supercat 2016 년

5
@DeepJoshi SIMD 명령어는 알고리즘의 복잡성을 변경하지 않습니다. 곱셈 상수 만 변경합니다.
Gilles 'SO- 악마 그만'

5

나는 그 질문에 근본적인 오해가 있다고 생각합니다. 정렬 된 목록에서 객체를 찾는 사람 (예 : 책의 특정 페이지, 번호가 주어진)을 배열에서 항목을 찾는 컴퓨터와 비교합니다.

전 시간에 걸리는 이유 , 후자는 시간 걸리는 이다 하지 컴퓨터가 눈 깜짝 할 사이에 이진 검색을 할 수있는만큼 빠르게된다. 오히려 컴퓨터가 이진 검색을 전혀 사용하지 않기 때문입니다. 컴퓨터에는 검색하지 않고 어레이에서 항목을 직접 검색하는 메커니즘이 있습니다. 배열 셀의 내용을 검색하기 위해 컴퓨터는 메모리 컨트롤러에 "Give me page 17"의 아날로그를 알려주고, 메모리 컨트롤러는 주소 와이어의 전압을 17의 이진 표현으로 설정하고 데이터가 되돌아옵니다.O ( 1 )O(logn)O(1)

따라서 DW가 설명하는 것처럼 하드웨어 (예 : 계산 모델)는 알고리즘의 실행 시간에 영향을 주지만 이는 어레이 액세스 예제의 기반이 아닙니다.


2
공평하게 말하면, "메모리 컨트롤러는 주소 와이어의 전압을 17의 이진 표현으로 설정"과 "데이터가 다시 온다"사이의 모든 부분을 건너 뛰었다. 그 조각 중 하나는 거의 확실 하다 영업 의해 기술 된 종류의 이진 검색 트리; 그럼에도 불구하고 모든 n에 대해 log n 이 대략 64 이므로 상수 시간에 실행됩니다 .
Quuxplusone

@Quuxplusone 메모리의 어떤 부분에서 이진 검색을 사용합니까? 어드레스 라인은 메모리 셀을 직접 선택한다.
David Richerby 2016 년

우리는 저의 전문 분야 밖에서 멀리 운영하고 있지만, 제가 암시하고자하는 것은 주소 디코더 가 디 먹서 트리 측면에서 구현 될 것 입니다. ( 캐싱과 함께 제공되는 추가 합병증은 무시하고 물리적 메모리에 직접 충돌한다고 가정합니다 .) 다시 말하지만이 추가 합병증 O(lg size-of-memory)은 무시할 수있는 부분 만 추가합니다 .
Quuxplusone

2

아니요, 하드웨어는 알고리즘의 복잡성에 영향을 미치지 않습니다.

그러나 이것은 알고리즘의 선택에 영향을 미치며, 분석이 무의미 해 지거나 (또는 ​​단지 학문적 관심사가되는) 복잡성 분석의 유용성에 영향을 줄 수 있습니다.

배열 요소에 액세스 할 때 올바른 드로어를 찾는 것은 "선형 검색"또는 "이진 검색"알고리즘이 아니라 "인덱스로 직접 N 번째 요소 열기"알고리즘을 사용합니다. 알고리즘은 변경되지 않고 선택됩니다.

반면에 복잡성 분석 자체 또는 그 의미 하드웨어의 영향을 크게받습니다.

복잡성 분석에 의해 별이 많은 많은 알고리즘은 성능이 좋지 않거나 실제로는 쓸모가 없습니다. 중요하지 않은 상수 요소는 전혀 중요하지 않지만 지배적 입니다.

또는 한 번 참된 (또는 대부분 참된) 가정은 더 이상 유지되지 않기 때문입니다. 예를 들어, 모든 작업은 거의 동일하거나 (중요하지 않은 작은 상수 차이 만), 어떤 순서로 액세스하는 메모리 위치에 차이를 만들지 않습니다. 복잡성 분석을 통해 일부 알고리즘은 매우 많은 작업 만 필요하므로 매우 우수하다고 결론 지을 수 있습니다. 실제로, 각 작업이 보장 된 캐시 미스 (또는 더 나쁘지만 페이지 결함)를 유발하는 것을 발견 할 수 있습니다. 이는 더 이상 중요하지 않지만 모든 것을 지배 하는 k 를 너무 크게 나타냅니다.
알고리즘 A가 주어진 크기의 데이터 세트를 처리하기 위해 500 번의 작업을 수행하고 알고리즘 B가 5를 취하지 만 B가 5 개의 결함을 발생시켜 각각 2 천만 사이클을 태운다면, 분석이나 상식이 말할 수 있더라도 A가 더 좋습니다.

이것은 몇 년 전 Cuckoo Hashing과 같은 재미있는 놀라움으로 이어졌습니다. [장점 목록]이 매우 우수했습니다. 과대 광고가 식은 후에는 모든 액세스에서 2 개의 캐시 미스 (더 큰 데이터 세트의 결함)를 보장 했기 때문에 크게 열등한 것으로 나타났습니다 .

데이터의 부분 집합을 식별하고 처리하는 것도 비슷합니다. 오늘날 올바른 해결책은 "그냥 다해라"입니다 . 즉, 예상하고 수행해야하는 것을 파악하는 대신 절반 만 필요한 경우에도 전체 데이터 세트를 선형으로 처리합니다. 믿거 나 말거나, 분기 오류, 캐시 누락, 페이지 오류가 없기 때문에 더 빠릅니다.
3MB 파일의 처음 8kB와 마지막 3kB를 읽어야합니까? 글쎄, 완전한 파일을 읽고 원하지 않는 것을 버린다. 왜냐하면 그 사이를 탐색하는 것이 단지 완전한 것을 읽는 것보다 10 배 느릴 것이기 때문이다.

로그가 복잡하기 때문에지도를 사용 하시겠습니까? 아니면 액세스 시간이 일정한 해시 테이블입니까? 끊임없는 소리. 글쎄, 하드웨어, 데이터 크기 및 액세스 패턴에 따라 수천 개 미만의 항목이있는 경우 선형 검색은 그와 비슷하거나 더 좋을 수 있습니다. 놀람.

따라서 영향을받는 것은 알고리즘 자체가 아니라 유용성과 선택입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.