Big-O-Notation의 정규 런타임에 변형이 있습니까?


9

또는 등과 같은 여러 표기법 이 있습니다 . 실제로 또는 와 같은 변형이 있거나 수학적으로 부 정확한지 궁금합니다.OO(n)O(n2)O(2n2)O(logn2)

아니면 를 로 향상시킬 수 있다고 말하는 것이 ? 나는 아직 런타임을 알아낼 필요가 없으며 아무것도 개선 할 필요가 없지만 이것이 실제로 함수를 설명하는 방법인지 알아야합니다.O(5n2)O(3n2)


1
점근 분석 동안 O (5n ^ 2)와 O (3n ^ 2) 사이에는 물질적 차이가 없습니다. 둘 다 O (n ^ 2)이며 상수 만 다릅니다. 실제로, 증명에서는 O (5n ^ 2)를 O (3n ^ 2) 또는 O (n ^ 2)로 줄여서 수학 연산을 동일하게 만들 수 있습니다. 증거를 작성할 때 사이드 바에 동등한 내용이라는 메모를 작성하십시오. 실제로 O (log n)을 O (n)으로 바꾸고 세로 막대에서 O (log n) <= O (n)을 확인할 수도 있습니다. 사이드 바에있는 메모는 독자에게 오타가 아니라 의도적 인 것임을 알려줍니다. (적어도 그것이 대학에서 알고리즘 분석을 할 때 한 일입니다).
jww

2
당신이 사용하는 경우 O() 작은 요소를 제거하는 표기법을 사용하면 항상 "...와 같은 것을 쓸 수 있습니다. 5n2+o(n2) 아래로 3n2+o(n2)"등. (5+o(1))n2(3+o(1))n2. 일부 저자는 글쓰기를 선호합니다5n2전자의 약자로. 예를 들어 Trefethen과 Bau의 교과서를 참조하십시오.
요나탄 N

답변:


21

나는 실제로 같은 것들의 변형이 있는지 궁금합니다. O(2n2) 또는 O(log(n2))또는 수학적으로 잘못된 경우.

예, O(2n2) 또는 O(log(n2)) 유효한 변형입니다.

그러나 특히 최종 결과에서 전혀 볼 수 없다면 거의 볼 수 없습니다. 그 이유는O(2n2) 이다 O(n2). 비슷하게,O(log(n2)) 이다 O(logn). 초보자에게는 놀랍습니다. 그러나 이러한 평등은 그 이유가 큰 이유입니다O종종 고정하기 어렵고 상대적으로 중요하지 않은 곱하기 상수 인자를 숨기기 위해 표기법이 도입되었습니다.

그것이 개선 될 수 있다고 말하는 것이 옳은가? O(5n2)O(3n2)?

알고리즘의 시간 복잡성이 다음과 같이 바뀌면 전혀 개선되지 않습니다. O(5n2)O(3n2) 또는 Ω(5n2)Ω(3n2), 때문에 O(5n2) 이다 O(3n2) 동안 Ω(5n2) 이다 Ω(3n2). 따라서 시간 복잡성이 개선되었다고 말하는 것은 잘못입니다.O(5n2)O(3n2). 알고리즘의 시간 복잡성이 개선되었다고 말하는 것이 옳습니다.5n23n2, 물론이야.


1. 운동 보기 것을O(5n2)=O(3n2)=O(n2).

2. 운동 보기 것을O(logn)=O(log(n2)).

3. 운동 보기 것을Ω(n2+n)=Ω(n2).


1
@bv_Martn 다음은 표기법을 이해하는 데 유용한 링크입니다. O(n)는 다음과 같이 정의됩니다 : (단순한 한계 미적분학!) : math.stackexchange.com/questions/925053/…
Akshat Mahajan

2
big-O 표기법에서 일정한 요소를 본 유일한 시간은 누군가가 두 알고리즘이 동일한 복잡성 클래스이지만 그 중 하나가 다른 알고리즘보다 엄격하다는 점을 지적하고자 할 때입니다.
Mark

7
@AkshatMahajan 질문에 대한 유일한 답변/math/925053 입니다. 큰 신뢰할만한 소스가 많이 있습니다O표기법.
John L.

1
"알고리즘의 시간 복잡성이 5n ^ 2에서 3n ^ 2로 개선되었다고 말하는 것이 옳습니다."정확한 실행 시간은 종종 입력 크기와 값에 따라 다릅니다. 또한 모든 작업에 가중치를 부여하고 한 작업에 중점을 둡니다. 실제로 얻을 수있는 상수 요소에 대해 말하거나 다른 가중치를 사용하는 다른 알고리즘과 비교할 수는 없습니다. 따라서 몇 가지 유효한 유스 케이스가있을 수 있지만 위와 같은 내용은 유용성이 제한적입니다 (아마도 거의 보이지 않습니다).
Bernhard Barker

1
@ 마크 : 그것은 단순히 잘못입니다.
user21820

13

이 표기법 을 전혀 사용 하지 않아도 됩니다. 즉, 기능을 결정할 수 있습니다f(n)최대한 정확하게, 그리고 그것을 개선하려고 노력하십시오. 예를 들어 정렬 알고리즘을 만들 수 있습니다f(n) 비교, 그래서 당신은 할 수있는 다른 정렬 알고리즘을 생각해 볼 수 있습니다 g(n)비교. 물론 모든 종류의 기능f(n) (이론적으로) 존재하며 (실제로) 올 수도 있습니다.

Big Oh 표기법을 마법사와상의하여 무언가를 할 수 있는지 묻는 신비한 마술로 취급하는 대신, 그 정의를 살펴 봐야합니다 . 정의를 존중 한 다음 작업을 수행하는 데 필요한 모든 작업을 수행하십시오.


글쎄, 나는 아직 실제로 필요하지 않습니다. 또는 이론 상으로는 실제로 위키피디아에서 제공 한 정의 O (1) -O (n!) 만 존재하는지 또는 실제로는 O와 같이 다른 경우 다르게 설명 할 수 있는지 알아야합니다. (7N). 내 두려움은 내가 수학 교수가 날개를 풀면
bv_Martn

1
누구나 만드는 모든 정의가 존재합니다. 표기법을 잘 읽어야합니다.O(1) 또는 O(n!)귀하의 질문이 이해되지 않기 때문입니다. 바로 가기가 없습니다. 수학적 내용이 무엇을 의미하는지 이해하려면 시간을 투자해야합니다.
Juho

6
@bv_Martn 수학 교수는 예제 목록을 정의 목록으로보고 있기 때문에 훨씬 더 가능성이 높습니다 . 수학의 요점 중 많은 부분은 특정한 경우가 아니라 일반적으로 작동하는 방식으로 사물을 정의하는 것입니다. 귀하의 질문은 기본적으로 "Wikipedia는 하나를 추가하고 2를 추가하고 17을 추가 할 수 있다고 말합니다. 그러나 다른 숫자도 추가 할 수 있습니까?"
David Richerby

7

허용 대답은 아주 좋은하지만, 여전히 진짜 이유에 접촉하지 않는 이유 O(n)=O(2n).

Big-O Notation은 확장 성을 설명 합니다

핵심적으로 Big-O Notation은 알고리즘 실행 시간에 대한 설명이 아닙니다. 또한 알고리즘이 수행하는 단계, 코드 라인 또는 비교 수에 대한 설명도 아닙니다. 입력 수에 따라 알고리즘이 확장되는 방식을 설명하는 데 가장 유용합니다.

예를 들어 이진 검색을 수행하십시오. 정렬 된 목록이 주어지면 그 안에 임의의 값을 어떻게 찾습니까? 글쎄, 당신은 중간에서 시작할 수 있습니다. 목록이 정렬되었으므로 중간 값은 대상 값이있는 목록의 절반을 알려줍니다. 따라서 검색해야하는 목록이 반으로 나뉩니다. 이것은 재귀 적으로 적용 된 다음 새 목록의 중간으로 이동하여 목록 크기가 1이고 값을 찾을 때까지 (또는 목록에 존재하지 않을 때) 계속 진행할 수 있습니다. 목록의 크기를 두 배로 늘리면 알고리즘에 하나의 추가 단계 만 추가되며 이는 로그 관계입니다. 따라서이 알고리즘은O(logn). 로그는 기수 2이지만 중요하지 않습니다. 관계의 핵심은 목록에 상수 값을 곱하면 상수 값만 시간에 추가된다는 것입니다.

정렬되지 않은 목록을 통한 표준 검색과 대조-이 경우 값을 검색하는 유일한 방법은 각 값을 확인하는 것입니다. 최악의 시나리오 (Big-O가 구체적으로 암시하는 것)는 가치가 맨 끝에 있다는 것입니다. 이는 크기 목록을 의미합니다.n, 확인해야합니다 n가치. 목록의 크기를 두 배로 늘리면 확인해야하는 횟수가 두 배가되며 이는 선형 관계입니다.O(n). 그러나 각 값에 대해 두 가지 작업을 수행해야하더라도 선형 관계와 같은 일부 처리는 여전히 유효합니다.O(2n) 설명자와 같은 확장 성을 설명하기 때문에 단순히 설명 자로 유용하지 않습니다. O(n).

이러한 답변 중 많은 부분이 기본적으로 Big-O의 정의를 읽음으로써 이러한 결론에 도달하라고 알려주는 것에 감사합니다. 그러나이 직관적 이해는 내 머리를 감싸는 데 꽤 오랜 시간이 걸렸으므로 가능한 한 평범하게 당신에게 그것을 배치했습니다.


5
이 유형의 답변에서 가장 큰 문제는 Big Oh의 정의를 건드리지 않고 "이 작업을 수행 할 때와이 작업을 수행하는 시점을 참조하십시오. O(n)". 개인적으로, 나는 Big Oh가 알고리즘과 전혀 관련이 없으며 그것으로 시작한다는 것을 누군가에게 말하는 것이 훨씬 더 유익하다고 생각합니다.
Juho

3
@Juho 어쩌면 대부분의 컴퓨터 과학자에게는 유익하지는 않지만 쓸모가 없습니다.
분산

4
이것으로 나는 동의하지 않아야한다. 컴퓨터 과학자로 자신을 표시하는 것은 어떤 표기법이 사용하는 의미가 무엇인지, 즉 모든 수학을 건너 뛰는 것을 이해하지 못한다는 변명의 여지가 없어야합니다.
Juho

3
네. 나는이 물건을 이해하지 못하는 프로그래머에게 반대하지 않지만 컴퓨터 과학자 라고 부르고 싶다면 이것이 핵심 재료입니다.
David Richerby 2014 년

2
@dkaeae No, I'm referring to people who work other careers in the field, such as software developers.
scatter

5

You can write O(f) for any function f and it makes perfect sense. As per the definition, g(n)=O(f(n)) if there is some constant c such that g(n)cf(n) for all large enough n. Nothing in that definition says that f must be some sort of "nice" function.

But, as other answers have pointed out, g(n)=O(f(n)) and g(n)=O(2f(n)) describe exactly the same situation: if g(n)cf(n) for all all large enough n, then we also have g(n)c22f(n), so g(n)=O(2f(n)), also (taking the constant to be c/2).

As a side issue, don't write "logn2", because it's not 100% clear what it means. You could say that it obviously means log(n2) but almost everybody would write that as 2logn, so it puts doubt in the reader's mind.

Also, note that big-O notation has nothing to do with runtimes per se. It's just a notation for relationships between functions. Those functions are often used to measure the runtimes of algorithms but that's just one application, just like measuring people's heights is just one application of numbers.


4

Look at the definition of O(f(n)), and you see that for example O(2n^2) and O(n^2) are exactly the same. Changing an algorithm from 5n^2 to 3n^2 operations is a 40 percent improvement. Changing from O(5n^2) to O(3n^2) isn’t actually any change, they are the same.

Again, read the definition of O(f(n)).


4

It may be helpful to understand that Big-O describes a set of functions. That is O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

The usage of = is kind of unfortunate and using would make that relationship a lot clearer. but the set notation symbols are a bit difficult to type so now we are stuck with the current convention.

This then shows that O(n)=O(2n) Or that constant factors don't matter when defining the Big O.


4
The equality convention isn't really about typing. It's because the usefulness of expressions such as log(n!)=nlognn+O(logn) encourages us to view O(f) as both "the set of functions such that [...]" and "some function such that [...]"
David Richerby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.