タグ付けされた質問 「algorithms」

数学とコンピュータサイエンスでは、アルゴリズムは、関数を計算するための明確に定義された命令の有限リストとして表現される効果的な方法です。アルゴリズムは、計算、データ処理、および自動推論に使用されます。

2
償却分析?(最悪の場合の性能保証)
償却分析とは何ですか?また、プログラムで最悪の場合のパフォーマンス保証を達成するのにどのように役立ちますか? 私は、次のテクニックがプログラマーが最悪のパフォーマンス保証を達成するのを助けることができると読んでいました(つまり、私自身の言葉:プログラムの実行時間が最悪のキャストの実行時間を超えないことを保証します): ランダム化アルゴリズム(たとえば、最悪の場合、クイックソートアルゴリズムは2次ですが、入力をランダムに並べると、実行時間が線形であることが確率的に保証されます) 操作のシーケンス(分析では、データとクライアントが実行した操作のシーケンスの両方を考慮する必要があります) 償却分析(パフォーマンス保証を提供する別の方法は、すべてのオペレーションの合計コストをオペレーション数で割って追跡することにより、コストを償却することです。この設定では、平均コストを維持しながら、いくつかの高価なオペレーションを許可できますつまり、少数の高価な操作のコストを、その一部を多数の安価な操作のそれぞれに割り当てることで分散します) 著者は、償却分析を達成する方法の1つの例として、Stackの配列データ構造のサイズ変更の使用に言及しましたが、償却分析とは何か、実際にはどのようにできるかはまだわかりません最悪の結果を達成するために実装か(データ構造?アルゴリズム?) -キャストパフォーマンス保証

1
Floyd-Warshall、Dijkstraのアルゴリズム、Bellman-Fordアルゴリズムの違いについては正しいですか?
私は3つを研究しており、それらからの推論を以下に述べています。それらを十分に正確に理解しているかどうかを誰かに教えてもらえますか?ありがとうございました。 ダイクストラのアルゴリズムは、単一のソースがあり、あるノードから別のノードへの最小パスを知りたい場合にのみ使用されますが、このような場合は失敗します Floyd-Warshallのアルゴリズムは、すべてのノードのいずれかがソースになる可能性がある場合に使用されるため、ソースノードから宛先ノードに到達する最短距離が必要です。これは、負のサイクルがある場合にのみ失敗します (これは最も重要なものです。つまり、これは私が最も確信していないものです:) 3.Bellman-Fordは、ソースが1つしかない場合のダイクストラのように使用されます。これは負の重みを処理でき、その動作は1つのソースを除き、Floyd-Warshallの動作と同じですか? 見る必要がある場合、対応するアルゴリズムは次のとおりです(提供:ウィキペディア): ベルマンフォード: procedure BellmanFord(list vertices, list edges, vertex source) // This implementation takes in a graph, represented as lists of vertices // and edges, and modifies the vertices so that their distance and // predecessor attributes store the shortest paths. // Step 1: initialize graph …

3
関数an + bがO(n ^ 2)およびΘ(n)に属するというステートメントを説明してください。
私は線形関数を持っているとしましょうf(n)= an+b、この関数がO(n 2)に属していることを証明する最良の方法は何Θ(n)ですか? ここでは数学的な厳密さは必要ありません。プログラマーの回答が必要です。説明の論理的な方法。 これがまさに数学のQ&AではなくプログラマーのQ&Aに質問を投稿しなかった理由です。

3
Head Firstシリーズのように教えるアルゴリズムの本はありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 Javaプログラマーとして、アルゴリズムを学習する必要があります(プログラミングの課題)。私はいくつかのヘッドファーストシリーズ(私が所有するJAVA)を読みましたが、それらは非常に頭に優しいものです。それで、私は理解するのが簡単で、各アルゴリズムの核心にもなるアルゴリズムの本があるのだろうかと思っていました。
12 java  books  algorithms 

7
大量のデータで機能するソートアルゴリズム
大量のデータを処理できる、つまり、データセット全体を一度にメインメモリに保持できない場合でも動作できるソートアルゴリズムを探しています。 私が今まで見つけた唯一の候補はマージソートです。メインメモリにすべてのデータを一度に保持することなく、各マージでデータセットをスキャンするようにアルゴリズムを実装できます。私が念頭に置いているマージソートのバリエーションについては、この記事の「テープドライブで使用する」セクションで説明しています。 私はこれが良い解決策だと思います(複雑さO(nx log(n)))が、メインメモリに収まらない大きなデータセットで動作できる他の(おそらくより高速な)ソートアルゴリズムがあるかどうか知りたいです。 編集 回答に必要な詳細を次に示します。 データは定期的に、たとえば月に1回ソートする必要があります。いくつかのレコードを挿入する必要はなく、データをインクリメンタルにソートする必要があります。 私のサンプルテキストファイルは約1 GBのUTF-8テキストですが、たとえば20 GBのファイルであっても、一般的な問題を解決したかったのです。 データベースにはありません。また、他の制約のため、そうすることはできません。 データは他の人によってテキストファイルとしてダンプされます。このテキストファイルを読み取るための独自のコードがあります。 データの形式はテキストファイルです。改行文字はレコード区切り文字です。 私が考えていた改善の1つは、ファイルをメモリ内でソートできるほど小さいファイルに分割し、最後に上記のアルゴリズムを使用してこれらすべてのファイルをマージすることでした。

2
ダイクストラのアルゴリズムは、この信号ルーティング問題の適切な解決策ですか?
私は、統合された視聴覚システム用の信号管理およびルーティングモジュールの開発を進めており、さまざまな信号配信ネットワークにわたって可能な限り柔軟になるように設計しています。モジュールの目的は、多数のスタックマトリックススイッチャー1を経由するルーティングを処理し、必要なフォーマット変換を処理することです。 この時点で検討した最良の解決策は、ネットワークをスイッチャーでサポートされている各信号タイプの個別の頂点を持つグラフにマッピングし、フォーマット変換を処理するビデオプロセッサを表すノードを介して結合することです。 色は信号形式を表します。 ラウンドノードは、スイッチャー、ソース、またはシンクのいずれかです。 スクエアノードは、形式変換を実行するビデオプロセッサです。 そこから、ダイクストラのアルゴリズムの実装を使用して、入力Xから出力Yを取得するために形成する必要があるパスを特定できます。これにより、すべてのスイッチャーおよびプロセッサーの入力/出力構成に関するデータを渡すことができます。モジュールはそれに応じて適応します。 これは適切な解決策ですか、それとも調査する価値がある代替アプローチがありますか? 1別名「クロスバースイッチ」、1対多の接続をサポートするM入力x N出力のビデオルーター。各物理デバイスは複数の信号形式を処理でき、形式変換を実行できる場合とできない場合があります。 編集: PéterTörökが述べたように、グラフは必ずしもツリーである必要はありません。図はアイデアを説明するための簡単な例です。「実世界」に実装すると、エッジの重みで表現することを計画していたさまざまなレベルの定義(DVI> VGA>コンポーネント>コンポジット)を提供する複数のパスが存在する場合があります。 編集2:指向性が示され、2つの信号タイプで構成されるネットワークを示す、もう少し包括的な例です。最初の例は、マトリックスルーティング/入力選択を制御するために必要なデータを提供するため、デバイスの各入力と出力が個別のノードとして定義されるようにわずかに変更されました。

2
有界ナップザック問題を0/1ナップザック問題に変換する
目標が動的プログラミング(他のアプローチの代わり)を使用することであるという問題に出くわしました。スパンする距離と、異なる長さのケーブルのセットがあります。距離を正確にスパンするために必要なケーブルの最小数は何ですか? 私にはこれはナップザック問題のように見えましたが、特定の長さの倍数がある可能性があるため、0/1ナップザック問題ではなく、有界ナップザック問題でした。(各アイテムの値をその重さとして扱います。)単純なアプローチ(および検索スペースの拡大を気にしない)を採用し、境界ナップザック問題を0/1ナップザック問題に変換するために使用した方法は、単に倍数を単数に分割し、よく知られている動的プログラミングアルゴリズムを適用します。残念ながら、これは次善の結果につながります。 たとえば、指定されたケーブル: 1 x 10ft、 1 x 7ft、 1 x 6ft、 5 x 3ft、 6 x 2ft、 7 x 1ft ターゲットスパンが13フィートの場合、DPアルゴリズムは7 + 6を選択して距離をスパンします。貪欲なアルゴリズムは10 + 3を選択しますが、これはケーブルの最小数のネクタイです。15フィートをスパンしようとすると、問題が発生します。DPアルゴリズムは最終的に6 + 3 + 3 + 3を選択して4本のケーブルを取得しましたが、貪欲なアルゴリズムは3本のケーブルだけで10 + 3 + 2を正しく選択しました。 とにかく、境界を0/1に変換する軽いスキャンを行うと、複数のアイテムを{p、2p、4p ...}に変換するよく知られたアプローチのようです。私の質問は、p + 2p + 4pが複数のアイテムの数にならない場合、この変換がどのように機能するかです。たとえば、5本の3フィートケーブルがあります。3 + 2 x 3 + 4 x 3> …
12 algorithms 

4
低ポーズGCの背後にあるアルゴリズムは何ですか?
いくつかの言語は、javaの例のために、低休止GCを導入しました。 これらのGCは、全世界を一時停止することなく、ほとんどの作業を実行できます。これは明らかに非常に難しい問題です。スレッドが変更しているときにメモリを分析する必要があるため、プロセスの開始時に使用でき、終了時には使用できなくなったデータや、ゴミのように見えるデータ参照はメモリ内で移動され、GCが探している場所には表示されませんでした。 基本的に、その背後にあるアルゴリズムは何ですか? このトピックは本当に技術的であるため、研究論文または本当に技術的な記事のリンクは有効な回答と見なされます。

5
最も効率的なキャッシュ置換アルゴリズム[終了]
閉じた。この質問には、詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善したいですか?詳細を追加し、この投稿を編集して問題を明確にします。 6年前に閉鎖されました。 ウィキペディアには、11のキャッシュ置換アルゴリズムがリストされています。私が開発しようとしているアプリケーションについてほとんど何も知らないと仮定すると、「デフォルト」のキャッシュ置換アルゴリズムとして何を使うべきでしょうか? 私のOSコースから正しく思い出せば、LRUは最高の汎用キャッシュ置換アルゴリズムです。しかし、多分私は間違っています。 また、これは一般に、メインメモリが安価で豊富であり、キャッシュサイズについてあまり心配する必要がないため、学術的な問題です。

12
アルゴリズムとは何ですか?
Algorithmとはどういう意味ですか?私がこの言葉を少し理解しているのは、それが特定の言語やデザインパターンに固有のものではなく、むしろ最も基本的な原則であるということです(したがって、この質問は私を愚かに見えると思います)。 私がそれを理解している「オプション」の1つは、それが何かを成し遂げる方法を意味するということです。それは、擬似コードのリストとして書くことができます。 もっと複雑なコードを書くとき、何をする必要があるのか​​、何を、どのようにそこに到達するのか(プログラミング言語ではない)を考え、それをコードで記述します。それについては良い方法ですか?それはアルゴリズムと関係がありますか? (特定の問題/言語に関するものではなく、Stackoverflowではなく、ここの大多数の人々が「理由」を知っている、または少なくともここの回答がより詳細であると感じるため、むしろStackoverflowで質問したかったのです。それが違うところで、あそこに尋ねたらよかったです)
12 algorithms 


2
アルゴリズムが収束することはどういう意味ですか?
強化学習について読むとき、この文に出くわします。たとえば、次の文です。 問題を慎重にモデル化すると、一部の強化学習アルゴリズムがグローバル最適に収束する可能性があります http://reinforcementlearning.ai-depot.com/ またはここ: 固定ポリシーPiの場合、上記のTDアルゴリズムはVPiに収束することが証明されています http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node62.html 収束という言葉の私の理解は、同じポイントにいくつかの事が一緒に来ることを意味するということですが、単一の事(アルゴリズム)がそれをどのようにできるのでしょうか?


2
地図データを保存するための理想的なデータ構造ですか?
私はインタビューテストでこれを尋ねられました。私はテストで大丈夫でしたが、この質問に答えるのに十分な知識がありませんでした。データをすばやく照会するために使用できるデータ構造を知りたいです。 基本的には、ある種のデータ構造に格納された道路セクション(ライン、ポイントで構成される)があるという考えです。どの道路セクション(またはポイント)がポイント(半径)から特定の距離内にあるかをすばやく照会する必要があります。

3
%演算子を使用せずに、よく分散されたハッシュテーブルを実装することは可能ですか?
私は、C#で高速で十分に分散されたハッシュテーブルを実装したいと考えています。任意のハッシュコードを受け取り、それを「制約」して、バケットのインデックス作成に使用できるハッシュ制約関数の選択に問題があります。私がこれまでに見た2つのオプションがあります: 一方では、バケットに常に素数の要素があることを確認し、ハッシュを制約するには、単にバケットの数でモジュロします。実際、これは.NETの辞書が行うことです。このアプローチの問題は、%の使用が他の操作と比較して非常に遅いことです。あなたが見ればAgner霧命令テーブル、idiv(%のために生成されますアセンブリコードで)新しいIntelプロセッサのための〜25サイクルの命令のレイテンシを持っています。3の周りにこれを比較しmul、等をビット単位のオペレーションのための1 and、orまたはxor。 一方、バケットの数は常に2の累乗にすることができます。配列の外部でインデックスを作成しないようにハッシュのモジュラスを計算する必要がありますが、今回はより安価になります。2のべき乗のためのため% Nだけされ& (N - 1)、拘束のみ1~2サイクルかかるマスキング演算に低減されます。これはGoogleのsparsehashによって行われます。この欠点は、ユーザーに適切なハッシュを提供することを期待していることです。ハッシュをマスクすると、基本的にハッシュの一部が切り捨てられるため、ハッシュのすべてのビットを考慮しなくなります。ユーザーのハッシュが不均等に分散している場合、たとえば上位ビットのみが埋められるか、下位ビットが常に同じである場合、このアプローチの衝突率ははるかに高くなります。 私は、両方の長所を備えた使用可能なアルゴリズムを探しています。ハッシュのすべてのビットを考慮し、%を使用するよりも高速です。必ずしもモジュラスである必要はなく、範囲内0..N-1(Nはバケットの長さ)にあることが保証されているだけで、すべてのスロットに均等に分布しています。そのようなアルゴリズムは存在しますか? 助けてくれてありがとう。

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