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

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

6
in O(n)time:比較が推移的でないセット内で最大の要素を見つける
タイトルは質問を述べています。 入力として要素のリストがあり、比較することができます(どちらが最も大きいかを判断します)。要素を等しくすることはできません。 キーポイント: 比較は推移的ではありません(じゃんけんを考えてください):これは本当です:A> B、B> C、C> A (ここに有効な答えがないので、これは有効な入力ではないことに注意してください。非推移的比較」という意味) 各入力配列には答えがあることが保証されます 最大は、要素が他のすべての要素よりも大きくなければならないことを意味します 逆の性質が成り立つ、すなわちA> BはB <Aを意味する 例: Input: [A,B,C,D] A > B, B > C, C > A D > A, D > B, D > C Output: D O(n)時間でこれを行う方法がわかりません。私の最善の解決策はO(n ^ 2)です。 答えを確実にするために、要素が他のすべての要素と明示的に比較され、それが実際に答えであることを証明する必要があるという事実のために、すべてのアプローチにこだわっています(比較は推移的ではないため)。 これは、ヒープ、ソートなどの使用を除外します。

4
コーメンを超えたアルゴリズムの本
Cormenのアルゴリズムの紹介の本でほとんどの資料を完成させました。Cormanの本以外の資料をカバーするアルゴリズムの本を探しています。推奨事項はありますか? 注:stackoverflowでこれを尋ねましたが、答えにあまり満足していませんでした。 注:ほとんどのコメントを見て、理想的には、このコースの説明で787 コースの内容をカバーする本を見つけたいと思います。

3
時間でサイズ3のソートされたサブシーケンスを見つけるアルゴリズムはありますか?
この質問は、コンピューターサイエンススタック交換で回答できるため、理論的なコンピューターサイエンススタック交換から移行されました。 7年前に移行され ました。 Iは、証明または反証配列が与えられると、アルゴリズムが存在する整数を三の指数を見つけ、私は、Jおよびkのように、I &lt; J &lt; KとA [ I ] &lt; A [ J ] &lt; A [ kは】(または、そのようなトリプルがないことがわかります)線形時間で。AAA私、ji,ji, jkkki &lt; j &lt; ki&lt;j&lt;ki < j < kA [ i ] &lt; A [ j ] &lt; A [ k ]A[i]&lt;A[j]&lt;A[k]A[i] < A[j] < A[k] これは宿題の質問ではありません。「そのようなアルゴリズムを実装してみてください」とフレーム化されたプログラミングフォーラムでそれを見ました。さまざまな実験の後では不可能だと思います。私の直感はそう教えてくれますが、それは実際には何の役にも立ちません。 正式に証明したいと思います。どうやってやるの?理想的には、段階的にレイアウトされた証明を見たいと思います。そして、もしあなたがとても傾いているなら、このような簡単な質問を一般的に証明/反証する方法についての説明をご覧ください。それが役立つ場合、いくつかの例: [1,5,2,0,3] → …

2
ダイクストラのアルゴリズムは、優先キューを持つBFSだけですか?
この質問は、コンピューターサイエンススタック交換で回答できるため、理論的コンピューターサイエンススタック交換から移行されました。 6年前に移行され ました。 このページによると、ダイクストラのアルゴリズムは優先キューを備えたBFSにすぎません。本当にそんなに簡単なのですか?私はそうは思いません。

1
ドメイン名の圧縮
この質問は、Computer Science Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 任意のIDNホスト名(RFC5890で定義)のドメインを非常にコンパクトに圧縮する方法について興味があり、これが興味深い課題になると思われます。Unicodeホストまたはドメイン名(Uラベル)はUnicode文字の文字列で構成され、通常、トップレベルドメイン(たとえば、ギリシャ文字)に応じて1つの言語に制限され、(対応するラベル)。.grxn-- 正式な要件だけでなく、 各非Unicodeラベルは文字列一致^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$です; 各Aラベルは、一致する文字列^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$です。そして ドメイン全体の長さ(Aラベルと '。'区切り文字で連結された非IDNラベル)が255文字を超えない 次のようなさまざまなヒューリスティックからも: 下位Uラベルは、固有名詞や数字(ハイフンを除く句読点、空白が取り除かれ、Nameprepごとに折り畳まれている)を含む一部の自然言語で、字句的、構文的、意味的に有効なフレーズであることが多く、短いフレーズが優先されます。そして 高次ラベルはSLDおよびTLDの辞書から引き出され、低次ラベルで使用される自然言語を予測するためのコンテキストを提供します。 こうした短い文字列を適切に圧縮することは、データのこれらの特定の機能を考慮せずに困難になること、さらに、既存のライブラリがより一般的なユースケースに対応するために不要なオーバーヘッドを生成することを恐れます。 Matt MahoneyのオンラインブックData Compression Explainedを読むと、上記の(および/または他の)モデリングの前提を活用するために多くの既存の手法を使用して、特定のツールよりもはるかに優れた圧縮を実現できることが明らかです。 コンテキストとして、この質問はSOに関する以前の質問からの派生物です。 最初の考え この問題はオフライントレーニングの優れた候補であり、次の行に沿って圧縮データ形式を想定しています。 「パブリックサフィックス」のハフマンコーディング。ドメイン登録またはトラフィックボリュームの公開されたソースから抽出された確率。 残りのUラベルに使用される(自然言語)モデルのハフマンコーディング。ドメインサフィックスのコンテキストを指定して、ドメイン登録またはトラフィックボリュームの公開されたソースから抽出された確率。 指定された自然言語モデルからいくつかの辞書ベースの変換を適用します。そして Uラベル内の各文字の算術コーディングと、オフライントレーニングから派生した文脈適応型自然言語モデルから得られる確率

2
ベルマンフォードを使用して負のサイクルを取得
有向グラフで負のサイクルを見つけなければなりません。ベルマンフォードアルゴリズムの仕組みと、到達可能な負のサイクルがあるかどうかがわかります。ただし、明示的に名前を付けるわけではありません。 サイクルの実際のパスを取得するにはどうすればよいですか?v 1 、v 2 、… v k 、v 1v1,v2,…vk,v1v1, v2, \ldots vk, v1 標準アルゴリズムを適用した後、すでに回の反復を行っているため、それ以上の改善は不可能です。それでもノードまでの距離を短くできる場合は、負のサイクルが存在します。n − 1n−1n-1 私のアイデアは次のとおりです。パスを改善できるエッジと各ノードの先行ノードを知っているので、再びエッジに到達するまでそのエッジからさかのぼることができます。これでサイクルができました。 悲しいことに、これが正しいかどうかを伝える論文は見つかりませんでした。それで、実際にそのように機能しますか? 編集:この例は、私の考えが間違っていることを証明しています。次のグラフを考えると、ノードからBellman-Fordを実行します。111 エッジを順に処理します。回の反復の後、ノード距離を取得します:n − 1a 、b 、c 、da,b,c,da, b, c, dn − 1n−1n-1 2 :− 30 3 :− 151 :− 51:−51: -5 2 :− 302:−302: -30 3 :− 153:−153: -15 そして親テーブル:親持ち親持ち親を持っている 3 …

3
計算問題を厳密に定式化する方法は?
私はしばしば、計算の問題(またはその複雑さ)のアルゴリズムを求めたい人とやり取りしますが、私たち(コンピューター科学者)が理解するために厳密な方法でそれを表現しません。 CLRSのような本を参照することは、例えばグラフの隣接リストとその中の2つの頂点がそれらの頂点間の最短経路を計算する場合、通常は非常に簡単に厳密に述べる方法があるため、役に立たない。 CSに関する最低限の知識を持つ人が、コンピューター科学者が理解できる厳密な方法で計算問題を定式化し、述べる方法を学ぶことができる良い本(または他のリソース)はありますか? 本は、さまざまな分野や実世界の例から計算問題を厳密に定式化する方法の多くの例を持っていることが望ましい。 明確化 質問をより具体的にするために、1、2年生のCS学部生のレベルで、セット、関数、グラフ、リストなどの基本的な数学/ CSの用語を知っていると仮定しましょう(私がいる人の場合)マインド)。たとえば、AhoやUllmanのような入門書を読んだことがあります(完全に理解していないかもしれませんが)。 Al AhoおよびJeff Ullman、Foundation of Computer Science、1992年。

3
基数ソートの実用化
キーが特定の制限された範囲にあることがわかっている場合、たとえば[ 0 … n k − 1 ]の範囲の値など、基数ソートは理論的に非常に高速です。場合のk &lt; LG のnあなただけのベースに値を変換するn個とるΘ (n個)の時間を、ベース行うn個のソート基数をして、全体のためにあなたの元のベースに戻って変換するΘ (nはkの)アルゴリズム。nnn[ 0 … nk− 1 ][0…nk−1][0\dots n^k -1]k &lt; lgnk&lt;lg⁡nk<\lg nnnnΘ (n )Θ(n)\Theta(n)nnnΘ (n k )Θ(nk)\Theta(nk) ただし、実際には基数ソートは通常、たとえばランダム化されたクイックソートを実行するよりもはるかに遅いことを読みました。 大規模な配列の場合、基数ソートの命令数は最も少なくなりますが、キャッシュパフォーマンスが比較的低いため、全体的なパフォーマンスは、マージソートおよびクイックソートのメモリ最適化バージョンよりも劣ります。 基数の並べ替えは素晴らしい理論上のアルゴリズムですか、それとも一般的な実用的な用途がありますか?

1
「二重に」算術的な進行を検出するのは3SUM難しいですか?
これはインタビューの質問に触発されたものです。 我々は、整数の配列を与えられている1、... 、Nと異なるがあるかどうかを決定する必要がI &lt; J &lt; Kようにa1、… 、ana1,…,ana_1, \dots, a_ni &lt; j &lt; ki&lt;j&lt;ki \lt j \lt k ak− aj= aj− a私ak−aj=aj−aia_k - a_j = a_j - a_i k − j = j − ik−j=j−ik - j = j - i すなわち、シーケンスおよび{ i 、j 、k }は両方とも算術級数です。{ a私、j、k}{ai,aj,ak}\{a_i, a_j, a_k\}{ i …

1
パーティションの洗練に基づくアルゴリズムが対数線形時間よりも高速に実行される問題
パーティションの洗練は、オブジェクトの有限セットから始めて、セットを徐々に分割する手法です。DFA最小化などの一部の問題は、パーティションの洗練を非常に効率的に使用して解決できます。ウィキペディアのページにリストされているもの以外のパーティションの改良を使用して通常解決される他の問題は知りません。これらすべての問題のうち、ウィキペディアのページでは、パーティションの洗練に基づくアルゴリズムが線形時間で実行される2つについて言及しています。辞書編集的に順序付けられたトポロジカルソート[1]と辞書編集幅優先検索アルゴリズム[2]があります。 パーティションの絞り込みを非常に効率的に使用して解決できる問題の例や参考文献はありますか? [1] Sethi、Ravi、「2つのプロセッサでのグラフのスケジューリング」、SIAM Journal on Computing 5(1):73–82、1976 [2] Rose、DJ、Tarjan、RE、Lueker、GS、「グラフ上の頂点除去のアルゴリズム的側面」、SIAM Journal on Computing 5(2):266–283、1976

3
離散対数を見つけるのはどれくらい難しいですか?
bbba c Nab=cmodNab=cmodNa^b=c \bmod NaaacccNNN これはどの複雑なグループ(例:古典的なコンピューターや量子コンピューター)で、どのタスク(アルゴリズム)がこのタスクを達成するのに最適なのでしょうか。 上記のウィキペディアのリンクは、実際に非常に具体的なランタイムを提供していません。私は、そのようなものを見つけるための最もよく知られている方法と同じようなものを望んでいます。

3
証明可能なほど高速なランダム化アルゴリズムに関するPの問題
PP\mathsf{P}kkkP T I M E(F (N ))F (N )DTIME(nk)⊊PTIME(nk)DTIME(nk)⊊PTIME(nk)\mathsf{DTIME}(n^k) \subsetneq \mathsf{PTIME}(n^k)PTIME(f(n))PTIME(f(n))\mathsf{PTIME}(f(n))f(n)f(n)f(n) ランダム性は\ mathsf {P}内で何かを購入しPP\mathsf{P}ますか? 明確にするために、単なる定数ではなく、差が漸近的である(できれば多項式ですが、多対数で解決する)ものを探しています。 最悪の場合、漸近的により良いアルゴリズムを探しています。期待される複雑さのアルゴリズムは、私が探しているものではありません。ZPPではなく、RPまたはBPPのようなランダム化アルゴリズムを意味します。

4
欲張りアルゴリズムを使用して、指定されたシーケンスに最も近い非減少シーケンスを見つける方法は?
n個の整数すべてと間で与えられます。各整数下に、からまでの整数を書き込む必要がありますが非減少シーケンスを形成するという要件があります。そのようなシーケンスの偏差を定義します。実行時O(n \ sqrt [4] {l})で最小偏差を持つb_iを見つけるアルゴリズムを設計します。a1、… 、ana1,…,ana_1, \ldots, a_n000llla私aia_ib私bib_i000lllb私bib_iB I O (nは4 √最大(| a1− b1| 、…、 | an− bn| )max(|a1−b1|,…,|an−bn|)\max(|a_1-b_1|, \ldots, |a_n-b_n|)b私bib_iO (n l√4)O(nl4)O(n\sqrt[4]{l}) 正直に言って、この問題を解決する方法すら全くわかりません。動的プログラミングの質問のように見えますが、教授は貪欲なアルゴリズムを使用してこれを解決する必要があると言いました。誰かが小さなヒントを与えることで私を正しい方向に向けることができれば幸いです。

3
素数を法とする階乗を計算する最も効率的な方法は何ですか?
係数の後の階乗を効率的に計算するアルゴリズムを知っていますか? たとえば、私はプログラムしたい: for(i=0; i&lt;5; i++) sum += factorial(p-i) % p; しかし、p階乗を直接適用するための大きな数(素数)です。(p≤108)(p≤108)(p \leq 10^ 8) Pythonでは、このタスクは本当に簡単ですが、最適化の方法を知りたいのです。

2
アルゴリズムを記述し、それらを証明し、分析する方法は?
The Art of Computer Programming(TAOCP)を読む前に、これらの質問を深く考えたことはありません。擬似コードを使用してアルゴリズムを記述し、それらを理解し、成長の順序についてのみ実行時間を推定します。TAOCPは徹底的に私の心を変更します。 TAOCPは、ステップとgotoを組み合わせた英語を使用してアルゴリズムを説明し、フローチャートを使用してアルゴリズムをより簡単に描写します。低レベルのように見えますが、特にフローチャートにはいくつかの利点があることに気付きました。計算がその矢印をたどるときの現在の状態についてのアサーションで各矢印にラベルを付け、アルゴリズムの帰納的証明を行うことができます。著者は言う: 著者の主張は、図4で行われたように、すべてのアサーションが暗黙的に満たされた点に到達した場合にのみアルゴリズムが有効である理由を本当に理解しているということです。 私はそのようなことを経験していません。別の利点は、各ステップが実行される回数をカウントできることです。キルヒホッフの最初の法則で確認するのは簡単です。実行時間を正確に分析していないため、実行時間を推定するときに一部が省略された可能性があります。±1±1\pm1 成長の順序の分析は役に立たない場合があります。たとえば、クイックソートとヒープソートはすべてであるため区別できません。ここで、はランダム変数予想数です。したがって、定数を分析する必要があります。およびしたがって、と良い。また、場合によっては、分散などの他の量を比較する必要があります。実行時間の増加順序の大まかな分析だけでは十分ではありません。TAOCPとしてE(T(n))=Θ(nlogn)E(T(n))=Θ(nログ⁡n)E(T(n))=\Theta(n\log n)EXEバツEXXバツXE(T1(n))=A1nlgn+B1n+O(logn)E(T1(n))=A1nlg⁡n+B1n+O(ログ⁡n)E(T_1(n))=A_1n\lg n+B_1n+O(\log n)E(T2(n))=A2lgn+B2n+O(logn)E(T2(n))=A2lg⁡n+B2n+O(log⁡n)E(T_2(n))=A_2\lg n+B_2n+O(\log n)T1T1T_1T2T2T_2 アルゴリズムをアセンブリ言語に変換し、実行時間を計算します。私にとっては難しすぎるので、実行時間をもう少し大まかに分析するためのテクニックを知りたいと思います。これは、C、C ++または擬似コード。 そして、主に研究活動で使用されている記述スタイルと、これらの問題の処理方法を知りたいです。

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