基数システムに基づくアルゴリズム?[閉まっている]


87

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

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

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


5
私も質問が好きですが、どのようにして「正しい」答えを選びますか?これはコミュニティウィキである必要がありますか?
vlad 2011年

14
これはコミュニティウィキである必要があります
BlueRaja – Danny Pflughoeft 2011年

18
@close投票者:アルゴリズムに関する質問がSOで話題から外れている場合、ここで何が話題になっているのかわかりません。CSSについてのばかげた初心者の質問?「正規表現plzzを使用できますか?」"plz email teh codez 4 mi hoemwok"?
MAK 2011年

2
銀河ヒッチハイカーのガイド:生命、宇宙、すべてへの答えは何ですか?深い思考の答え:42。質問を見つけるための機械としての地球:9 x 6とは何ですか?そしてこれがすべてがとてもf *****アップしている理由です。Tシャツに見られる:9(ベース13)x 6(ベース13)= 42(ベース13)。QED。
クリスウォルトン

「直感や証明の重要なステップとして巧妙な記数法を使用する他のアルゴリズムはありますか?」 Stack Overflowは、レコメンデーションエンジンすべてのリスト、またはリンクファームではありません。実用的なプログラミングの質問を絶対に解決するためのアルゴリズム。巧妙なアルゴリズムのためのクリアリングハウス、いいえ。彼らがこれを望むなら、あなたは数学のメタについて尋ねたいと思うかもしれません。

回答:


39

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

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

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

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

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

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

2
+1私は岡崎の本のコピーを持っています...私はそれらの章が好きでした、そしてそれらは私がこの質問をした理由の一部です(ブートストラップされたスキュー二項ヒープは本当にクールです!)しかし私はそれをずっと読んでいませんでした多分私はすべきです。また、それらのリファレンスを確認します。彼らは素晴らしく見えます。
templatetypedef

Okasakyの完全な論文はオンラインで入手できます:cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

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

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

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

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

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

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

等...

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


6
これらはいずれも、..アルゴリズムに関連されていません
BlueRaja -ダニーPflughoeft

11
確かにそうです。三項でシェルピンスキーの三角形の三角形を作成するか、六十進法で地理座標を計算します。ローマ数字を10進数に変換するアルゴリズムはどうですか?六進法に基づく素数発見アルゴリズムはどうですか?
ベンジャミン

9

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

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

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

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


3
これはtemplatetypedefの投稿から完全に盗まれたと思います、それは私の潜在意識に閉じ込められたに違いありません。それは単なるバイナリよりも多くの塩基について話しているので、私はそれを残しただけです。
ベンホーナー2011年

2
これにより、最大でp個のパーティションを持つすべてのパーティションが生成され、冗長性があります。とはどう111222違うの222111ですか?
空集合

7

私は最近、0から2 n -1までの数値のバイナリ表現に基づいて辞書式順序でサブセットを生成するためのクールなアルゴリズムに出会いました。これは、数値のビットを使用して、セットに選択する要素を決定し、ローカルで並べ替えます。それらを辞書式順序にするために生成されたセット。興味があれば、ここに記事を投稿します

また、多くのアルゴリズムはスケーリングに基づいており(Ford-Fulkerson最大フローアルゴリズムの弱多項式バージョンなど)、入力問題の数値の2進表現を使用して、大まかな近似を段階的に完全な解に改良します。


2
これはサブセットを生成する最も簡単な方法です:)
st0le 2011年

これは、組み合わせの概念で数える最も簡単な方法です。
Saeed Amiri 2011

@ st0le-これは、ビット間の1対1のマッピングとセットの包含から得られる通常の順序ではなく、辞書式順序でセットをリストするため、標準バージョンよりも少し注意が必要だと思います。
templatetypedef


6

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

ダブルベースシステムは、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

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



5

これは、「偽造コイン」の問題を解決するために3進数を使用することに関する良い投稿です(通常のコインのバッグから1つの偽造コインを検出し、天びんをできるだけ少なくする必要があります)。


これは素晴らしい投稿で、「Fun withNumberSystems」という講演でこれを使用することになりました。投稿してくれてありがとう!
templatetypedef

ようこそ、そしてあなたがそれを使うことができてうれしいです!
マーティンデメロ2011

5

文字列のハッシュ(たとえば、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

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



4

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

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


3

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



1

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

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


1
そして、あらゆるカレンダーシステム-マヤ、ルナ、バビロニア.... 1971年以前の英語通貨(LSD)と一緒に。あなたが言うように、リストは続きます。
クリスウォルトン


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