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

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

5
アルゴリズムの「エッジ」ケースをどのように識別しますか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 基本的に、最悪または最良のケースである可能性のあるもの、およびそれらを取得する前に発生する可能性のある他の「エッジ」ケースをどのようにして見つけるのですか?

3
カレンダー/計画アルゴリズム
問題に直面しているので、どのようにアプローチしたらよいかわかりません。従業員のカレンダーを作成する必要があります。各従業員には特定の仕事上の制約があります(個人的なもの、一般的なもの) 私が取り組んでいるもの: 医者がいます 各医師は週5日勤務する必要があります。 各医師は週に1晩働く必要があります 各医師は、他の医師と比較して(または可能な限り近く)夜同じ時間働く必要があります。 各医師は、他の医師と同等の(または可能な限り近い)木曜日の夜と日曜日の夜に同量の仕事をしなければなりません。 一部の医師は特定の日/夜に作業できない(ユーザーによる入力) 一部の医師は、特定の日/夜に作業したい(ユーザーによる入力) 一部の医師は、特定の日/夜に仕事をしたくない(ユーザーによる入力) 問題のユーザーはカレンダーを扱っている人です。すべての制約に従うカレンダーを自動的に生成するソリューションを構築しようとしています。解決策は、各医師に「医師を追加」と「制約を追加」を入力し、次に「カレンダーを生成」ボタンを入力するだけの大きな設定です。それはユーザーにとって本当に基本的なものです。 私の問題 : 実際の計画をどのように生成するかわからない。ニューラルネットワークや遺伝的アルゴリズムなどについて読んでいるが、それらはすべて正しい解決策のように思えるが、実際にはそうではない。 GAを見ると、与えられた母集団(私の問題)の解を見つけるように作られていますが、開始母集団は与えられた制約のセットに既に従わなければなりません。その場合、私の最初の人口はすでに解決策です。「最適化」する必要はありません。1人の人が月曜日の3晩連続して働くことは問題ではありません。実際に正しい場合、他の人が同じ量で働く場合は、他の人もある時点で月曜日の3日間働くことは問題ありません。私の問題はすでにGAの開始点で解決されているので、GAは私にとって「高度」であると思うようになります。 しかし、再び、GAは本当にこれのために作られたように見えるので、私はそれを正しく理解していないかもしれませんか? とにかく、GA(またはニューラルネットワークなど)を使用したことはないので、そのような学習曲線を作成する前に、正しいアプローチを選択してください。 私の質問 : 私のような問題に対する良いアプローチ/アルゴリズム/テクニックは何だと思いますか?ガス?ニューラルネットワーク?まったく違う何か? 私はすべての耳であり、必要に応じて詳細を開いていますが、私は自分自身をかなり明確にしたと思います:)

2
最小数の比較で2つのソートされた配列をマージするアルゴリズム
サイズnおよびmのタイプTの 2つのソートされた配列a、bが与えられます。2つの配列を(最大サイズn + mの)新しい配列にマージするアルゴリズムを探しています。 安価な比較操作がある場合、これは非常に簡単です。1つまたは両方の配列が完全に走査されるまで、最初の要素が最も低い配列から取り出し、残りの要素を追加します。このようなもの/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array ただし、2つの要素を比較すると、ソース配列からターゲット配列に要素をコピーするよりもはるかに高価な場合、状況は変わります。たとえば、大きな任意精度の整数または文字列の配列があり、比較が非常に高価になる場合があります。配列の作成と要素のコピーは無料で、コストがかかるのは要素を比較することだけだと考えてください。 この場合、要素比較の最小数で 2つの配列をマージします。以下に、単純なマージアルゴリズムよりもはるかに優れた機能を発揮できるいくつかの例を示します。 a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] または a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 次のように、単純なマージアルゴリズムが最適になる場合があります。 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] したがって、アルゴリズムは、配列がインターリーブされている場合、または少なくとも大幅に悪化していない場合に、理想的には正常に低下し、最大n + m-1回の比較を実行する必要があります。 サイズの違いが大きいリストに対しては、バイナリ検索を使用して、小さな配列の要素を大きな配列に挿入することで、かなりうまくいくはずです。しかし、両方のリストが同じサイズでインターリーブされている場合、それは適切に低下しません。 要素で利用できるのは(合計)順序関数のみであるため、比較を安価にするスキームは不可能です。 何か案は? 私はScalaでこのビットを思いつきました。比較の数に関しては最適であると思いますが、それを証明する能力を超えています。少なくとも、私が文献で見つけたものよりもずっと簡単です。 そして、最初の投稿以来、これがどのように機能するかについてのブログ投稿を書きました。

3
アイテムの配送用の3Dパッキングアルゴリズム
可能な限り少ない箱に商品を収納するための最良の方法を提案する配送見積もりを作成するタスクを受け取りました。 既知の長方形のボックスサイズには有限のセットがあります 箱の中に詰められる多くの任意の長方形のアイテムがあります 少ないボックスが最適に使用されるべきです。2つの箱1x1x1を出荷するのは、1つの箱1x2x1よりもはるかに高価だからです。ここが優先事項です。 また、第2レベルの優先度として、できるだけ小さなボックスを使用するように最適化する必要があります。(例:1つの大きな箱と2つの小さな箱から選択できる場合、大きな箱を選択する必要があります) アイテムはボックスに収まるように回転できますが、回転は少なくとも45°の増分に制限する必要があります(私の研究では、一部の構成では、より大きな四角形のボックス内に四角形のボックスをより適切に収めることができるようです) 、90°回転であることが標準です。 ボックスには重量制限があり、アイテムには任意の重量があります(例:サイズが1x1x1のアイテムは、他の2x2x2アイテムよりも重いことがあります) 私は少し調べて、ビンのパッキングとナップザックの問題に関するいくつかの抽象化アルゴリズムを見つけましたが、次のやや強引なバリエーションがあり、最適なアルゴリズムに似ています。 「梱包するアイテム」リストで、アイテムを減少したボリューム順(大きい方)に並べ替えます このリストの各アイテムについて: 「使用済みボックス」リストにある小さなアイテムを選択し、アイテムに合うのに十分な残りの容量と重量の制限があります(寸法と重量を合わせるためにここでフィットを使用します) そのようなボックスがない場合、可能なボックスサイズの既知のセットから新しいアイテムを作成します。これは、アイテムの寸法と重量に適合する最小サイズで、「使用済みボックス」のリストに追加します。 ボックスがアイテムにフィットする場合(以下のフィット関数を使用)、「このボックスのアイテム」のリストに追加し、「フィットするアイテム」リストから削除して、ボックス内の相対的な3D位置をマークします。 「梱包するアイテム」リストに適合するアイテムがなくなるまで、2.1から繰り返します。 上記の手順2で使用されるフィッティングチェック関数: ボックスの残りのボリュームがアイテムのボリュームに収まるかどうかを確認します。そうでない場合は、falseを返します。 「箱のアイテム」の重量と現在のアイテムの重量の合計が箱の重量制限以下かどうかを確認します。そうでない場合は、falseを返します。 「ボックスのアイテム」リストをチェックして、Yコンポーネントが最小で、アイテムの幅、奥行き、高さに十分なスペースがある最初のボックス座標を選択します。 アイテムが現在の向きに収まらない場合は、単純化のために45°の回転を想定せずに、6つの可能な回転のいずれかで回転します。(すでにテストされているサイズをスキップできる回転。例えば、ボックスを180°回転させると、すべてのボックスとアイテムが反対面で同じサイズになるためスキップできるため、元の位置と同じ寸法になります。) アイテムがすべての可能な方法で元の方向に戻されていない場合は、手順3からやり直してください。 すべての回転が試行され、フィットが見つからなかった場合、現在の座標を利用できないスペースと見なします。 使用可能なスペースがない場合は、falseを返します。そうでない場合は、ステップ3から再試行してください。 提示された制約が与えられた場合、私の問題に対する最善の解決策があるかどうかを知りたいです。 これは理論上はうまくいくようですが、コードでは試していません。私は正しい方向に進んでいるか、これを行うより良い、パフォーマンスの良い方法があるかどうかを知りたいです。 参照は素晴らしいでしょう。 編集: 必要なことを行う興味深いサードパーティAPIをいくつか見つけましたが、これは切断する必要があるため、これらにアクセスすることはできません。 以下に例を示します。 http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 編集2: 解決すべき問題の実例は次のとおりです。 私は4つのボックスサイズWxHxDを持っています:10x12x18、12x16x24、16x20x30、24x32x40 私はサイズが6x8x10、2x 22x14x30、1x 22x4x20の4つのアイテムを注文しています このアイテムを可能な限り少ないボックスを使用して、可能な限り小さいボックスを使用し、可能な限り少ない空きスペースを残して、1つ以上のサイズの任意の量のボックスに収めるにはどうすればよいですか?


3
双方向同期の競合解決
接続が常に利用可能ではないことを前提として、「メイン」データベースサーバーと多くの「セカンダリ」サーバー間の双方向同期、特に競合解決をどのように管理しますか? たとえば、iOSでCoreDataを「データベース」として使用するモバイルアプリがあり、ユーザーがインターネットに接続せずにコンテンツを編集できるようにしたいと考えています。同時に、この情報はデバイスが接続するWebサイトで入手できます。2つのDBサーバーのデータが競合している場合/その場合はどうすればよいですか? (CoreDataをDBサーバーと呼びますが、多少異なることがわかります。) この種の問題に対処するための一般的な戦略はありますか?これらは私が考えることができるオプションです: 1.常にクライアント側のデータを優先度の高いものとして使用します 2.サーバー側でも同じ 3.各フィールドの編集タイムスタンプをマークして最新の編集を行うことで競合を解決してください 3番目のオプションは壊滅的なデータ破損の余地を開くと確信していますが。 CAP定理がこれに関係していることは承知していますが、最終的な整合性のみが必要なので、完全に除外するわけではありませんか? 関連質問:双方向データ同期のベストプラクティスパターン。この質問に対する2番目の答えは、おそらくそれができないということです。

4
開発者が絶対に知っておくべきアルゴリズムとデータ構造はどれですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 成功するエンタープライズJava開発者になりたい。どのアルゴリズムとデータ構造をよく理解する必要がありますか?どの本を勧めますか? Java開発者として成功するには、CLRSで提供されているような高度なアルゴリズムをすべて知っている必要がありますか? 優先度の高い順に学習する必要があるトピックのリストを提案できますか? 私が知っている必要があります: 検索中? 仕分け? グラフ/ツリー? 等?

5
単一の文字に適した検索アルゴリズムはありますか?
KMPやBoyer-Mooreなどの基本的な文字列照合アルゴリズムはいくつか知っていますが、それらはすべて検索前にパターンを分析しますが、1つの文字がある場合、分析することはあまりありません。テキストのすべての文字を比較する単純な検索よりも優れたアルゴリズムはありますか?

8
同じ値を2回返さないことが保証されている関数[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 これは私が就職の面接で尋ねられた質問であり、彼らが探していた答えがわからないので、私はここの誰かがいくつかのアイデアを持っていることを望んでいます。目標は、同じ値を2回返さないことが保証されている関数を作成することです。この機能は、複数のマシンから同時にアクセスされると仮定します。 私のアイデアは、各マシンに一意のIDを割り当て、その値を一意の値ジェネレーター関数に渡すことでした。 var i = 0; function uniq(process_id, machine_id) { return (i += 1).toString() + machine_id + "-" + process_id; } これにより、2つ以上のプロセスがの同じ値を読み取った場合でもi、各戻り値にプロセスIDとマシンIDの一意の組み合わせがタグ付けされるため、競合状態からのフォールアウトが回避されます。ただし、別のマシンをオンラインにするにはIDを割り当てる必要があるため、私のインタビュアーはこの回答を好みませんでした。 だから誰もこれを解決する別の方法を考えることができますか?それは一意のIDを持つように各マシンを構成することを必要としませんか?この質問が再び出てくる場合に備えて、回答が欲しいです。ありがとう。

7
文字列の類似性に最適なアルゴリズムは何ですか?
アドレスに基づいてさまざまなWebページのコンテンツを一意に識別するプラグインを設計しています。 したがって、次のようなアドレスを1つ持つことができます。 1 someawesome street, anytown, F100 211 後で、このアドレスがわずかに異なる形式で見つかる場合があります。 1 someawesome street, F100 211, またはおそらく曖昧な someawesome street F100 これらは技術的には同じアドレスですが、ある程度の類似性があります。a)検索を実行するために各アドレスに一意の識別子を生成し、b)非常に類似したアドレスがいつ表示されるかを把握したいと思います。 どのアルゴリズム/テクニック/文字列メトリクスを見るべきですか?レーベンシュタイン距離は明らかな選択のように見えますが、ここで役立つ他のアプローチがあるかどうかは興味があります。

2
ループ(while / for)を再帰に、または再帰からループに変換する一般的な方法は?
この問題は主にアルゴリズムに焦点を当てており、おそらく抽象的でより学術的なものです。 例は思考を提供しているので、一般的な方法を使用したいので、例はあなたの思考についてより明確にするためにのみ使用されます。 一般的に、ループは再帰に変換できます。 例えば: for(int i=1;i<=100;++i){sum+=i;} そして、それに関連する再帰は次のとおりです。 int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } そして最後にこれを簡素化するには、末尾再帰が必要です: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } ただし、ほとんどの場合、回答と分析はそれほど簡単ではありません。私が知りたいのは: 1)ループ(for / while……)を再帰に変換する「一般的な一般的な方法」を取得できますか?そして、変換を行う際にどのようなことに注意する必要がありますか?変換プロセスと同様に、いくつかのサンプルとあなたのpersudo理論で詳細な情報を書くほうが良いでしょう。 2)「再帰」には、線形再帰と末尾再帰の2つの形式があります。それで、どちらを変換するのが良いですか?どの「ルール」をマスターすべきですか? 3)再帰の「履歴」を保持する必要がある場合がありますが、これはループステートメントで簡単に実行できます。 例えば: List<string> history = new List<string>(); …

8
32ビットアーキテクチャで可能なすべての数値を含むファイルが提供されます。そのファイルには4つの数字がありません。欠落している4つの数字を見つける
これはインタビューの質問で、何度か出くわしました。4つの数字が欠けているので、どうやってそれを解決するのかわかりません。私は1つまたは2つの数値が見つからないことを見つけるためのアルゴリズムに精通していますが、それらのいずれかを4に一般化する方法がわかりません。
22 algorithms 


3
加重シャッフルの実装方法
私は最近、非常に非効率的だと思ったコードをいくつか書きましたが、含まれている値が少ないため、受け入れました。しかし、私はまだ次のより良いアルゴリズムに興味があります: Xオブジェクトのリスト。各オブジェクトには「重み」が割り当てられます 重みを合計する 0から合計までの乱数を生成します オブジェクトを反復処理し、合計が非正になるまで合計から重みを減算します リストからオブジェクトを削除してから、新しいリストの最後に追加します 項目2、4、および5はすべてn時間がかかるため、O(n^2)アルゴリズムです。 これは改善できますか? 重み付きシャッフルの例として、要素はより高い重みで前面にいる可能性が高くなります。 例(実際に乱数を生成します): 重みが6,5,4,3,2,1の6つのオブジェクト。合計は21 私は19を選びました:19-6-5-4-3-2 = -1したがって、2が最初の位置に移動し、重みは6,5,4,3,1になりました。合計は19 16:を選んだ16-6-5-4-3 = -2ので、3番目が2番目の位置になり、重みは6,5,4,1になりました。合計は16 3を選択しました。3-6 = -3したがって、6は3番目の位置になり、重みは5,4,1になりました。合計は10 8:を選んだ8-5-4 = -1ので、4は4番目の位置になり、重みは5,1になりました。合計は6 5:を選んだ5-5=0ので、5は5番目の位置になり、重みは1になりました。合計は1 私は1を選んだ1-1=0ので、1が最後の位置に移動し、重みがなくなり、終了します
22 algorithms 

12
コマンドインタープリター/パーサーの書き方
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 問題:コマンドを文字列の形式で実行します。 コマンド例: /user/files/ list all; に相当: /user/files/ ls -la; 別のもの: post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;" に相当: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;" 現在のソリューション: tokenize string(string, array); switch(first item in array) { case "command": if ( …

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