알고리즘이란

착한아이의 이미지

입력이 없는 어떤 함수가 있을때

void func(void) {
...
}

이 함수를 알고리즘이라고 부를수 있을까요..?

이 함수를 알고리즘이라고 부를수 있는 경우가 있다면, 이 함수를 알고리즘이라고 부를수 있는 경우에서의 알고리즘이라는 개념의 정의는 대략 어떻게 묘사할수 있을까요..? 그리고 그 정의에 따른 어떤 예가 있을까요..?

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

http://en.wikipedia.org/wiki/Algorithm#Why_algorithms_are_necessary:_an_informal_definition

Quote:

No generally accepted formal definition of "algorithm" exists yet.

http://ko.wikipedia.org/wiki/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98#.EC.95.8C.EA.B3.A0.EB.A6.AC.EC.A6.98.EC.9D.98_.EC.A1.B0.EA.B1.B4

Quote:

알고리즘은 일반적으로 다음의 조건을 만족해야 한다.

* 입력 : 외부에서 제공되는 자료가 0개 이상 존재한다.
* 출력 : 적어도 1개 이상의 결과를 내어야 한다.
...

이 조건을 따른다면 저건 알고리즘이 아니네요.

SoulreaveR의 이미지

알고리즘이라고도 볼 수 있지 않을까요?

착한아이의 이미지

출력은 있는것으로 생각해보죠..

int func (void) { ... } 쯤으로

제가 궁금해하는건 입력이 0일때의 상황이거든요..

제가 논지를 올릴 때는 논지에 관련된 의견을 듣고자 함이지, 논지의 여부를 논쟁하기 위함이 아니예요.
논지의 취지를 이해하지 못한 의견에는 가급적 답글 달지 않겠어요. :P

d3m3vilurr의 이미지

예를들어,
float pi() {
// ...
return pi;
}

이런 함수가 있다고 쳤을때,
이 함수는 pi수를 계산하는 공식을 처리하는 알고리즘 함수가 되겠죠.
pi라는 일종의 고정치를 연산하기 위함이므로, 입력값은 존재하지 않아도 될겁니다.

착한아이의 이미지

무리수를 결정하는 문제는 비록 그것이 상수라 할지라도 iteration에 의존하기 때문에, iteration에 따라 값이 달라지므로, 입력이 전혀 없다고 보기는 좀 무리일것 같아서, 입력이 없는 함수의 예로 적당한지 모르겠는요.. 일단 내부적으로 유한한 범위를 결정했다치면요..

float pi() { p = 3 + 0.14; return p; }

이 함수도 여전히 알고리즘으로 부를수 있까요..?

제가 논지를 올릴 때는 논지에 관련된 의견을 듣고자 함이지, 논지의 여부를 논쟁하기 위함이 아니예요.
논지의 취지를 이해하지 못한 의견에는 가급적 답글 달지 않겠어요. :P

d3m3vilurr의 이미지

위 함수는 리펙토링 과정상에서 상수를 반환하는 것이기 때문에 연산이 없다고 치게 될것같습니다.
굳이 따진다면 O(1)의 연산함수겠지만, 애초에 매직넘버에 가까운 연산이 될것 같군요.
제가 말한
float pi() {}
는 단순한 덧셈의 종료가 아닌, 수학적으로 처리하여 loop나, 재귀로 구현한 함수를 말한거였습니다.

이런것을 입력을 가지는것의 변형으로 보신다면, 원주율을 구하기 위한 기본 입력은 무엇이 될까요:)

pi보다는 e가 훨씬 명확할텐데

e = (n = 0 to inf) sig 1/(n!)
인 급수입니다.

float가 아니라 string이라고 치고,
함수 e()가 메모리 한계의 크기 만큼의 e의 수를 연산해서 반환한다고 할때,
이 연산 과정이 알고리즘이 아닐까요?

또한 입력도 없고 출력도 없는 함수라면 내부적인 처리만 할것이고, 그 처리가 외부에 영향을 주지 않는 한 알고리즘에서 배제하는 것이 맞을 것 같습니다(불필요한 연산이니까요)
그리고 위의 상수와 같은 연산을 한 함수는 그 자체의 존재로는 알고리즘이 아니겠지만, 고도의 알고리즘 연산의 중간에는 들어갈 수 있겠죠.
예를들면 인공위성 궤도 수정 프로그램에서 pi값을 셋팅한 함수와 같은 존재로 말이죠.

착한아이의 이미지

메모리 한계라는 값이 (비록 전역값이었다할지라도) 식의 인자로 기여한것으로 봐야하지 않을까요..

이렇게 생각해보죠..

어떤 함수내 복잡한 수식이 수천라인이 있는데
모조리 (시스템 비의존적인) 상수로 구성된 함수라면 어떨까요..

제가 논지를 올릴 때는 논지에 관련된 의견을 듣고자 함이지, 논지의 여부를 논쟁하기 위함이 아니예요.
논지의 취지를 이해하지 못한 의견에는 가급적 답글 달지 않겠어요. :P

d3m3vilurr의 이미지

1.메모리 한계치 라는것은 smalltalk와 같은 언어에서 int의 한계와 같은 개념입니다. 인자로 기여했다고도 볼수있지만, 함수내에서는 인자로 작성되지 않은것으로도 볼수 있습니다.
다르게 말하면
char* e() {}
와 같은 함수는 포인터만을 반환하기 때문에
malloc(sizeof(char) * n)) 이 null을 반환하지 않을때까지입니다.

내부적으로 할당된 이 인자가 외부에 영향을 준다고까지는 보기 힘든데요.

2. 그 상수가 충분히 수학적 연산의 결과라면 알고리즘으로 볼 수 있을겁니다.
1부터 100까지 더하는 방법에 여러가지가 있지만
고전적으로
1+2+3+....+99+100 이라는 방법도 있겠죠.
문제는 이수준이라면 알고리즘이라기 보다는 기초 방식일테고
중간으로
int i, sum;
for (i = 1, sum = 0; i <= 100; i++) sum += i;
를 거쳐
(1+100)*100/2 로 바꾸는 것이 맞을겁니다.
이정도가 된다면 알고리즘이 되겠죠.
100까지 라는 인자가 입력이라고 보시나요?
일단 저 연산에서 값들은 전부 상수에 가깝습니다.

충분히 자라게 된다면 물론 함수가 입력을 가지게 되고 상수가 변수로 변하겠지만요.

snowall의 이미지

만약 이 함수가 원주율의 "정확한" 값을 계산해서 출력해주는 함수라면 출력도 없을 겁니다.
그러나 내부적으로는 원주율의 정확한 값을 계산하고 있으므로 알고리즘이라고 할 수 있지 않을까요?

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

quake의 이미지

자료구조하고 알고리즘하고 차이가 뭔가요?