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

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

3
なぜ反復バージョンに時間がかかるのですか?
私はhttp://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/を見ていましたが、階乗関数の再帰的および反復的な実装の彼の実装では、実際には反復に時間がかかりますn = 1,000が与えられます。理由はわかりません(彼は説明しませんが、それは読者にとっての練習だと言います)。このすべてに私の新しさを申し訳ありません。

1
アルゴリズム:プレイに最適なテーブルを見つける(スタンディングギャンブラーの問題)
序文 これはコードゴルフではありません。私は興味深い問題を見て、同僚からのコメントや提案を求めています。この質問は(排他的に)カードのカウントに関するものではなく、観察に基づいて最適なテーブルを決定することに関するものです。最悪の場合の時間/空間の複雑さ(任意のアーキテクチャ)を人間の心に移植可能にする何らかの種類の脳移植を行うと仮定します。はい、これは非常に主観的です。ワイルドカードを使用せずにフランスのデッキを想定します。 バックグラウンド 私は最近カジノを訪れ、テーブルごとのプレーヤーよりも多くの傍観者を見ました。ほとんどの傍観者がプレイする資金を持っているので、どの選択プロセスが傍観者を賭けプレーヤーに変えたのか疑問に思いました。 シナリオ あなたはカジノに入ります。n個のテーブルがブラックジャックのバリアントをプレーし、そのうちy個がポンツーンをプレーしています。各テーブルは、ハウスアドバンテージをわかりにくくするために、不確定な量のカードデッキでプレイします。 各テーブルにはさまざまな最小ベットがあります。あなたはあなたの人にZ通貨を持っています。次の場所にあるテーブルを検索します。 使用中のカードデッキの最小量 最小ベットは、より多くのデッキを使用するテーブルよりも高くなりますが、Zでプレイできるゲームの量を最大化する必要があります。 プレーヤーごとの純損失は最小です(ほとんどの答えでは、これは偶発的なノイズと見なされますが、シャッフルが壊れていることを示している可能性があります) 問題 すべてのテーブルを魔法のように観察できます。決定の基礎とするために、サンプリングするXラウンドがあります。この目的のために、すべてのプレイヤーがプレイするのに30秒以上かかりません。 この問題を解決するためにどのアルゴリズムを使用しますか?また、最悪の場合の複雑さは何ですか?あなたは: ポンツーンまたはブラックジャックをプレイしますか? どのテーブルを選択しますか? カジノがどちらのゲームでも8デッキ以下のカードしか使用できない場合、何ラウンドを観察する必要がありますか(Xの値は何ですか)。各テーブルには2〜6人のプレイヤーがいます。 テーブルを見つけている間、どのくらいの時間待ちましたか? より良い用語がないため、これを「スタンディングギャンブラー問題」と呼んでいます。自由に調整してください。 追加 カジノでない場合、これはどこで役立つでしょうか? 最後の 私は魔法のギャンブルの弾丸を探していません。私はちょうど私の脳が噛むのをやめない骨になる問題に気づいた。私は特に、カジノを訪れる以外の用途に興味があります。
11 algorithms 

4
アイテムを並べ替えるときに並べ替えキーを生成する
エンドユーザーが目的の順序に整理できるアイテムがいくつかあります。アイテムのセットは順不同ですが、各アイテムには変更可能な並べ替えキーが含まれています。 最初のアイテム、最後のアイテム、または2つのアイテムの間に追加または移動されたアイテムの新しい並べ替えキーを生成できるアルゴリズムを探しています。移動するアイテムの並べ替えキーを変更するだけで済みます。 アルゴリズムの例としては、各ソートキーを浮動小数点数にして、2つのアイテムの間にアイテムを配置するときに、ソートキーをそれらの平均に設定します。アイテムを最初または最後に配置すると、最も外側の値+-1になります。 ここでの問題は、浮動小数点の精度が原因でソートが失敗する可能性があることです。同様に、2つの整数を使用して小数を表すと、数値が非常に大きくなり、通常の数値型で正確に表すことができなくなる場合があります(JSONとして転送する場合など)。BigIntsを使用したくありません。 これらの欠点の影響を受けない文字列を使用するなど、機能する適切なアルゴリズムはありますか? 膨大な数の移動をサポートするつもりはありませんが、上記のアルゴリズムは、約50回の移動後に倍精度浮動小数点数で失敗する可能性があります。
11 algorithms 

1
「この一連の材料でどのレシピを作成できるか」に答えるためのアルゴリズム/データ構造
正式には、s(U、Q)= { V | V ∈ UとV ⊆ Q } U、Q、およびVがすべてのセットを表し、Uは、より具体的には、セットの集合を表します。例として、Uはクックブックのさまざまなレシピに必要な材料のセット(セット)であり、Qは材料のセットを表し、Vはそれらの材料で作成できるレシピを表します。クエリs(U、Q)「これらの成分で何が作れるのか」という質問に対応します 私が探しているインデックスというデータ表現であるU、それはの効率的なクエリをサポートするような方法で、Sを(U、Qは)ここで、QとのすべてのメンバーUは、一般的に、すべてのメンバーの組合に比べて小さくなりますU。さらに、Uを効率的に更新できるようにしたい(たとえば、レシピの追加または削除)。 私はこの問題をよく理解する必要があると思わずにはいられませんが、名前やリファレンスを見つけることができませんでした。これを効率的に解決するための戦略、または私がそれについてもっと読むことができる場所を誰かが知っていますか? 解決策について考える限り、私が持っていたのは、集合Uの決定木を構築することでした。ツリーの各ノードで、「成分リストにxが含まれていますか?」という質問 回答によって排除されるUのメンバーの数を最大化するためにxを選択して尋ねられます。Uが更新され、この決定木は、正しい結果を見つけるために必要な質問の数を最小限にするために再バランスする必要があります。もう1つの考えは、n次元のブール「オクトリー」(nは一意の成分の数)のようなものでUを表すことです。 「これらの成分でどんなレシピが作れるの?」クックブック内の(必要な成分のセット)レシピのデカルト積を、ある成分のパワーセットで取得し、両方の要素が等しいペアの結果として順序付けられたペアをフィルタリングすることで応答できますが、これは効率的な解決策、そして私が求めているのは、この種の操作を最適化する方法です。効率的になるようにSQLでこれをどのように構成し、これを効率的にするためにSQLで何ができるのでしょうか。 私はレシピと食材のセットのクックブックのイラストを使用していますが、「レシピ」の数と「食材」の数は非常に多くなると予想します(それぞれ数十万まで)。ただし、食材の数は特定のレシピでは、特定の材料セットの材料の数は比較的少なくなります(通常、「レシピ」の場合は約10-50、一般的な「材料セット」の場合は約100)。さらに、最も一般的な操作はクエリs(U、Q)であるため、最も最適なはずです。これはまた、すべてのレシピをチェックしたり、すべての材料を操作したりする必要があるブルートフォースアルゴリズムは、それだけでは望ましくないほど遅くなることを意味します。巧妙なキャッシングで、

6
リンクされた値が常に合計100%であるXパーセントスライダーを表示するUIのアルゴリズム
私が構築しているシステムには、0〜100のスケールを持つ一連のUIスライダー(数値は異なります)が含まれています。スライダーとは、ボリュームコントロールのように、要素をつかんで上下にドラッグするUIを意味します。それらは常に合計100になるようにアルゴリズムで接続されています。そのため、1つのスライダーが上に移動すると、他のスライダーはすべて下に移動し、最終的にゼロになります。1つが下に移動すると、他は上に移動します。常に合計は100でなければなりません。したがって、ここのスライダーにはさまざまな値がありますが、合計は100%です。 ----O------ 40 O---------- 0 --O-------- 20 --O-------- 20 --O-------- 20 最初のスライダーが40から70に上に移動した場合、他のスライダーは値を下に移動する必要があります(スライダーをドラッグするときに)。3つのスライダーは20から10に変更され、1つは低くできないためゼロのままでした。 -------O--- 70 O---------- 0 -O--------- 10 -O--------- 10 -O--------- 10 もちろん、スライダーが0または100に達すると、それ以上移動できなくなります。これは、私の頭が実際に痛むところです。したがって、スライダーが高くなると、他のスライダーは低くなりますが、スライダーのいずれかがゼロに達すると、まだゼロに達していない残りのスライダーだけが低く移動できます。 この質問は実装ではなくアルゴリズムに固有なので、ここで私はこれを尋ねています。FWIWプラットフォームはAndroid Javaですが、特に関係はありません。 最初の刺し傷で行ったアプローチは、移動したスライダーの変化率を計算することでした。次に、その変更を分割し、それを(他の方向に)他のスライダーの値に適用しました。ただし、問題は、パーセンテージと乗算を使用することにより、いずれかのスライダーがゼロになった場合、ゼロから再び増加させることはできないということです。その結果、個々のスライダーがゼロで動かなくなります。丸めの問題を回避するために0〜1,000,000の範囲のスライダーを使用しましたが、これは役立つようですが、すべてのシナリオを適切に処理するアルゴリズムをまだ作成していません。
11 algorithms  gui  ui 

3
ハッシュの聖書とは何ですか?
ハッシュとハッシュに関するコーメンのような参照はありますか?この特定の構造は、何らかの理由で私のCS教育ではほとんど注目されていませんが、どこにでもあるように見えるので、もっと学びたいと思います。私はコーメンがそれをカバーしていることを知っていますが、もっと専門的で詳細なものを探しています。

4
再帰を使用して問題を解決できるかどうかを判断するための考慮事項は何ですか?
インタビューでは、再帰を使用して問題を解決したり(1無限精度の整数に追加するなど)、問題が再帰を使用するのに適している場合があります。時には、問題解決のために再帰を頻繁に使用することが原因である可能性があるため、あまり考えずに、再帰を使用して問題を解決します。 しかし、問題を解決するために再帰を使用することが適切であると判断する前の考慮事項は何ですか? 私が持っていたいくつかの考え: 毎回半分にされるデータに対して再帰を使用すると、再帰を使用しても問題ないように思えます。16GBのRAMまたは8TBのハードドライブに収まるデータはすべて、42レベルの深さの再帰で処理できるためです。(したがって、スタックオーバーフローはありません(一部の環境では、スタックの深さは4000レベル、42を超える可能性がありますが、同時に、各コールスタックがより多くのメモリを占有するため、ローカル変数の数にも依存します多数のローカル変数があり、スタックオーバーフローを決定するのはレベルではなくメモリサイズです)。 純粋な再帰を使用してフィボナッチ数を計算する場合、中間結果をキャッシュしない限り、時間の複雑さを本当に心配する必要があります。 そして1、無限精度の整数に追加するのはどうですか?議論の余地があるかもしれませんが、3000桁または4000桁の数字を扱うので、スタックオーバーフローが発生する可能性がありますか?私はそれを考えていませんでしたが、おそらく答えはノーです、再帰を使用するべきではありませんが、単純なループを使用する必要があります数が素数であるかどうかなど、数のプロパティ。 最終的な質問は、問題を解決するために再帰を使用することを決定する前に考慮すべきことは何ですか?

8
どのようなアルゴリズムにセットが必要ですか?
私の最初のプログラミングコースでは、何かの重複を削除するなどの必要があるときは常にセットを使用するように言われました。例:ベクトルからすべての重複を削除するには、上記のベクトルを反復処理して各要素をセットに追加すると、一意のオカレンスが残ります。ただし、各elementoを別のベクトルに追加し、要素が既に存在するかどうかを確認することで、これを行うこともできます。使用する言語によってパフォーマンスが異なると思います。しかし、それ以外のセットを使用する理由はありますか? 基本的に、どのような種類のアルゴリズムがセットを必要とし、他の種類のコンテナでは実行すべきではないのですか?

3
アルゴリズム問題へのTDDのようなアプローチ
より良い解決策を見つけようとしたので、私はCodi​​lityのアルゴリズムテストに失敗し、結局何もありませんでした。 では、TDDに似たアプローチを使用できるかどうかを考えさせられました。つまり、通常は同様の方法で徐々にソリューションを開発できるか? ソートアルゴリズムを作成している場合、標準のBubblesortから2ウェイのバブルソートに移行できますが、Quicksortのようなより高度なものは「飛躍的進歩」ですが、少なくとも簡単に検証できるテストデータがあります。 そのようなテストのための他のヒント?次回私がすることの1つは、内部ループよりも多くのメソッド/関数を使用することです。たとえば、ソートではスワップが必要になることがよくあります。メソッドの場合、呼び出しコードを変更するだけで済みます。派生クラスとして、より高度なソリューションを用意することもできます。 「アルゴリズム」と「通常」の問題では、時間の複雑さが重要な問題を意味します。そのため、TDDのようにテストに合格する代わりに、「動作が向上する」ようにします。 「TDDに似ている」とは、 手動テストの時間を節約するために、比較的自動のテストを作成します。 インクリメンタル開発。 回帰テスト、コードが壊れているかどうか、または機能がインクリメント間で変化したかどうかを検出する機能。 比較するとわかりやすいと思います シェルソートを直接書く バブルソートからクイックソートへのジャンプ(合計書き換え) 一方向のバブルソートからシェルソートに段階的に移動します(可能な場合)。

2
カバレッジ-アルゴリズムの欠陥-その使用を取り除く方法は?
前書き メインラインのベクターグラフィックスレンダリングエンジンの多くには、アルゴリズム上の欠陥があります。これらは、各シェイプを個別にレンダリングし、ピクセルカバレッジを計算してアンチエイリアスを作成してから、それらを重ね合わせます。はい、それは簡単ですが、正しい解決策はさらに簡単です。 これは、透明度によってカバレッジを膨らませるので、融合の問題につながります。アルファブレンディングは、状況を正確に表さないルールに従います。たとえば、50%カバーされているピクセルが、50%補完カバーされているピクセルに隣接している場合、100%のカバレッジではなく、75%のカバレッジになります。 。これがどのように見えるかは、アルゴリズムの調整方法やその他の詳細によって異なりますが、本質的にはこれは既知のエラーです。誰かが、さまざまなエンジンエラーを文書化し、それをどのように改善できるかを示す論文を書くという困難を乗り越えました。 画像1:完全に代表的ではないサンプル。上の行に拡大されたエラーを示す三角形でできた形状をレンダリングしたサンプル。SVGソース この問題には、単純な単純な解*があり、カバレッジ計算を行わずにスーパーサンプルを使用して、画像をフィルターで絞り込みます。おまけとして、ボックスフィルタリングよりも優れた画像再構成アルゴリズムを使用できます(「ピクセルは正方形ではありません3」を参照)。現在のソリューションと同等の速度を持つソリューションもあり、これらのソリューションはハードウェアラスタライゼーションパイプラインで実行する方がはるかに簡単です(この問題を回避するために構築されているため、GPUでこのエラーが表示されることはほとんどありません)。 これもコストがかからない問題ではありません。グラフィックデザインに携わっている多くの人が、この問題を手動で回避するために重要な時間を費やして、ここでオーバーラップがあり、オーバーラップがないことを確認して、コンピューターがそれらの問題を修正するようにします。そして多くの場合見事に失敗します。しかし、クライアントはなぜエラーがそこにあるのか気にせず、修正する必要があります。 質問 エラーはどのように伝播しますか?それらはすべて同じエラーを実行しているため、アルゴリズムに同じソースを使用していると結論付けることができます。デザイナーがこのアルゴリズムを選択した原因は何でしょうか?3Dプログラマーだけがこのエラーを認識し、2Dプログラマーが認識しなかったのに、APIと教育でその部分を成文化したのはなぜですか? このエラーがそれ以上伝播しないようにする方法を教えてください。 補遺(これについては質問していません) *どうやら、スーパーサンプリングは問題なく機能するという私の主張は並外れており、並外れた証明が必要です。スーパーサンプリングが機能するための鍵は、スーパーサンプリングがカバレッジ処理を行わないことです。本質的に、スーパーサンプラーは各サンプルをポイントサンプルとして扱います。ポイントサンプルは、基になる領域を想定していないため、アルファ比較が発生しない場所では発生しません。 答えの1つで説明されているように、それが一貫して機能するために。一貫性を保つために、サンプルを整数サンプリングで処理する必要があります。これにより、一度スクリーンスペースに変換された各ポイントが、等しい座標に対してまったく同じソリューションを取得し、サンプルがピクセル境界によって2回シェーディングされないことが保証されます。これを行うには、サンプルが左下のサンプルである場合、サンプルがピクセルをトリガーしない可能性があります(したがって、正確なエッジは> vs <=で処理されるというルールを作成します)。1つを除くすべてのコンソールグラフィックカードは、このように機能します。これにより、余分なデータをキャッシュしたり、近くで追加のテストを行ったりする必要がなくなります。このソリューションは、カバレッジベースのソリューションよりも安定しており、より一般的で一貫しています。 アルゴリズムは元のコードとまったく同じで、コードが少し少なく、サンプルが少し多くなっています。したがって、カバレッジベースのアルゴリズムと同じかそれ以上ではありません。これは、グラフィックスカードだけでなく、他のほぼすべての信号処理分野で古くからこのような方法を使用してきたためです。 この方法には欠点がありますか?まあ、単純な仮定をすると、少し遅くなります。理論的には、カバレッジラスタライザよりも速い漸近的な振る舞いをします。レイトレーサーのように、典型的なシーンではまだ同等です。また、畳み込みベースのエフェクトの使用を実装するのがより困難になる可能性があります。

3
対称性の下で一意であるnxnxn立方格子のm点のすべてのセットを生成するアルゴリズム
非常に計算が複雑になるアルゴリズムを実装しています。不要な作業を行わないようにしたいと考えています。 nxnxnの立方格子があります。たとえば、n = 2の場合、これは(0,0,0)、(0,1,0)、(1,0,0)、(1,1,0)、(0、 1,1)、(0,0,1)、(1,0,1)、(1,1,1)。 このラティスから、次のようなmポイントのすべてのセットを再帰的に生成します。 solve(set_of_points) { if set_of_points.size = m, finish do some useful computation here for each point in lattice not in set_of_points: solve(set_of_points + new_point); } これは、空のset_of_pointsから開始して呼び出すことができます。 問題の性質上、実際にはm個の点のすべての順列が必要なわけではなく、立方体の自然な対称性の下で一意であるものだけが必要です。 たとえば、2x2x2の立方体を取り、1点のすべてのセットが必要だとします。上記の基本的なアルゴリズムの下では、1つのポイントの8つの異なるセットがあります。 ただし、立方体の対称性を使用すると、元の8はすべて立方体の対称性の下で同等であるため、これを1ポイントの一意の1セットに減らすことができます(この場合、それらはすべて「コーナー」です)。 立方体が2x2x2でm = 2の場合、基本アルゴリズムには28セットありますが、これは対称性の下では3に減少します(例{(0,0,0)、(1,0,0)}、{(0 、0,0)、(1,1,0)}、{(0,0,0)、(1,1,1)}) 明らかに、3つのポイントセットで計算を行う方が28よりもはるかに優れているので、私の質問は、すでに生成されたセットと対称的に等しいポイントのセットを生成しないようにするにはどうすればよいですか?または、これが不可能な場合は、少なくともセットの数を少し減らすにはどうすればよいですか。 (注-m = 1の場合、これは比較的簡単です。他のどの頂点よりも(0,0,0)に近い点を選択し、境界を少しぼかします。m> 1の場合、本当の問題になる)

2
クイックソートの悪い例は何ですか?
私はクイックソートについて学習しており、クイックソートが困難なさまざまな配列を例示したいと思います。私が念頭に置いているクイックソートには、初期ランダムシャッフルはなく、2つのパーティションがあり、中央値を計算しません。 これまでに3つの例を考えました。 [1,2,3,4,5,6,7,8,9,10] - when the array is sorted [10,9,8,7,6,5,4,3,2,1] - when the array is reversed [1,1,1,1,1,1,1,1,1,1] - when the array is the same values [1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys たとえば、これについてはよくわかりません。 [1,3,5,7,9,10,8,6,4,2] では、クイックソートが(ほぼ)理想的である配列と比較して困難な配列は何でしょうか?

5
2 ^ i * 5 ^ jから次に小さいものを印刷します。ここで、i、j> = 0
最近、電話によるテクニカルスクリーニングでこの質問を受けましたが、うまくいきませんでした。質問は以下に逐語的に含まれています。 {2^i * 5^j | i,j >= 0}ソートされたコレクションを生成します。次の最小値を継続的に印刷します。 例: { 1, 2, 4, 5, 8, 10...} 「次の最小」は、最小ヒープが関係していると思いますが、そこからどこに行くべきか本当にわかりませんでしたし、インタビュアーからの援助もありませんでした。 誰かがそのような問題を解決する方法についてアドバイスを持っていますか?
10 algorithms 

2
カウントダウン番号の名前の丸め問題-およびアルゴリズムによる解決策?
オーディエンスの非Britsの場合、昼間のゲーム番組のセグメントがあり、そこでは、競技者が6つの数字のセットとランダムに生成されたターゲットの数字を持っています。それらは、算術演算子のみを使用して6つの数値のいずれか(必ずしもすべてではない)を使用して目標数に到達する必要があります。すべての計算は正の整数になる必要があります。 例:Youtube:カウントダウン-これまでで最も異常な数字ゲーム? ウィキペディアに詳細な説明があります:カウントダウン(ゲームショー) 例えば: 応募者は6つの数字を選択します。2つの大きな数字(可能性には25、50、75、100が含まれます)と4つの小さな数字(数字1 .. 10、それぞれプールに2回含まれます)です。 ピック数がされている75、50、2、3、8、7の目標数で与えられます812。 1回の試行は、(75 + 50-8)* 7-(3 * 2)= 813(これは、ターゲットの5以内のソリューションに対して7ポイントを獲得します) 正確な答えは、(50 + 8)* 7 * 2 = 812です(これは、ターゲットと正確に一致する10ポイントを獲得したことになります)。 明らかに、この問題はテレビが登場する前から存在していましたが、ウィキペディアの記事ではそれに名前を付けていません。私が通っていた小学校でも、このゲームがクラス間競技として「Crypto」と呼ばれていたのを見たことがありますが、検索しても何もわかりません。 私はそれに数回参加し、私の父は、ブルートフォースに問題を試みたExcelスプレッドシートを書いて、私は(それが唯一のこと、それが働いたか覚えていませんしませんでしたどのようなExcelの65535行の制限で、仕事)が、確かに問題のアルゴリズム的な解決策がなければなりません。人間の認識と同じように機能する解決策があるかもしれません(たとえば、並列で数値を「十分に近い」数で見つけ、候補を取得して「小さい」演算を実行する)。

1
2つの文字列に一致しますが、ある程度のエラーを許容します
どうすれば2つの文字列を一致させることができますが、同時にX文字の文字が一致しない場合があります。エラー数は制御可能な変数である必要があります。 X個の文字が文字列内で一致することはできませんが、シーケンス内で実行される文字数には制限があります。2つの文字列が与えられた場合、5文字が異なることを許可する可能性がありますが、連続して2文字を超えることはできません。 私はこれらの2つの文字列を比較するための推奨アルゴリズムを探しています。または、これに対する既知の解決策がすでにあるかもしれません。

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