고차 알고리즘


35

잘 알려진 알고리즘의 대부분은 입력 및 출력이 "일반"데이터라는 점에서 1 차입니다. 일부는 사소한 방식으로 정렬, 해시 테이블 또는 맵 및 폴드 함수와 같이 2 차입니다. 함수에 의해 매개 변수화되지만 다른 입력 데이터에서 호출하지 않는 한 실제로 흥미로운 것은 없습니다.

일부는 2 차이지만 다소 흥미 롭습니다.

  • monoid로 매개 변수화 된 핑거 트리
  • 단조로운 술어에서 핑거 트리 분할
  • 접두사 합 알고리즘은 일반적으로 monoid 또는 술어 등에 의해 매개 변수화됩니다.

마지막으로, 일부는 나에게 가장 흥미로운 의미에서 "정말로"고차입니다.

  • Y 조합기
  • 차이점 목록

사소하지 않은 다른 고차 알고리즘이 있습니까?

내 질문을 명확하게하기 위해, "사소하지 않은 높은 차수"아래에서 "알고리즘의 인터페이스 및 / 또는 구현에서 중요한 방식으로 계산 형식주의의 고차 시설 사용"을 의미합니다.


3
나는 비슷한 것을 한 번 물었다. 여기에 몇 가지 답변이 있습니다 : caml.inria.fr/pub/ml-archives/caml-list/2004/09/…
Radu GRIGore

알고리즘을 사용하거나 알고리즘을 반환하는 알고리즘에 대해 이야기하고 있습니까?
Pratik Deoghare

답변:


13

http://math.andrej.com/ 에는 예를 들어 double exponentials 에 대한 게시물에서 고차 함수가 많이 있으며 다음과 같은 Haskell 유형이 나타납니다 (동의어 유형이 확장 됨).

shift :: Bool -> ((Int -> Bool) -> Bool) -> ((Int -> Bool) -> Bool)

유한 한 시간에 무한 검색을위한 A Haskell Monad 게시물을 통해 많은 즐거움을 얻을 수도 있습니다. 예를 들면 다음과 같습니다.

newtype S a = S ((a -> Bool) -> a)
bigUnion :: S (S a) -> S a

bigUnion의 유형이 4 차 또는 5 차인 것 같습니다!


22

일반적으로 이러한 용어로 명시 적으로 설명되어 있지는 않지만 "진정한 2 차"알고리즘이 있습니다. 하위 선형 시간 알고리즘이있을 때마다 암시 적 입력에 대한 일종의 오라클 액세스, 즉 실제로 입력을 함수로 처리합니다.

예 :

(1) "분리 오라클"로 작업 할 때 타원체 알고리즘 (예 : http://math.mit.edu/~vempala/18.433/L18.pdf )

(2) 하위 모듈 기능 최소화 (예 : http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )

(3) 재산 테스트의 전체 분야는 실제로이 형식입니다 ( http://www.wisdom.weizmann.ac.il/~oded/test.html )

(4) 질의 모델에서의 조합 경매 (예 : http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )


15

이 질문에 대한 또 다른 대답이 있습니다. 보다 구체적으로, 그러한 (구현 가능한!) 고차 알고리즘은 기능 해제를 사용하여 1 차 알고리즘과 기계적으로 동일합니다 .

좀 더 정확하게 말씀 드리겠습니다. 실제로 실제 고차 알고리즘이 있지만 실제로 각 인스턴스 를 순전히 1 차 프로그램으로 다시 작성할 수 있습니다. 다시 말해, 포화 된 고차 프로그램 은 없습니다. 본질적으로 프로그램의 입력 / 출력은 비트 열이기 때문입니다. [예, 이러한 비트 문자열은 함수를 나타낼 수 있지만 요점 은 바로 함수 입니다. 함수 는 함수 가 아닙니다 ].

이미 주어진 답변은 훌륭하며 내 대답은 모순되는 것으로 간주되어서는 안됩니다. 약간 더 큰 맥락 (독립형 알고리즘 대신 완전한 프로그램) 내에서 질문에 대답하는 것으로 간주해야합니다. 그리고 이러한 맥락의 변화는 답을 상당히 근본적으로 바꿉니다. 내 대답의 요점은 사람들에게 이것을 상기시키는 것입니다.


나는 고차 알고리즘이 동일한 외부 사양을 가진 1 차 알고리즘과 동등하다는 것에 동의하지만, 이것이 내부 속성에 대해 논쟁하는 것을 막아서는 안됩니다. 무언가를 표현하는 것과 무언가를 나타내는 것 사이에는 차이가 없습니다.
jkff

1
@ jkff : 나는 당신의 첫 번째 포인트에 동의합니다-우리는 이러한 내부 속성에 대해 가장 분명히 논의해야합니다. 나는 두 번째 요점에 중점을 둔다 : 당신은 어떻게 든 확장과 강도가 '동일하다'고 주장하고있다. 이것은 특허 적으로 거짓이다. [마티스 그림 '이것은 파이프가 아니다'를 상기시켜줍니다)
Jacques Carette

예, "에타 개종의 배신". (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

나는 두 가지 (서로를 표시하여) 해당하는 경우 : 그 중 하나의 존재를 부정 할 수 있음을 주장하고있어
JKFF

@ jkff : 동의하지 않습니다!
Jacques Carette

13

파서 결합기 라이브러리에서 함수의 순서는 일반적으로 상당히 높습니다. 구문 분석을 위해 더 높은 순서의 함수를 확인하십시오. 왜 6 번째 함수를 사용하고 싶습니까? 크리스 오카 사키 기능 프로그래밍 저널 , 8 (2) : 195-199, 1998 년 3 월.


이것은 훌륭한 논문이지만 내가 찾고있는 것은 아닙니다. 콤비 네이터는 고차이지만 매우 간단하고 독립적이며 그중 하나는 사소한 알고리즘 / 데이터 구조로 간주되지 않습니다 (그러나 콤비 네이터 파서 자체). 반대로 Y 결합기는 고정 소수점을 찾기위한 매우 사소한 알고리즘이며 차이 목록은 고차 함수로 완전히 구성된 영리한 데이터 구조입니다. (나는 당신의 대답을 훼손하지 않고 단지 내 질문을 명확히하려고 노력합니다)
jkff

13

실수에는 무한한 양의 정보가 포함되어 있기 때문에 계산 가능한 분석은 실수를 프로그래밍 방식으로 특성화합니다. 따라서 실수에 대한 연산은 문제의 의미가 높습니다. 일반적으로 실수는 무한 비트 비트, 캔터 공간에 대한 토폴로지 뷰를 사용하여 표시되며 더 넓은 범위의 계산 가능한 토폴로지에 관심을 갖습니다.

클라우스 웨이 흐 라흐 (Klaus Weihrach)는 이것을 계산 가능한 토폴로지의 2 형 효과 성 계층 구조로 설명했다 . 이에 대한 자세한 내용은 Weihrach & Grubba, 2009, Elementary Computable Topology 및 John Tucker의 연구 페이지 인 토폴로지 데이터를 사용한 컴퓨팅 페이지를 참조하십시오 . 내 질문, Cantor Space의 응용 프로그램 에서 Tucker의 페이지를 언급 합니다.


그리고 이것은 일반적으로 계산 가능한 수학적 대상으로 상당히 자연스럽게 확장됩니다. 다른 계산 가능한 숫자 (실제 일 필요는 없음), 무한 그룹 (반지, 대수 등)의 계산 가능한 요소, 공간의 계산 가능한 점 등 모든 알고리즘의 경우 알고리즘 이론은 객체 자체가 아닌 기능적 표현 (수학적 객체를 계산하는 방법)에서 정보를 추출하는 것과 관련이 있습니다.
ex0du5 2016 년

13

연속성 계수 기능은 맵 mA (연속) 기능을 허용 F : (nat -> nat) -> nat하고 다수의 출력 k되도록 F f = F g마다 f i = g i모든 i < k. 연속 계수 를 계산하는 알고리즘 (매우 효율적인 것은 아님)이 있으므로 3 차 알고리즘의 인스턴스가됩니다.


9

Noam의 답변 을 보완하기 위해 출력을 함수의 명시 적 표현으로 만드는 것이 중요한 상황도 있습니다.

C:0,1n0,1mA (α,L,ϵ)CnAM1,,ML

w0,1m,PrA[m, (Ag(C(m),w)α i[L], j[n], PrMi[Mi(j)=mj]1ϵ)]2/3

AgA2/3ϵmmα


5

그래프 알고리즘에서 정점과 모서리는 일반적으로 일반 데이터로 생각되지만 실제로는 프로그래밍 방식으로 주문형으로 생성되도록 생산적으로 일반화 할 수 있습니다.

내 컴퓨터 공학 박사 과정에서 암시 적 그래프 분석에 적용하기 위해 많은 그래프 알고리즘을 고차원 형태로 구현했습니다. 주로 실제 그래프가 무한하므로 명시 적으로 저장할 수 없었기 때문입니다! 구체적으로, 나는 단위 셀 (슈퍼 셀)의 3D 타일링으로 표현되는 비정질 물질의 토폴로지를 연구하고있었습니다.

예를 들어, 다음 i과 같이 원점 꼭짓점의 n 번째 인접 셸을 계산하는 함수를 작성할 수 있습니다 .

nth i 0 = {i}
nth i 1 = neighbors i
nth i n = diff (diff (fold union empty (map neighbors (nth i (n-1)))) (nth i (n-1))) (nth i (n-2))

where neighbors는 인접한 정점 세트를 주어진 정점으로 반환하는 함수입니다.

예를 들어 2D 정사각형 격자는 다음과 같습니다.

neighbors (x, y) = {(x-1, y), (x+1, y), (x, y-1), (x, y+1)}

이와 관련하여 흥미로운 알고리즘은 Franzblau의 최단 경로 링 통계를 포함합니다.


이것은 내가 한 번의 질문에 나에게 가져옵니다. 이런 식으로 그래프를 정의하는 프로그래밍 방식이 있다면, 자기 참조 역설적 그래프를 정의하는 방법이 있습니까?
Suresh Venkat

1
{x:xx}{x:xx}

확실한. 그러나 그것은 자기 참조 그래프 입니까?
Suresh Venkat

@Suresh : U정점 유형 과 U -> U -> Bool모서리 기능 이 있다는 의미에서 기능적 언어로 정의 된 그래프 입니다.
sdcvvc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.