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

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズム設計に関連している場合に使用します。


30
C ++:数値の最も近い倍数に切り上げる
OK-これは基本的な質問のように思われるため、ここに投稿するのはほとんど恥ずかしいです(そして、誰かが投票に投票した場合は削除します)。 これはC ++で数値の倍数に切り上げる正しい方法ですか? 私はこれに関連する他の質問があることを知っていますが、C ++でこれを行うための最良の方法は何かを知ることに特に興味があります。 int roundUp(int numToRound, int multiple) { if(multiple == 0) { return numToRound; } int roundDown = ( (int) (numToRound) / multiple) * multiple; int roundUp = roundDown + multiple; int roundCalc = roundUp; return (roundCalc); } 更新:申し訳ありませんが、私はおそらく意図を明確にしませんでした。ここではいくつかの例を示します。 roundUp(7, 100) //return 100 roundUp(117, 100) //return 200 …
168 c++  algorithm  rounding 

18
最速の部分文字列検索アルゴリズムは何ですか?
わかりました、それで私は馬鹿のように聞こえません私は問題/要件をより明確に述べるつもりです: Needle(パターン)とhaystack(検索するテキスト)はどちらもCスタイルのヌル終了文字列です。長さ情報は提供されません。必要に応じて、計算する必要があります。 関数は、最初の一致へのポインタを返すNULLか、一致が見つからない場合に返す必要があります。 失敗した場合は許可されません。これは、非定数(または大きな定数)のストレージ要件を持つアルゴリズムでは、割り当ての失敗に対するフォールバックケースが必要になることを意味します(フォールバックケアのパフォーマンスは、最悪の場合のパフォーマンスに影響します)。 実装はCで行う必要がありますが、コードなしでアルゴリズム(またはそのようなものへのリンク)を適切に記述してもかまいません。 ...そして「最速」とはどういう意味か: 決定論的なO(n)場所n=干し草の長さ。(しかしO(nm)、より堅牢なアルゴリズムと組み合わせて確定的なO(n)結果を得る場合、通常はローリングハッシュなどのアルゴリズムからのアイデアを使用することが可能です)。 if (!needle[1])特に最も一般的なケースである可能性が高い非常に短い針では、素朴なブルートフォースアルゴリズムよりもパフォーマンスが低下する(ある程度測定できる;数クロックなどで問題ない)。(無条件に重い前処理のオーバーヘッドは悪く、針の可能性を犠牲にして病理学的針の線形係数を改善しようとしています。) 任意の針と干し草を考えると、他の広く実装されているアルゴリズムと比較して、同等またはそれ以上のパフォーマンス(検索時間が50%以上長くなります)。 これらの条件は別として、私は「最速」の定義をオープンエンドのままにしておきます。良い答えは、「最速」を提案しているアプローチを検討する理由を説明する必要があります。 私の現在の実装は、glibcのTwo-Wayの実装よりも(入力に応じて)約10%遅く、8倍速く実行されます。 更新:現在の最適なアルゴリズムは次のとおりです。 長さが1の針には、を使用しますstrchr。 長さが2〜4の針の場合、マシンワードを使用して、次のように2〜4バイトを一度に比較します。16ビットまたは32ビットの整数に針をビットシフトでプリロードし、各反復で干し草の山から古いバイトアウト/新しいバイトを循環させます。 。干し草の各バイトは1回だけ読み取られ、0(文字列の終わり)に対するチェックと1つの16ビットまたは32ビットの比較が行われます。 長さが4より大きい針の場合は、ウィンドウの最後のバイトにのみ適用される不良なシフトテーブル(Boyer-Mooreなど)を使用した双方向アルゴリズムを使用します。1 kbテーブルを初期化するオーバーヘッド(多くの中程度の長さの針の正味の損失になる)を回避するために、シフトテーブルのどのエントリが初期化されるかを示すビット配列(32バイト)を保持します。未設定のビットは、針に表示されることのないバイト値に対応します。針の全長シフトが可能です。 私の頭に残っている大きな質問は次のとおりです。 悪いシフトテーブルをより有効に活用する方法はありますか?Boyer-Mooreは、逆方向(右から左)にスキャンすることでそれを最大限に活用しますが、双方向には左から右へのスキャンが必要です。 一般的なケース(メモリ不足や2次のパフォーマンス条件はない)で見つかった実行可能な候補アルゴリズムは、順序付きアルファベットでの双方向および文字列マッチングの2つだけです。しかし、異なるアルゴリズムが最適である、簡単に検出できるケースはありますか?確かに、O(m)(m針の長さである)空間アルゴリズムの多くは、m<100そのために使用できます。線形時間のみを必要とする可能性がある針の簡単なテストがある場合は、最悪の2次アルゴリズムであるアルゴリズムを使用することもできます。 ボーナスポイント: 針と干し草の両方が整形式のUTF-8であると想定して、パフォーマンスを向上させることができますか?(バイト長が異なる文字では、整形式であることにより、needleとhaystackの間に文字列の整列要件が課せられ、不一致のヘッドバイトが検出されたときに自動的に2-4バイトのシフトが可能になります。最大の接尾辞の計算、適切な接尾辞のシフトなどにより、すでにさまざまなアルゴリズムが提供されていますか?) 注:私はそこにあるほとんどのアルゴリズムをよく知っていますが、実際のパフォーマンスはそうではありません。ここに良い参照がありますので、人々は私にコメント/回答としてアルゴリズムに関する参照を与え続けません:http : //www-igm.univ-mlv.fr/~lecroq/string/index.html
165 c  algorithm  string  substring 

5
差分アルゴリズム?[閉まっている]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 私は、効果的で効率的なdiffアルゴリズムの説明に夢中になっています。 私が得た最も近いのは、RFC 3284へのリンク(Eric Sinkのいくつかのブログ投稿から)です。これは、diffの結果が格納されるデータ形式を完全に理解できる用語で説明しています。ただし、diffを実行しているときにプログラムがこれらの結果に到達する方法については、まったく触れられていません。 私はこれを個人的な好奇心から研究しようとしています。これは、diffアルゴリズムを実装するときにトレードオフがあるはずだと確信しているからです。その代わりに?」... VCDIFFを出力することになる効率的なアルゴリズムの説明はどこにありますか? ちなみに、SourceGearのDiffMergeで使用されている実際のアルゴリズムの説明を見つけた場合は、さらに良いでしょう。 注:最も長い共通のサブシーケンスは、VCDIFFで使用されるアルゴリズムではないようです。使用するデータ形式を考えると、よりスマートな処理をしているように見えます。
164 algorithm  diff  vcdiff 

21
ディズニーのFastPassは有効または有用なキュー理論です
ディズニーワールドでは、彼らはファストパスと呼ばれるシステムを使用して、人気のある乗り物の2番目の短いラインを作成します。アイデアは、通常は1時間を超える待機で標準回線で待機するか、指定した時間ブロック(通常は数時間後)に戻って10だけ待機するFastPassを取得できるというものです。分以下。FastPassを使用すると、一度に1つの乗り物だけを「待機」することができます。 私はこの概念の背後にあるキューの理論を理解しようと努めてきましたが、私が見つけた唯一の説明は、それが人々を行列から外し、追加の収益をもたらすもの(ショッピング、食事など)を行うように設計されているということです。 これがFastPassが実装された理由ですか、それともそれが解決する実際のビジター効率の問題がありますか?同様のロジックを適用したソフトウェアアプリケーションはありますか?同様のロジックを適用する必要があるソフトウェアアプリケーションはありますか? ソフトウェアで同様のものを実装するときに発生する問題の1つは、ユーザーがキューを選択することに基づいていることです。ソフトウェアの待機サイクルを高速化します。この理論を適切に適用するには、エンドユーザーの選択を必要とせずに、ニーズに基づいてユーザーを配置するキューを知るのに十分なほどスマートである必要があります。

12
RandomとOrderByは良いシャッフルアルゴリズムを使用していますか?
Coding Horrorでさまざまなシャッフルアルゴリズムについての記事を読みました。私はどこかでリストをシャッフルするためにこれを行ったのを見ました: var r = new Random(); var shuffled = ordered.OrderBy(x => r.Next()); これは良いシャッフルアルゴリズムですか?それはどのように正確に機能しますか?これを行うのに受け入れられる方法ですか?
164 c#  algorithm  shuffle 

14
高次元データの最近傍?
私は数日前に、与えられたベクトルの最近傍を見つける方法について質問しました。私のベクトルは21次元になりました。先に進む前に、私は機械学習や数学のドメインからではないため、いくつかの基本的な質問を自問し始めています。 ユークリッド距離は、そもそも最近傍を見つけるための良い測定基準ですか?そうでない場合、私の選択肢は何ですか? さらに、k近傍を決定するための適切なしきい値をどのように決定するのでしょうか。この値を把握するために実行できる分析はありますか? 以前は、kd-Treesを使用するよう提案されましたが、Wikipediaのページでは、高次元の場合、kd-Treeはブルートフォース検索とほぼ同等であると明確に述べています。その場合、100万点のデータセットで最近傍を効率的に見つけるための最良の方法は何ですか? 誰かが上記の質問のいくつか(またはすべて)を明確にしていただけますか?

2
161803398は「特別な」番号ですか?Math.Random()の内部
答えは「数学のため」ではないかと思いますが、誰かが基本的なレベルでもう少し洞察を与えてくれることを望んでいました... 今日は、BCLソースコードをざっと見て、以前に使用したクラスの一部が実際にどのように実装されているかを確認しました。(疑似)乱数を生成する方法についてこれまで考えたことがないので、どうやってそれを行うかを確認することにしました。 ここで完全なソース:http : //referencesource.microsoft.com/#mscorlib/system/random.cs#29 private const int MSEED = 161803398; このMSEED値は、Random()クラスがシードされるたびに使用されます。 とにかく、私はこの「マジックナンバー」-161803398-を見ました、そして私はそのナンバーが選ばれた理由について最も曖昧な考えを持っていません。これは素数でも2の累乗でもありません。より重要であるように見える数の「中間」ではありません。私はそれを2進数と16進数で見て、まあ、それは私には数のように見えました。 Googleで番号を検索してみましたが、何も見つかりませんでした。
162 c#  .net  algorithm  random 

9
リストがどのようにソートされているかを測定する方法はありますか?
リストがどのようにソートされているかを測定する方法はありますか? つまり、リストが並べ替えられているかどうか(ブール値)を知ることではなく、「並べ替え」の比率のようなもの、統計における相関係数のようなものです。 例えば、 リストのアイテムが昇順の場合、そのレートは1.0になります。 リストが降順でソートされている場合、そのレートは-1.0になります リストがほとんど昇順でソートされている場合、そのレートは0.9または1に近い値になります。 リストがまったくソートされていない場合(ランダム)、そのレートは0に近い 練習のために、Scalaの小さなライブラリーを作成しています。ソート率は役に立つと思いますが、そのようなことについての情報は見つかりません。たぶん、コンセプトの適切な用語がわかりません。


21
サイクルリンクリストでサイクル開始ノードを見つける方法について説明してください。
亀と野ウサギの会議はループの存在を終了することを理解していますが、ウサギを会議場所に置いたまま、リンクされたリストの先頭に亀を移動し、次に両方を1ステップずつ移動して、サイクルの開始点で会うにはどうすればよいですか?


30
2つのソートされた配列をソートされた配列にマージする方法は?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 2年前休業。 この質問を改善する これはインタビューで私に尋ねられました、そしてこれは私が提供した解決策です: public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = 0, j = 0, k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) { answer[k] = a[i]; i++; } else …

12
ネストされたJSONオブジェクトをフラット化/非フラット化する最速の方法
複雑な/ネストされたJSONオブジェクトを平坦化および非平坦化するために、いくつかのコードを一緒に投げました。動作しますが、少し遅いです(「長いスクリプト」の警告が表示されます)。 平坦化された名前には、「。」が必要です。区切り文字および配列の[INDEX]として。 例: un-flattened | flattened --------------------------- {foo:{bar:false}} => {"foo.bar":false} {a:[{b:["c","d"]}]} => {"a[0].b[0]":"c","a[0].b[1]":"d"} [1,[2,[3,4],5],6] => {"[0]":1,"[1].[0]":2,"[1].[1].[0]":3,"[1].[1].[1]":4,"[1].[2]":5,"[2]":6} 私のユースケースをシミュレートするベンチマークを作成しましたhttp://jsfiddle.net/WSzec/ ネストされたJSONオブジェクトを取得する 平らにする 全体を確認し、平坦化中に変更する可能性があります 元のネストされた形式に戻し、出荷します。 より高速なコードが欲しい:明確にするために、JSFiddleベンチマーク(http://jsfiddle.net/WSzec/)をIE 9 +、FF 24+、およびChrome 29で大幅に高速化(〜20%+がいい)するコード+。 関連するJavaScriptコードは次のとおりです:現在の最速:http : //jsfiddle.net/WSzec/6/ JSON.unflatten = function(data) { "use strict"; if (Object(data) !== data || Array.isArray(data)) return data; var result = {}, cur, prop, idx, …

28
文字列/整数のすべての順列を一覧表示する
インタビューのプログラミングにおける一般的なタスク(私のインタビューの経験からではありません)は、文字列または整数を取り、可能なすべての順列をリストすることです。 これがどのように行われるか、そしてそのような問題を解決する背後にある論理の例はありますか? 私はいくつかのコードスニペットを見ましたが、それらは十分にコメント/説明されておらず、従って追跡するのが困難です。

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