配列の最小限の説明を見つける方法は?


7

次の配列は、メモリ内の10000スロットを占有します。

a = [0,1,2,3,4,5,6,7,8,9,10,...,10000]

しかし、同じ配列を次のように簡単に表すことができます。

a = {len:10000, get: λ idx -> idx}

はるかにコンパクトです。同様に、コンパクトに表現できる配列がいくつかあります。

a = {a:1000, get: λ idx -> idx * 2}
Is a description for [0,2,4,6,8,10,...,2000]

a = {a:1000, get λ idx -> idx ^ 2}
Is a description for [0,1,2,4,9,...1000000]

And so on...

非常に多くの配列を提供すると、各要素をメモリに格納するよりもはるかに短い方法で表現できます。

  1. この現象に名前はありますか?
  2. 特定の配列の最小表現を見つける方法はありますか?
  3. これを考慮すると、おそらく記述言語に依存します(この場合は、関数、オブジェクト、および数学演算子を備えた架空のプログラミング言語を使用しました)。オブジェクトのそのような最小限の説明を見つけるのに最適な特定の言語はありますか?

回答:


9

あなたが説明している現象はコルモゴロフの複雑さです。基本的に、プログラミング言語(またはより正式には、チューリングマシンのコーディング)を修正した場合、コルモゴロフの複雑さ K(s) 文字列の s 出力する最短のプログラムの長さ s入力なしで開始した場合。異なる言語を使用すると、多くても一定の付加的な違いが生じるため、使用するプログラミング言語は問題ではないことがわかります K(s)。いくつかのワッコ言語に関してコルモゴロフの複雑さを定義したい場合は、その言語を使用して賢明な言語のインタープリターを作成できます。そのため、あなたの言語に関するストリングのコルモゴロフの複雑さは、私の言語の複雑さよりも悪くなることはありません。さらに、インタープリターの固定された一定のオーバーヘッド。

チューリングマシンのすべての興味深いプロパティと同様に、ストリングのコルモゴロフの複雑さは決定できません。しかし、これはそれが有用な概念であることを止めるものではなく、この主題に関して多くの研究が行われてきました。


4

これを実用的なPOVから見ると、データ圧縮と呼ぶことができます。これは基本的にデータ圧縮アルゴリズムが行うことです。それらは言語を定義し、次にこの言語で特定のデータセットを表現しようとします。しかし、非常に単純な言語であっても、その言語で最適な表現を見つけることは非常に困難です。Deflateを例にとると、非常に単純ですが、最適な方法でそれを適用する方法については依然として活発な研究があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.