알고리즘은 정확히 무엇입니까?


12

나는 이것이 상자 밖으로 조금 들릴 수 있다는 것을 알고 있습니다. 사실 나는 항상 상자 안에서 생각하는 데 사용되었지만 최근에는 컴퓨터 과학이 아닌 다른 프로그램을 고안하는 방법에 대해 컴퓨터 과학이 높은 자유를 제공하기 때문에 생각하고 있습니다. 대학에서 가르친 것들.

계승 함수를 고려하십시오. 일반적으로 우리는이 기능을 다음과 같이 정의합니다

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

나는 이것을 알고리즘이라고 부르고 이것이 올바른 방법이라는 것을 의심의 여지가 없다. 그런 다음 "상시 시간에이 작업을 수행 할 수 있습니까?"라는 궁금한 점을 생각해 보았습니다. 다음과 같은 생각을 할 수 있습니다. array [n]에 n의 계승이있는 정수 배열이있는 경우 어떻게해야합니까? 이 배열이 채워지면 간단히 사실을 다음과 같이 정의 할 수 있습니다.

 int fact(int n) 
 { 
 return array[n]; 
 } 

여전히 올바른 결과를 제공하고 일정한 시간 O (1)에서 작동하더라도 알고리즘을 계산할 수 없습니다. 이것을 알고리즘이라고 부를 수 있습니까? 그렇지 않으면 왜 안됩니까? 우리가 배열을 채우려면 두뇌에 있더라도 배열을 채우는 데 알고리즘이 어느 정도 작동해야한다고 주장 할 수 있지만 이것이 기준이 될 수 있습니까? 이러한 측면은 공식적으로 어떻게 처리됩니까?

이 개념은 인수 수에 관계없이 정수를 통해 작동하는 모든 함수로 확장 될 수 있습니다. 함수에 2 개의 인수가 있으면 행렬을 사용해야하고 함수에 3 개의 인수가 있으면 3을 사용해야합니다. 또한 이러한 솔루션은 단순히 메모리 소비로 인해 사용되지 않습니까?

또한 프로그램이 제공 할 수있는 모든 단일 출력을 색인화하는 방법을 찾을 수 있기 때문에 함수에는 출력이있는 모든 프로그램을 포함 할 수 없습니다.

또 다른 예로, 배열의 일반적인 사용을 고려하십시오. 나는 처음에 크기 N의 배열을 할당 한 다음 인덱스 n에 값을 저장하고 n을 한 단위 씩 증가시켜 배열에 요소를 추가합니다. 그런 다음 elemento를 찾으려면 배열을 통해 선형 검색을 수행하는 데 도움이 될 수 없습니다. 대신 0으로 초기화 된 정수를 저장하기 위해 Integer.MAXVALUE와 같은 크기의 배열을 만든 경우 색인에 1을 배치하여 정수를 저장할 수 있습니다. 그런 다음 O (1) 시간에 배열에 존재하는지 검색 할 수 있습니다. 같은 숫자의 여러 장치를 배치하려면 어떻게해야합니까? 문제 없습니다. 정수 색인에 저장된 값을 늘리면됩니다.

정렬은 좀 더 복잡하지만 그럼에도 불구하고 O (1) 시간에 조회 및 추가를 수행 할 수 있습니다.


두 번째 함수는 배열을 매개 변수로 가져야합니다. 그렇지 않으면 암시 적 상태의 명령 적 함정에서 길을 잃어 프로그래밍에 유용하지만 코드를 추론하기가 매우 어려울 수 있습니다.
jmite

예, 두 번째 코드는 입력이 숫자 n 인 알고리즘과 모든 계승을 갖는 배열이라고 할 수 있습니다. 첫 번째 코드에서 알고리즘은 하나의 입력, 즉 숫자 n 만 갖습니다.
Ankur

의무 사항 : 나는 오늘 그 속기 설명 [ "알고리즘"]에 포함되는 것으로 이해하는 자료의 종류를 더 이상 정의하려고 시도하지 않을 것이며, 아마도 나는 그렇게하지도 못할 것입니다. 그러나 나는 그것을 볼 때 그것을 알고 있으며 아래 게시물에 설명 된 것은 그렇지 않습니다.
Patrick87

이 질문과 관련하여 (직접 대답하지는 않음) "알고리즘이란 무엇입니까?"를 읽는 것도 흥미 롭습니다. 작성자 : Yuri Gurevich, Microsoft Research, 기술 보고서 ​​MSR-TR-2011-116 research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka

"... array [n]에 n의 계승을 저장하는 정수 배열이 있다면 어떻게 될까요?이 배열이 채워지면 ...". 모든 정수의 계승으로 배열을 어떻게 채울 것입니까? 이 배열은 크기가 무한하며 채워지는 데 시간이 오래 걸립니다. 따라서 귀하의 질문은 잘못 제기됩니다.
AP

답변:


9

인기있는 교재에서 알고리즘의 비공식적 인 정의는 다음과 같습니다.

알고리즘은 (1) 잘 정의 된 계산 절차 (2) 일부 입력을 받고 (3) 잘 정의 된 계산 문제에 대한 일부 출력 (4)을 생성합니다.

첫 번째 경우 알고리즘을 코딩했습니다. 문제는 int n을 입력 (정의 2 부)으로 지정하여 계승 (정의 4 부)을 찾는 것입니다. 코드는 수행 할 계산을 설명합니다 (정의 1 부). )에서 출력은 계승입니다 (정의의 3 부).

두 번째 경우 : 문제는 n을 입력 (정의의 3 부)으로 지정하여 위치 n (정의의 4 부)에서 배열 요소를 찾는 것입니다. 코드는 수행 할 계산 (정의 2 부)을 설명합니다. 출력은 위치 n (정의의 1 부)에있는 요소입니다.

계승을 저장하여 계승을 제공합니다. 정사각형 또는 큐브를 저장 한 경우 정사각형 또는 큐브를 얻을 수 있으므로 두 번째 스 니펫 자체가 계승을 계산하는 알고리즘이라고 말할 수는 없습니다.

그리고 배열 n을 위치 n에 f (n)이있는 배열과 함께 조회하면 f (n)을 계산하는 알고리즘이라고 말하면 아래 계산이 더 이상 이루어지지 않을 것입니다. 잘 정의 된 계산 절차는 유한 정보 여야합니다. 계승의 무한 배열이 계산 절차의 일부인 경우에는 유지되지 않습니다. 따라서 계승을 계산하는 알고리즘은 아닙니다.


OP의 제안에 대한 실제 문제는 "잘 정의 된 계산 절차"에 대한 설명이 유한하지 않다는 것입니다. 물론 "잘 정의 된 계산 절차"가 의미하는 바를 설명하지 않으면 OP의 알고리즘이 적법한 지 여부를 미리 알 수 없습니다. 실제로 무한 배열이 주어진 "잘 정의 된 계산 절차"입니다. 왜 이것이 불법입니까? OP는 어레이를 채우는 방법을 유한 용어로 설명 할 수도 있습니다. 그러면 무엇이 잘못됩니까? 비공식적 정의는 하이퍼 컴퓨팅과 (튜링) 계산을 구별 할 수 없습니다.
Yuval Filmus

잘 정의 된 계산 절차는 유한 정보로 표현할 수 있어야합니다. 계승의 무한 배열이 그 일부인 경우에는 유지되지 않습니다.
Ranbir

2
{(n,n!):nN}

배열에 대한 설명은 유한 정보로 표현할 수 있지만 배열 자체는 그렇지 않습니다.
Ranbir

나는 OP의 두 예제가 모두 algorithms 이며 모든 정수에 대한 계승을 계산 하지 않는다고 주장합니다 . 그러나 그것은 까다 롭습니다.
Patrick87

5

가장 광범위하게 알고리즘은 문제를 해결하기위한 일련의 단계입니다 .

CS에서 다음은 알고리즘이라는 용어를 사용할 때 일반적으로 이해 / 가정됩니다.

  • 이 알고리즘에는 유한 설명과 문제가있는 경우 단계를 수행하기위한 잘 정의 된 절차가 있습니다. (자세한 내용은 아래 참조)
  • 유한 문자열 (입력 심볼의 순서)로 주어진 문제 인스턴스와 알고리즘의 출력은 유한 문자열로 인코딩 될 수 있습니다.
  • 문제는 각 인스턴스에 대해 가능한 "올바른"출력과 함께 문제 인스턴스의 모음입니다. "해결"은 올바른 출력을 생성하는 것을 의미합니다.
  • (보통) 문제 인스턴스는 임의로 클 수 있습니다 (유한 한 알고리즘이 해결해야하는 가능한 수의 인스턴스가 있습니다).

CS가 설립되기 전에, 수학자들은 당신이 제기 한 것과 같은 유형의 관심사를 가지고 있었고 이러한 관심사를 해결하기 위해 공식적인 계산 정의를 도입했습니다. 따라서 오늘날 "알고리즘은 Turing 머신에서 구현할 수있는 절차" 라고 말함으로써 위의 모든 가정을 공식화 할 수 있습니다 . 이것은 아마도 귀하의 질문에 대한 공식적인 답변 일 것입니다.

Church-Turing 논문은 Turing Machine보다 더 강력한 알고리즘 공식화가 없다고 생각 합니다.

계승 예제는 비 균일 계산이라고하는 다른 계산 모델로 들어갑니다. 튜링 머신은 균일 한 계산 모델의 예입니다. 하나의 유한 설명이 있으며 임의로 큰 크기의 입력에 작동합니다. 다시 말해, 모든 입력 크기에 대한 문제를 해결하는 TM이 있습니다.

이제 우리는 대신 다음과 같이 계산을 고려할 수 있습니다. 각 입력 크기마다 문제를 해결하는 TM (또는 다른 계산 장치)이 있습니다. 이것은 매우 다른 질문입니다. TM에는 유한 설명이 있으므로 단일 TM이 모든 단일 정수의 계승을 저장할 수는 없습니다. 그러나 1000 이하의 모든 숫자의 계승을 저장하는 TM (또는 C의 프로그램)을 만들 수 있습니다. 그런 다음 1000과 10000 사이의 모든 숫자의 계승을 저장하는 프로그램을 만들 수 있습니다.

이러한 불균일 한 유형의 계산은 일반적으로 회로에 의해 이론적 CS에서 모델링됩니다. 가능한 각 입력 크기에 대해 다른 회로 구성을 고려하십시오.

균일하지 않은 계산 모델은 비록 첫 문장에 맞을지라도 알고리즘으로 간주되지 않습니다 . 그 이유는 주요 가정에 맞지 않기 때문입니다. 입력 크기에 대한 "전체"문제를 해결하기 위해 구현할 수있는 유한 설명이 없습니다. 오히려 문제가 커질수록 (더 큰 조회 테이블이 필요한 것처럼) 더 크고 더 큰 설명이 필요합니다. 그러나 여전히 흥미로운 계산 모델입니다.


회로 기반 계산 모델이 부적절하다고 생각합니다. 말했듯이 TM에는 유한 설명이 있습니다. 그러나 그것은 계승의 표로 채워진 보조 테이프를 갖는 것을 배제하지 않습니다. 심지어 "나쁘게"할 수 있고 여전히 유한 한 설명을 할 수 있습니다. 그러나 실제로 필요한 것은 계산 가능한 설명이며, 궁극적으로 유한합니다. 표로 된 계승으로 튜링 기계를 정의하는 계산적으로 균일 한 방법이 많이 있지만 TM의 계산 능력을 실제로 향상시킬 수는 없습니다. 따라서 당신의 결론은 유지되지 않습니다.
babou

@babou, 나는 당신이 무슨 뜻인지 이해하지 못합니다. "부적절한"이란 무엇을 의미하며, 어떤 결론을 내린 것이 거짓입니까? 참고 : 회로 모델을 발명하지 않았습니다. 아마도 나는 그것을 잘 설명하지 못했습니다. 요점은 각 입력에 대해 다른 계산 장치 (TM 또는 회로)를 허용한다는 것입니다. 즉, 모든 장치 (모든 입력 크기에 대해)를 생성하는 균일 한 알고리즘이 없을 수도 있습니다. 즉, 그것들을 모두 설명하는 유한 한 설명이 아니어야합니다.
usul

계승 함수의 표를 비 균일 계산으로 보는 것이 적절한 방법으로 보이지 않습니다. 유한 세그먼트가 전체 테이블 인 무한대의 제한으로 연속적으로 보일 수있는 정도로 실제로는 매우 균일합니다. 이것이 Scott의 의미론으로 수행되는 것입니다. 또한 전체 테이블을 실제로 계산 가능한 방식으로 유한하게 설명 할 수 있으므로 미리 계산 된 테이블이 포함 된 여분의 테이프가있는 TM을 고려하는 것이 계산 상 의미가 있습니다. 귀하의 대답은 사전 계산 테이블이 알고리즘으로 간주 될 수 없다는 결론을 내리는 것 같습니다.
babou

사전 계산 된 특정 테이블은 알고리즘의 일부일 수 있으며, 크기가 점점 커지는 사전 계산 된 테이블 시퀀스의 경우 알고리즘을 사용하여 이러한 항목 중 하나를 생성 할 수 있습니다. 그러나 점점 더 크기가 커지는 무한대의 룩업 테이블 세트 자체는 크기가 크기 때문에 알고리즘이나 균일 한 계산이라고 생각하지 않습니다.
usul

당신은 그것을 알고리즘으로 간주하지 않을 것입니다. 이것은 주관적입니다. 중요한 것은 왜 안되는지 아는 것입니다. 내가 볼 이유가 없습니다. 이 경우 알고리즘에 적합한 모든 개념이 계속 의미가 있습니다. 테이블 생성을 추상화하는 것만으로도 별도로 설명 할 수 있습니다. 실제로 이것은 순차적으로 의미론적인 문제입니다. 시퀀스를 증가시키는 것을 고려하거나 무한한 한계로 대체하면 수학적으로 같은 양이됩니다. 그리고 의미 론적 계산 이론은 그러한 무한한 한계를 고려하지만 생산되거나 표현됩니다.
babou

4

알고리즘은 C로 작성된 프로그램으로 모든 길이의 입력에 대해 작동해야합니다 (무한 메모리 및 무한 정수 가정). 귀하의 예에서 프로그램이 모든 길이의 입력에 대해 작동하기를 원한다면 결과가 저장된 테이블은 무한대로 커집니다. C의 프로그램은 항상 유한하므로이 방법을 사용할 수 없습니다.

n!n!)는 C에 비해 훨씬 효율적으로 계산할 수 있습니다.

실제 컴퓨터의 실제 실행 시간에 대해 걱정할 때는 더욱주의해야하지만 불행히도 이론적 인 컴퓨터 과학의 한계를 뛰어 넘는 경우가 많습니다.


nn!

어떤 알고리즘 개념을 사용해야합니까? 위에서 설명한 한 가지 제안은 C 프로그램을 사용하는 것입니다. 이 개념을 C 계산이라고 부를 수 있습니다. 튜링 계산은 튜링 기계를 사용할 때 얻는 것입니다. 튜링 계산 가능한 경우에만 함수가 C 계산 가능한 것으로 나타났습니다. 이러한 의미에서이 두 계산 모델은 모두 동일합니다. 실제로, 많은 다른 모델들, 예를 들어 공통의 모든 프로그래밍 언어들 (무한 메모리 및 제한없는 변수를 가정)과 동등하다.

프로그래밍 언어 P가 Turing-complete 라고하는 함수는 Turing-computable 인 경우에만 함수를 P-computable이라고합니다. 교회 – 튜링 가설은 유한 한 설명과 유한 시간을 갖는 모든 합리적인 계산 모델 이 튜링-완전 이라는 효과에 대한 비공식적 인 진술 입니다. 모델에 유한 설명이 있지만 제한 시간이 없습니다.


3
lol "알고리즘은 C로 작성된 프로그램입니다 ..."?!?
vzn

2
"알고리즘은 C로 작성된 프로그램입니다"... 왜 언어를 지정합니까? 말이되지 않습니다.
nouney

1
@nouney 나는 구체적으로 노력하고 있습니다. 가장 좋아하는 프로그래밍 언어도 Turing-complete입니다.
Yuval Filmus

@YuvalFilmus 글쎄, 당신은 구체적이지 않고 혼란 스럽습니다.
nouney

@nouney 귀하는 자신의 답변을 추가 할 수 있습니다.
Yuval Filmus

4

누락 된 알고리즘의 일반적인 정의에서 중요한 부분은 사양이 유한 해야하며 사양의 크기가 입력 크기에 따라 달라지지 않아야한다는 것입니다.

메모리는 임의로 클 수 있고 입력도 가능하지만 알고리즘의 유용한 정의가 되려면 코드 공간이 유한해야합니다. 그렇지 않으면 방금 식별 한 문제가 발생합니다.

O(logA)AO(logn)O(logn!)O(n(logn)2)sn=O(2s)O(2s s2)O(1)


" 코드 공간은 유한해야합니다 ": eval방금 생성 한 일부 큰 데이터 구조 에서 함수 를 호출하고 lLisp 표현식을 나타내는 Lisp 프로그램 은 알고리즘으로 간주 될 수 없습니다. 20 세기 MIT에서 생성 된 많은 코드가 알고리즘으로 적합하지 않다고 생각합니다. 이것은 비공식적 인 주장이지만 공식적인 문제는 유한 한 사양이 무엇인지에 대한 관점에 있습니다.
babou

표현식이 생성되면 유한합니다. 아무리 커도 그러나 코드 공간의 유한도에 대한 제한을 제거하면 유용 할 수 있습니다 (예 : 목록 정렬시 런타임에 하한 증명). 그러나 알고리즘 자체에 대한 거의 모든 흥미로운 결과에는 유한 코드 공간이 필요합니다. 다항식이 유한 수의 계수를 가져야하는 방법과 비슷하지만, 거듭 제곱도 유용합니다.
DanielV

나는 내 필드가 아닌 복잡성을 계산하는 방법에 대한 전문가는 아니지만 수학을 가지고 있거나 가지고 있지 않다는 사실은 알고리즘에 영향을 미치지 않아야합니다. 요점은 Lisp 프로그램이 아무런 제한없이 코드 크기를 계속 증가시킬 수 있다는 것입니다. 그런 다음이를 특정 계산 속성을 가진 무한한 코드 조각으로 분석하는 것이 더 합리적 일 수 있습니다. 도표화 된 기능의 경우는 그 빛에서 볼 수 있습니다. 나는 대답이 알고리즘이 무엇인지 에 대한 제한된 ( 관념 을 말하려고했다 ) 것에 놀랐다 .
babou

3

도움이 될만한 몇 가지 관찰 :

문제 는 허용 가능한 입력과 해당 출력에 대한 설명입니다. 그들은 우리가 해결하고자하는 것입니다. 알고리즘 은 계산 절차입니다. 알고리즘은 문제 와 관련하여 허용되는 입력을 받아들이고 문제 설명에 따라 출력을 생성하는 경우 문제와 관련하여 올바른 알고리즘이라고 말할 수 있습니다 .

두 예제는 모두 분명히 계산 절차이므로 알고리즘입니다. 알고리즘이 올바른지 여부는 문제를 정의하는 방법과 알고리즘 표현을 해석하는 방법에 따라 다릅니다. 몇 가지 문제 설명 :

  1. nn!
  2. n>0n!< INT_MAXn!

첫 번째 코드 스 니펫에 대한 일부 해석 :

  1. 이것은 세부 사항을 제외하고 C / C ++와 유사한 의사 코드입니다. int예를 들어 "모든 정수"를 의미합니다.
  2. 이것은 실제 C / C ++ 프로그램 인 것처럼 해석됩니다.

계승이 음수 값 1을 가정하는 한 해석 1은 문제 설명 1에 대해 정확합니다 (그렇지 않으면 도메인을 제한하도록 문제 설명을 수정하거나 원하는 동작을 설명하도록 알고리즘을 수정할 수 있음). 해석 2는 문제 설명 2에 대해 동일하며 동일한 경고가 있습니다.

arrayarraynn>0n!< INT_MAXn!n<0

nn!232n!264

kknknk+n


알고리즘의 개념은 컴퓨터의 단어 크기 제한을 넘어서는 것이라고 생각합니다. 나는 당신이 문제를 피하고 있다고 생각합니다.
babou 2009 년

1

알고리즘 에 작성하는 프로그램입니다 튜링 완전한 언어 모든 유효 입력에라도 유용가 중단됩니다. 모든 표준 프로그래밍 언어는 Turing-complete입니다. 이 단어는 페르시아 수학자, 천문학 자 및 지리학자 인 al-Khwārizmī라는 유럽 번역본에서 유래 한 것으로, 7 세기 인도 수학자 브라 마구 프타 (Brahmagupta)는 서구 세계에 인도의 숫자 체계를 도입했습니다.

문제는 기본적으로 조회 테이블이 알고리즘의 일부인지에 관한 것 같습니다. 물론! 에서는 튜링 기계 (TM) 테이블은 TM 상태 테이블에서 인코딩 될 수있다. TM은 전이 테이블에 저장된 유한 한 양의 데이터를 기반으로 테이프를 초기화 할 수 있습니다 . 그러나 무한 입력에서 실행되지 않고 유한 입력에서만 실행되는 "알고리즘"은 "사소한" 유한 상태 기계 (FSM) 입니다.


3
왜 완전한 언어로되어 있어야합니까?
babou

1

간단히 말해서 : 알고리즘은 주어진 문제에 해결책이 있다는 건설적 증거의 구성 적 부분입니다. 이 정의의 동기는 프로그램이 문제를 해결하지만 관심이있을 경우에만 관심이 있다는 점을 고려하여 프로그램과 증명 간의 Curry-Howard 동 형사상입니다. 이 정의는 더 추상화를 허용하고, 예를 들어 유한 특성과 관련하여, 관련 될 수있는 도메인의 종류에 관한 일부 문을 열어 둔다.

경고 . 질문에 대답하기위한 적절한 공식적인 접근법을 찾으려고 노력하고 있습니다. 나는 그것이 필요하다고 생각하지만, 지금까지 응답 한 사용자 (자신을 포함하고 일부는 다른 게시물에서 그것에 대해 다소 명시 적이 지 않은) 사용자 중 누구도 문제를 올바르게 개발할 수있는 올바른 배경을 가지고 있지 않은 것 같습니다. 건설적인 수학, 증명 이론, 유형 이론 및 증명과 프로그램 간의 Curry-Howard 동형 과 같은 결과 . 나는 내가 믿거 나 믿었던 모든 스 니펫으로 최선을 다하고 있으며이 답변의 한계를 너무 잘 알고 있습니다. 나는 대답이 어떻게 보일지에 대한 힌트를 줄 수 있기를 바랍니다. 공식적으로 (아마도) 틀린 점이 있으면 지금 의견이나 이메일로 알려주세요.

몇 가지 문제 식별

알고리즘을 고려하는 표준 방법은 알고리즘이 메모리에 제한이없는 것을 포함하여 일부 컴퓨팅 장치에 대해 임의의 유한하게 지정된 프로그램 이라고 진술하는 입니다. 언어는 컴퓨터 기계 언어 일 수도 있습니다. 실제로 Turing 컴플리트 컴퓨팅 장치에 대한 모든 프로그램을 고려하면 충분합니다 (메모리 제한이 없음을 의미 함). 알고리즘이 해석 컨텍스트에 대한 세부 사항에 의존하는 형태로 이론적으로 표현되어야한다는 의미에서 모든 알고리즘 프리젠 테이션을 제공하지는 않을 수 있습니다. 모든 것이 일부 인코딩까지 정의되어 있기 때문입니다. 그러나 계산해야 할 모든 것을 계산하므로 인코딩에 이르기까지 모든 알고리즘이 포함됩니다.

π

π 거의 모든 알고리즘이 흥미롭지 않다고아마도 거의 모든 수학적인 의미에서. 그러나 그것은 더 정밀한 정의를 요구할 것입니다.

따라서 실제 질문은 의미있는 알고리즘이 무엇인지 아는 것입니다. 답은 의미있는 알고리즘이 문제를 해결하는 알고리즘이며, 그 문제에 대한 "솔루션", "답변"을 단계적으로 계산합니다. 알고리즘이 해결하는 문제와 관련되어 있으면 흥미 롭습니다.

공식적인 문제가 주어지면 문제를 해결하는 알고리즘을 얻는 방법은 무엇입니까? 명시 적이든 암시 적이든, 알고리즘은 문제에 대한 해결책이 존재한다는 아이디어와 관련이 있으며, 이는 올바른 것으로 입증 될 수 있습니다. 우리의 증명 기술이 정확한지 여부는 또 다른 문제이지만, 우리는 적어도 자신을 설득하려고 노력합니다. 실제로 우리가해야 할 일인 (그리고 대부분의 수학에 대해 매우 수용 가능한 공리 학적 제약 인) 건설적인 수학으로 자신을 제한한다면, 솔루션의 존재를 증명하는 방법은 실제로 구조물을 나타내는 증명 단계를 거치는 것입니다 솔루션을 나타내는 다른 단계를 포함하여 솔루션을 나타냅니다.

모든 프로그래머는 다음과 같이 생각합니다 : 만약 내가 그런 식으로 데이터를 피들 링하면 Sesame의 정리 때문에 올바른 속성을 가진이 위젯을 얻습니다.이 foo-preserving 변환을 실행하면 원하는 대답을 얻습니다 . 그러나 그 증거는 일반적으로 비공식적이며, 위성이 왜 화성에서 지하를 선회하려고했는지 설명하는 모든 세부 사항을 다루지는 않습니다. 우리는 많은 추론을 수행하지만 실제로 솔루션을 구축하는 구성적인 부분 만 유지하고 문제를 해결하는 알고리즘으로 컴퓨터 언어로 설명합니다.

흥미로운 알고리즘 (또는 프로그램)

이 모든 것은 다음과 같은 아이디어를 소개하는 것이 었습니다.이 아이디어는 현재의 많은 연구의 대상입니다 (나는 전문가가 아닙니다). 여기에 사용 된 " 흥미로운 알고리즘 " 이라는 개념은 보다 정확한 정의를 위해 비공식적 인 자리 표시 자로 소개 된 것입니다.

흥미로운 알고리즘은 주어진 문제에 해결책이 있다는 건설적인 증거의 구성적인 부분입니다 . 즉, 증거는 단순히 예를 들어 모순에 의해 단순히 존재를 증명하기보다는 솔루션을 보여 주어야 함을 의미합니다. 자세한 내용은 참조 직관 논리구성주의 수학은.

이것은 물론 매우 제한적인 정의로, 내가 재미있는 알고리즘이라고 부르는 것만 고려합니다. 따라서 거의 모든 것을 무시합니다. 그러나 알고리즘에 관한 모든 교과서도 마찬가지입니다. 그들은 흥미로운 것들 중 일부만 가르치려고 노력합니다.

문제의 모든 매개 변수 (입력 데이터)가 주어지면 지정된 결과를 단계별로 얻는 방법을 알려줍니다. 전형적인 예는 방정식의 해상도입니다 (이름 알고리즘 은 실제로 일부 방정식의 해상도를 연구 한 페르시아 수학자 Muḥammad ibn Mūsā al-Khwārizmī 의 이름에서 파생 됨 ). 증명의 일부는 알고리즘에서 계산 된 일부 값에 일부 속성이 있지만 이러한 부분을 알고리즘 자체에 유지할 필요는 없음을 확인하는 데 사용됩니다.

물론, 이것은 계산 된 데이터, 허용되는 기본 계산 단계 및 사용되는 공리를 설정하는 공식화 된 논리 프레임 워크 내에서 이루어져야합니다.

팩토리얼 예제로 돌아가서 사소한 알고리즘이지만 알고리즘으로 해석 될 수 있습니다. 정규 계승 함수는 일부 산술 프레임 워크와 정수 n이 주어지면 첫 번째 n 정수의 곱인 숫자가 있다는 증거에 해당합니다. 이것은 계승 계산과 마찬가지로 매우 간단합니다. 다른 기능에는 더 복잡 할 수 있습니다.

이제 모든 정수에 대해 사실이 아니지만 (일부 유한 값의 경우에 해당 할 수 있음) 가정 할 수 있다고 가정하고 계승을 표로하기로 결정했다면, 당신이하는 모든 것은 공리에 새로운 정수는 각 정수에 대한 값을 나타내므로 더 이상 아무것도 계산할 필요가 없습니다.

그러나 공리 체계는 유한해야한다. 그리고 계승에 대한 정수 값은 무한대입니다. 따라서 무한 기능을 axiomatize하면 (즉, 무한 도메인에 정의 된) 유한 공리 시스템에 문제가 있습니다. 이는 모든 정수에 대해 테이블 ​​조회를 구현할 수 없다는 사실에서 계산적으로 변환됩니다. 그것은 알고리즘에 대한 일반적인 유한 요구 사항을 죽일 것입니다 (그러나 종종 제시되는 것만 큼 엄격해야합니까?).

모든 경우를 처리하기 위해 유한하게 정의 된 공리 생성기를 갖도록 결정할 수 있습니다. 이것은 필요에 따라 배열을 초기화하기 위해 알고리즘에 표준 계승 프로그램을 포함시키는 정도에 달합니다. 이것을 프로그래머의 메모 라고 합니다. 이것은 실제로 미리 계산 된 테이블과 가장 가까운 값입니다. 테이블이 필요할 때마다 지연 평가 모드로 실제로 생성된다는 사실을 제외하고는 미리 계산 된 테이블을 가지고 있음을 이해할 수 있습니다 . 이 논의는 아마도 좀 더 공식적인 관리가 필요할 것입니다.

복잡성 또는 성능 분석을 수행하기 위해 원하는대로 기본 작업을 정의하고 (공식 시스템과의 일관성 내에서) 알고리즘에 사용될 때 원하는 비용을 할당 할 수 있습니다. 그러나 실제로 알고리즘 (예 : 컴퓨터 또는 두뇌)을 구현하는 구체적인 시스템이 이러한 비용 사양을 고려할 수없는 경우 분석은 지적으로 흥미로울 수 있지만 실제 세계에서는 실제로 사용할 수는 없습니다.

21000

흥미로운 프로그램

이 논의는 프로그램과 증명 사이 의 Curry-Howard 동 형사상 과 같은 결과와보다 적절하게 연결되어야합니다 . 어떤 프로그램이 실제로 무언가의 증거라면, 모든 프로그램은 위 정의의 의미에서 흥미로운 프로그램으로 해석 될 수 있습니다.

그러나 나의 (제한된) 이해로,이 동형은 적절한 타이핑 시스템에서 잘 타이핑 할 수있는 프로그램으로 제한되는데, 여기서 타입은 공리 이론의 제안에 해당합니다. 따라서 모든 프로그램이 흥미로운 프로그램으로 인정 될 수있는 것은 아닙니다. 내 생각에 알고리즘이 문제를 해결해야한다고 생각합니다.

이것은 대부분의 "무작위로 생성 된"프로그램을 제외 할 것입니다.

또한 "흥미로운 알고리즘"이 무엇인지에 대한 다소 개방적인 정의입니다. 흥미로운 것으로 식별 할 수있는 식별 된 유형 시스템이 있기 때문에 흥미로운 것으로 볼 수있는 모든 프로그램은 확실히 그렇게됩니다. 그러나 지금까지 입력 할 수 없었던 프로그램은보다 발전된 유형의 시스템으로 입력 할 수있게되어 흥미로워 질 수있었습니다. 더 정확하게는 항상 흥미로 웠지만 올바른 유형 시스템에 대한 지식이 부족하여 알 수 없었습니다.

그러나,이 같은 실행과 같은 일부 람다 식 것으로 알려져 있기 때문에 모든 프로그램, typeable있는 것으로 알려져있다 Y의 콤비가 , 사운드 타입 시스템에 입력 할 수 없습니다 .

이 견해는 일부 공리 증거 시스템과 직접 연관 될 수있는 프로그래밍 형식에만 적용됩니다. Turing Machine과 같은 저수준 계산 형식으로 어떻게 확장 될 수 있는지 모르겠습니다. 그러나 알고리즘과 계산은 종종 문제와 솔루션을 인코딩하는 게임이기 때문에 ( 람다 계산법으로 인코딩 된 산술 생각 ) 알고리즘의 인코딩으로 표시 될 수있는 공식적으로 정의 된 계산도 알고리즘이라고 생각할 수 있습니다. 이러한 인코딩은 아마도 Turing Machines과 같은 저수준 형식으로 표현 될 수있는 것의 아주 작은 부분만을 사용합니다.

이 접근법의 한 가지 관심사는 실제 인코딩 문제, 계산 영역의 "물리적 표현성"에 대해보다 추상적이고 독립적 인 알고리즘 개념을 제공한다는 것입니다. 예를 들어 계산적으로 올바른 방법을 사용하는 한 무한한 객체가있는 도메인을 고려할 수 있습니다.


2
이것은 근본적인 문제이지만 문제에 대한 쉬운 견해는 아닙니다. 나는 엄청나게 단순화해야했고 실수했을 수도 있습니다. 그러나 공감해야한다면 이유를 말해주십시오.
babou

예, 다운 보트가 무엇인지 잘 모르겠습니다.
가명

@ 가명 내 경우에. 알 것 같아요 그것은 의미 론자와 알고리즘 학자, 특히 계산에 종사하는 사람들 사이의 오래된 싸움이라고 생각합니다. 그것은 철학과 비즈니스, 그것이 무엇인지, 비용이 싸우는 것입니다. "의미있는"알고리즘에 관심이 있습니다. 나는 그에 따라 수정했다 (그러나 나는 내 지식의 가장자리에 있지만 여전히 대부분의 것보다 낫다). 같은 빈민가로 고통받을 수 있습니다. ---그러나. 이 미묘한 주제에 대해, 반 퍼센트의 가치가있는 사람이라면 누구나 적절한 설명없이 하향 투표를 꿈꾸지 않을 것임이 분명합니다.
babou

질문과 답변을 모두 읽은 후 실제 질문에 충분히 초점을 맞추지 못하고 너무 많은 미완성 된 생각이 포함되어 있기 때문에 그 질문을 줄이려고합니다. 또한, "문제 해결"이 알고리즘 정의에서 빠진 부분이라고 생각하지 않습니다. 그러나 알고리즘을 구성하는 요소의 정의에서 "의미론"을 무시해서는 안된다는 데 동의합니다.
Thomas Klimpel '

@ThomasKlimpel 내가 말했듯이, 나는 실제 문제에 대해 충분히 전문가가 아닙니다. 그리고 다른 대답은 없다고 덧붙였습니다. 알고리즘을 만드는 것은 알고리즘을 이해하는 것과 다릅니다. 숨기는 것이 비과학적인 제한된 지식에 대한 나의 인식은이 미완성 된 생각의 근원입니다. 문제의 존재를 강조하고 오히려 무시하는 것이 좋습니다. 나는 질문이 의미 론적 질문이기 때문에 알고리즘 적 질문보다 의미 론적 관점에서 더 많은 각 예를 다루었 다 ( "무엇인가 ...?"). 다른 답변이 공식적인 이해를 가져 온다고 생각하십니까? Cf 내 의견
babou

0

글을 쓰는 시점에서 "알고리즘"에 대한 공식적인 정의는 없습니다. 그러나 똑똑한 사람들이 노력하고 있습니다.

우리가 알고있는 것은 "알고리즘"이 무엇이든 "수학적 기능"과 "컴퓨터 프로그램"사이에 있다는 것입니다.

수학 함수는 입력에서 출력으로의 매핑에 대한 공식적인 개념입니다. 예를 들어, "정렬"은 일련의 주문 가능한 항목과 동일한 유형의 주문 가능한 항목 시퀀스 사이의 매핑으로, 각 시퀀스를 순서가 지정된 시퀀스에 매핑합니다. 이 기능은 다른 알고리즘 (예 : 병합 정렬, 힙 정렬)을 사용하여 구현할 수 있습니다. 각 알고리즘은 동일한 프로그램 언어를 사용하더라도 다른 프로그램을 사용하여 구현할 수 있습니다.

따라서 "알고리즘"이 무엇인지에 대한 가장 좋은 방법은 프로그램에서 일종의 동등성 클래스라는 것입니다. 두 프로그램은 "본질적으로 같은 것"이라면 동등합니다. 동일한 알고리즘을 구현하는 두 프로그램은 동일한 기능을 계산해야하지만 그 반대는 아닙니다.

마찬가지로 알고리즘간에 동등한 클래스가 있으며 두 알고리즘이 동일한 수학 함수를 계산하는 경우 두 알고리즘이 동일합니다.

이 모든 것의 어려운 부분은 "본질적으로 같은 것"의 의미를 포착하려고합니다.

우리가 포함시켜야 할 몇 가지 분명한 것이 있습니다. 예를 들어, 변수 이름 변경만으로 두 프로그램이 다를 경우 두 프로그램은 본질적으로 동일합니다. 대부분의 프로그래밍 언어 모델에는 "동등성"이라는 기본 개념이 있습니다 (예 : 람다 미적분에서의 베타 축소 및 에타 변환).

우리가 선택한 동등성 관계가 무엇이든, 이것은 우리에게 어떤 구조를 제공합니다. 알고리즘은 몫이 프로그램 범주라는 사실 때문에 범주를 형성합니다. 흥미로운 등가 관계는 흥미로운 범주 구조를 일으키는 것으로 알려져 있습니다. 예를 들어, 기본 재귀 알고리즘의 범주는 범주 범주의 범용 개체입니다. 그런 흥미로운 구조를 볼 때마다이 질문 줄이 유용 할 것입니다.


1
알고리즘에 대한 공식적인 정의가 없다고 말하는 것이 공정하다고 생각하지 않습니다. 대략 100 년 전의 경우였습니다.
Juho

1
@Juho 가명은 그것이 상황을 진전시키고 있다고 덧붙이면서 진술을 완화 시키려고 노력하지만, 너무 강하게 들릴지도 모른다. 그러나 나는 그가 그의 평가에서 오히려 옳다고 생각합니다. 나는 이것에 많은 시간을 소비하고 거의 똑같이 느끼기 때문에 늦게 반응하고 있습니다. 사람들은 그들의 이해를 상당히 향상 시켰지만, 전체 토론은 실제 합의가 없다는 것을 보여주었습니다 ... 나는 관련된 사람들의 수준을 고려할 때 대부분의 기여가 매우 미숙하다는 것을 알았습니다. 그가 불공평하다면, 누가 공식적으로 좋은 정의를했다고 생각합니까?
babou

당신은 100 % 정확합니다. 그리고 만약 튜링이 살아 있거나 복잡한 이론의 다른 이론가라면, 그는 당신과 100 % 동의 할 것이라고 생각합니다. 학자들은 그들의 혈통을 포기해야합니다. 실제로 현장을 방해하고 있습니다. 그들이 죽으면 결국 어떤 식 으로든 일어날 것입니다. 잘 부탁드립니다.
EnjoysMath

-4

귀하의 질문과 설명은 그다지 관련이 없습니다. 알고리즘은 이론적이며 프로그래밍 언어와 관련이 없습니다. 알고리즘은 문제를 해결하기위한 일련의 규칙 또는 단계 (절차)입니다. 여러 가지 방법이나 많은 알고리즘으로 문제를 해결할 수 있습니다.

두 번째 솔루션은 처음에 많은 계승을 계산하여 저장하는 데 많은 시간이 걸린다는 것을 의미합니다. 스토리지는 더 많이 소비하지만 처음에는 스토리지를 소비하지 않지만 컴퓨팅 성능을 소비하는 동안 더 빠를 것이므로 환경에 따라 선택해야합니다.


예, 전혀 관계가 없습니다. 획기적인 것들.
EnjoysMath
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.