web-dev-qa-db-ja.com

基数システムに基づくアルゴリズム?

私は最近、創造的な基盤での数字の巧妙な使用に部分的または全体的に基づいた非常に多くのアルゴリズムがあることに気づきました。例えば:

  • 二項ヒープは2進数に基づいており、より複雑なスキュー二項ヒープはスキュー2進数に基づいています。
  • 辞書式順序の順列を生成するためのいくつかのアルゴリズムは、階乗進法に基づいています。
  • 試行は、適切なベースについて、一度に1桁の文字列を見るツリーと考えることができます。
  • ハフマン符号化ツリーは、ツリー内の各エッジが何らかのバイナリ表現で0または1を符号化するように設計されています。
  • フィボナッチ符号化は、フィボナッチ検索で使用され、特定のタイプの対数を反転します。

私の質問は次のとおりです:直感または証明の重要なステップとして巧妙な記数法を使用する他のアルゴリズムはありますか?。私はこのテーマについて話をまとめることを考えているので、私が引き出さなければならない例が多ければ多いほど良いです。

87
templatetypedef

クリス・オカサキは、彼の著書に非常に優れた章を持っています純粋関数型データ構造「数値表現」について説明しています。基本的に、数値の表現を取り、それをデータ構造に変換します。フレーバーを与えるために、ここにその章のセクションがあります:

  1. 位置番号システム
  2. 2進数(2進数のランダムアクセスリスト、ゼロレス表現、レイジー表現、セグメント化された表現)
  3. スキュー2進数(スキューバイナリランダムアクセスリスト、スキュー二項ヒープ)
  4. 3進数と4進数

蒸留された最高のトリックのいくつか:

  • スパースの数値表現を区別します(通常、これは行列またはグラフで表示されますが、数値にも適用できます!)
  • 冗長な数値システム(数値の表現が複数あるシステム)が役立ちます。
  • 最初の桁をゼロ以外に配置するか、ゼロなしの表現を使用すると、データ構造の先頭を効率的に取得できます。
  • セグメント化データ構造によって(リストの末尾を取得することから)借用をカスケードすることを避け、(リストにコンシングすることから)キャリー

その章のリファレンスリストもあります。

  • Guibas、McCreight、Plass、Roberts:線形リストの新しい表現。
  • マイヤーズ:適用可能なランダムアクセススタック
  • Carlsson、Munro、Poblete:挿入時間が一定の暗黙の二項式キュー。
  • カプラン、タージャン:リカーシブスローダウンによるカテネーションを伴う純粋関数型リスト。
39
Edward Z. Yang

「3進数を使用して、シェルピンスキー三角形やカントール集合などの自己相似構造を便利に伝えることができます。」 ソース

「2Dヒルベルト曲線の表現には4進数が使用されます。」 ソース

「4分の1の架空の記数法は、1955年にドナルド・クヌースによって高校の理科の才能の検索に提出されて最初に提案されました。これは、架空の数2iをベースとして使用する非標準の位置記数法です。 0、1、2、および3の数字のみを使用してすべての複素数を表します。」 ソース

「ローマ数字は二五進法です。」 ソース

「2と3を除くすべての素数は、基数6で表されると、最後の桁が1または5になるため、六進法は素数の研究に役立つと考えられます。」 ソース

「六十進法(基数60)は、60を基数とする記数法です。紀元前3千年紀の古代シュメール人に端を発し、古代バビロニア人に受け継がれ、現在でも測定に使用されています。時間、角度、および角度である地理的座標。」 ソース

等...

このリスト は良い出発点です。

20
Benjamin

先日あなたの質問を読みましたが、今日は問題に直面しました。セットのすべてのパーティションを生成するにはどうすればよいですか?私が思いついた解決策、そして私が使用した解決策(おそらくあなたの質問を読んだため)はこれでした:

(p)パーティションが必要な、(n)個の要素を持つセットの場合、基数(p)のすべての(n)桁の数字を数えます。

各番号はパーティションに対応しています。各桁はセット内の要素に対応し、桁の値は要素を配置するパーティションを示します。

それは驚くべきことではありませんが、きちんとしています。それは完全で、冗長性を引き起こさず、任意のベースを使用します。使用するベースは、特定のパーティショニングの問題によって異なります。

9
Ben Horner

正確には巧妙な基本システムではありませんが、基本システムの巧妙な使用法: Van der Corput シーケンスは 低離散シーケンス 数値のbase-n表現を逆にすることによって形成されます。これらは、2-d ハルトン列 を構築するために使用されます。これは this のように見えます。

6
mhum

行列の乗算を高速化するためのダブルベースシステムについて、漠然と覚えています。

ダブルベースシステムは、1つの番号に2つのベースを使用する冗長システムです。

_ n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
_

冗長とは、1つの番号をさまざまな方法で指定できることを意味します。

TodorCooklevのVassilDimitrovによる記事「行列多項式の計算のためのハイブリッドアルゴリズム」を探すことができます。

私ができる最高の短い概要を提供しようとしています。

彼らは行列多項式G(N,A) = I + A + ... + A^{N-1}を計算しようとしていました。

Nを支持することは複合G(N,A) = G(J,A) * G(K, A^J)であり、J = 2に適用すると、次のようになります。

_         / (I + A) * G(K, A^2)        , if N = 2K
G(N,A) = |
         \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1
_

また、

_         / (I + A + A^2) * G(K, A^3)           , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
         \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2
_

これらの方程式のいくつかは最初のシステムでは高速であり、2番目のシステムではより優れていることは(冗談めかして)「明らか」なので、Nに応じてそれらの中から最良のものを選択することをお勧めします。ただし、これには2と3の両方で高速のモジュロ演算が必要になります。これがダブルベースが登場する理由です。基本的に、両方のモジュロ演算を高速に実行して、結合されたシステムを実現できます。

_         / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
         | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
         \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6
_

私はこの分野の専門家ではないので、より良い説明については記事を見てください。

6
Egon

RadixSortは、さまざまな基数を使用できます。 http://en.wikipedia.org/wiki/Radix_sort bucketSortの非常に興味深い実装。

5
keepitreall89

ここに良い投稿があります 「偽造コイン」問題を解決するために3進数を使用することについて(通常のコインの袋の中の1つの偽造コインを検出する必要があり、バランスをできるだけ少なく使用する必要があります)

5
Martin DeMello

文字列のハッシュ(たとえば、 Rabin-Karp アルゴリズム)では、文字列をn桁で構成される基数bの数値として評価することがよくあります(nは文字列の長さ、bは選択された基数です。十分大きい)。たとえば、文字列「ABCD」は次のようにハッシュできます。

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

文字にASCIIの値を代入し、bを256にすると、次のようになります。

65*256^3+66*256^2+67*256^1+68*256^0

ただし、ほとんどの実際のアプリケーションでは、結果を十分に小さく保つために、結果の値は適切なサイズの数値を法として取られます。

5
MAK

2乗によるべき乗 は、指数の2進表現に基づいています。

4
st0le

Hackers Delight(すべてのプログラマーが私の目に知っておくべき本)ベースとしての-2(はい、右負のベース)や-1 + i(虚数単位sqrt(-1)としてのi)などの異常なベースに関する完全な章があります。ベースとして。また、私は最良のベースが何であるかを計算します(ハードウェア設計の観点から、それを読みたくないすべての人のために:方程式の解はeなので、2または3で行くことができます、3は少し良いでしょう(係数2)の1.056倍優れていますが、技術的にはより実用的です)。

私の頭に浮かぶ他のことは、グレーカウンター(このシステムで1ビットの変更のみを数える場合、メタスタビリティの問題を減らすためにハードウェア設計でこのプロパティを使用することがよくあります)またはすでに述べたハフマンエンコーディングの一般化-算術エンコーディングです。

4
flolo

暗号化では、整数環(モジュラー算術)と有限体を幅広く使用します。これらの演算は、整数係数を持つ多項式の動作に直観的に基づいています。

3
Null Set

私は2進数をグレイコードに変換するためにこれが本当に好きです: http://www.matrixlab-examples.com/gray-code.html

3
Rafe

素晴らしい質問です。リストは確かに長いです。時間を伝えることは、混合ベースの単純なインスタンスです(日|時間|分|秒|午前/午後)

興味があれば、メタベースの列挙型n-Tupleフレームワークを作成しました。これは、ベースナンバリングシステムにとって非常に甘い構文糖衣です。まだリリースされていません。私のユーザー名を(Gmailで)メールで送信します。

1
sufficient

基数2を使用した私のお気に入りの1つは、 算術符号化 です。アルゴリズムのハートが0から1までの数値の表現を2進数で使用するため、これは珍しいことです。

1

[〜#〜] aks [〜#〜] の場合があります。

0
Saeed Amiri