高次アルゴリズム


35

よく知られているアルゴリズムのほとんどは、入力と出力が「プレーン」データであるという意味で、1次です。いくつかは、ソート、ハッシュテーブル、またはマップとフォールド関数など、些細な方法で二次的なものです:それらは関数によってパラメーター化されますが、他の入力データの一部でそれを呼び出すことを除いて、それで実際に面白いことは何もしません。

一部は2次ですが、やや興味深いものもあります。

  • モノイドによってパラメーター化されたフィンガーツリー
  • 単調な述語でフィンガーツリーを分割する
  • 通常はモノイドや述語などによってパラメータ化されたプレフィックス和アルゴリズム。

最後に、私にとって最も興味深い意味で「真に」高次のものもあります。

  • Yコンビネーター
  • 差分リスト

他の重要な高次アルゴリズムは存在しますか?

私の質問を明確にするために、「非自明な高次」の下で、「アルゴリズムのインターフェースおよび/または実装で重要な方法で計算形式の高次機能を使用する」ことを意味します


3
似たようなことを一度聞いた。ここではいくつかの答え:caml.inria.fr/pub/ml-archives/caml-list/2004/09/...
ラドゥグリゴール

アルゴリズムを使用したり、アルゴリズムを返したりするアルゴリズムについて話していますか?
プラティックデオガレ

回答:


13

http://math.andrej.com/には多くの高階関数がありますたとえば、二重指数関数に関する投稿では、次のHaskell型が表示されます(型の同義語が展開されています)。

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

また、A Haskell Monad for Infinite Search for Finite Timeの投稿で多くの楽しみを得ることができます-例えば:

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

この質問には別の答えがあります:ありません。より具体的には、このような(実装可能な!)高次アルゴリズムは、defunctionalizationを使用する1 次アルゴリズムと機械的に同等です。

もっと正確に言うと、実際には高次のアルゴリズムが実際にありますが、実際には、各インスタンスを純粋に1次のプログラムとして書き換えることは常に可能です。言い換えれば、飽和した高次プログラムはありません-プログラムの入出力がビット文字列であるためです。[はい、これらのビット文字列は関数を表すことができますが、それがポイントです。関数を表し、関数ではありません ]。

すでに与えられた答えは素晴らしいものであり、私の答えはそれらと矛盾すると見なされるべきではありません。少し大きなコンテキスト(スタンドアロンアルゴリズムの代わりに完全なプログラム)内から質問に答えると見なされる必要があります。そして、このコンテキストの変化は、答えを非常に根本的に変えます。私の答えのポイントは、これを人々に思い出させることです。


高次のアルゴリズムは、同じ外部仕様を持つ一次アルゴリズムと同等であることに同意しますが、これにより、内部プロパティについて議論することを妨げるべきではありません。何かを表すことと何かであることに違いはありません。
jkff

1
@jkff:私はあなたの最初の点に同意します-これらの内部特性について議論するべきです。私は2番目の点に強く反対します。あなたはどういうわけか、拡張機能とインテンシティが「同じ」であると主張しています。[マティスの絵画「これはパイプではない」を思い出させる]
ジャック・カレット

ああ、はい、「イータ変換の裏切り」。(\\() -> "Ceci n'est pas une fonction") ()
CAマッキャン

2つの事柄が(互いに表すことによって)同等である場合、それらの1つの存在を否定することはできないと主張しています:)
jkff

@jkff:それに反対するのは難しい!
ジャックカレット

13

パーサーコンビネーターライブラリでは、関数の順序は通常かなり高いです。解析のためにさらに高次の関数をチェックするか、なぜ6次関数を使用したいのでしょうか?クリス・岡崎。Journal of Functional Programming、8(2):195-199、1998年3月。


これは素晴らしい論文ですが、私が探しているものではありません。コンビネータは高次ですが、非常にシンプルで独立しており、それらのどれもが非自明なアルゴリズム/データ構造としてはほとんどカウントされません(ただし、おそらくコンビネータパーサー自体はそうなります)。それどころか、Yコンビネータは固定小数点を見つけるための非常に重要なアルゴリズムであり、差分リストは完全に高階関数から構築された巧妙なデータ構造です。(私はあなたの答えを損なうのではなく、単に私の質問を明確にしようとしています)
jkff

13

実数には限りのない情報が含まれているため、計算可能な分析は実数をプログラムで特徴付けます。そのため、実数に対する操作は質問の意味で高次です。通常、実数は、ビットの無限ストリームであるカントール空間のトポロジカルビューを使用して表示され、計算可能なトポロジのより広い分野に関心を向けます。

Klaus Weihrachは、これを計算可能なトポロジの有効性のタイプ2階層と呼んでいます。これについて詳しくは、Weihrach&Grubba、2009、Elementary Computable Topology、およびJohn Tuckerの研究ページであるComputation with Topological Dataをご覧ください。私の質問「Cantor Spaceのアプリケーション」でTuckerのページに言及しています。


そして、これは一般に計算可能な数学オブジェクトに自然に拡張されます:他の計算可能な数(必ずしも実数ではない)、無限グループの計算可能な要素(環、代数など)、空間内の計算可能な点など。理論は、オブジェクト自体からではなく、関数表現(数学オブジェクトの計算方法)から情報を抽出することに関するものです。
ex0du5

13

連続の弾性機能は、マップであるm(連続)機能を受け入れF : (nat -> nat) -> nat、数値を出力するkようにF f = F gするたびにf i = g iするためのすべてのi < k連続性モジュラスを計算するためのアルゴリズム(非常に効率的なものではない)があるため、3次アルゴリズムのインスタンスとなります。


9

Noamの答えを補完するために、出力を関数(の明示的な表現)にすることが重要な状況もいくつかあります。

C:0,1n0,1mA αLϵCnAM1ML

w01mPrA[m AgCmwα [L] j[n] PrM[Mj=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)}

これに関連する他の興味深いアルゴリズムには、フランツブラウの最短経路リング統計が含まれます。


これは私がかつて持っていた質問に私をもたらします。この方法でグラフを定義するプログラム的な方法がある場合、自己参照的な逆説的なグラフを定義する方法はありますか?
スレシュヴェンカト

1
{x:xx}{x:xx}

確かに。しかし、それは自己参照グラフですか?
スレシュヴェンカト

@Suresh:これは、U頂点のタイプU -> U -> Boolとエッジの機能があるという意味で、関数型言語で定義されたグラフです。
sdcvvc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.