2014-09-09 10 views
0

알고리즘을 사용한 작업을 통해 수년 동안 알고리즘의 점근 적 동작에 관한 질문이 생겼습니다.행렬을 입력으로 사용하는 알고리즘의 큰 O 표기법

수학에서는 Big-W (hatever)를 "입력 크기 'n'에 대해 측정 한 f (n)의 점근 적 거동으로 정의 할 수 있습니다." 내 마음에 오는 큰-O의 정의는 (의역)된다

In order for f(n) to be O(g(n)) we need to find a constant that multiplied by g(n) the expression 'f(n) < c*g(n)' from an initial input (i.e. n0) and forever.

우리가 볼 수 있듯이, 모든 것이 'N'(입력)에 따라 측정된다.

내 질문은 알고리즘의 입력 크기가 매트릭스 (자체가 이미 제곱) 인 경우 두 개의 중첩 된 'for'루프를 사용하여이를 트래버스하는 경우 알고리즘이 여전히 O (n) 알고리즘?

예 :

1 1 1 1 0 1 
2 2 0 2 1 0 
3 3 1 3 2 1 
0 4 2 4 3 2 
1 5 3 5 4 0 
2 6 0 6 5 1 

for(var row=0; row<matrix.rows; row++){ 
    ... 
    for(var col=0; col<matrix.columns; col++){ 
     ... 
    } 
} 

내 로직이이 O 인 것을 나 지시 (N^2) 그러나 수학 매우 다르며 동작은 입력 크기에 따라 측정된다. 이것이 O (n^2)이면 괜찮습니다. 그러나 내가 혼란스럽게 여기는 것은 다른 관점에서 문제를 보았을 때 나에게 엉망이되어 버린다는 것입니다. 행을 탐색하는 경우 알고리즘의 입력이 cols * rows (행렬)이고 내가 행을 가로 지르면서 O (log (n))로 동작한다고 말할 수 있습니다.

누군가이 작품과 같은 것을 설명 할 수 있습니까? 그것은 O (n) 또는 O (n^2)일까요? 다른 크기 (예 : 큐브 등)에서 동일합니까?

P. 나는 내가 자신을 올바르게 설명했기를 바란다.

답변

0

저는 전문가는 아니지만, 알고있는 한 O (n) 알고리즘입니다. 이것이 귀하의 의견입니다.

입력에 정확히 n^2 개의 요소가 있고 각 요소를 한 번만 처리하고 있습니다.

입력 복잡도를 알아 내기 위해 입력 크기를 결정할 때주의해야합니다. 나는 더 미묘한 예를 들어 줄 것이다.

주어진 숫자 'n'이 소수인지 아닌지 알아 내야합니다. 1에서 n-1로 나눌 수있는 간단한 알고리즘을 작성합니다. 자, 당신은 n 개의 연산만을 수행하고 있다고 주장 할 수 있습니다. 따라서 O (n) 알고리즘입니다. 그러나 실제로이 알고리즘은 지수 함수입니다. 그 이유는 입력 값의 크기가 'n'이 아니라 log n 비트로 표시된 단일 값이기 때문입니다. 그래서 입력 크기는 log n입니다. 이제 n 개의 작업을 수행하고 있습니다. 따라서 알고리즘의 연산 수와 입력 크기 사이의 관계는 지수 적입니다 (n = 2^(log n)이기 때문에).

여기서는 구별되는 아이디어가 입력 값 당 연산 수를 계산하기 때문에 연산을 의미합니다. 여러분은 입력이 단지 하나의 행렬이고 하나의 원소로 취급하기를 원한다고 주장 할 수 있습니다. 따라서 알고리즘은 O (1)입니다. 그러나 이것은 사실이 아닙니다. 복잡성 컨텍스트에서 연산의 정의는 입력의 단위에서 수행 할 때마다 일정한 시간 내에 발생해야한다고 말합니다. 그러나 한 요소 (행렬)가 가변 크기이고 배수가 제한없이 크게 변할 수 있기 때문에 일정한 시간에 행렬 작업을 수행 할 수 없다고 주장 할 수 없습니다. 이를 정수의 곱셈과 비교하면 컴퓨터는 곱셈을 수행하는 특수 하드웨어를 사용하며 정수 곱셈에 소요되는 시간의 상한에는 정수 값의 함수가 아닌 보장 (최대 허용 오차까지)이 있습니다.