タグ付けされた質問 「time-complexity」

アルゴリズムの時間の複雑さは、問題への入力のサイズの関数として実行するためにアルゴリズムが費やす時間を定量化します。アルゴリズムの時間の複雑さは、通常、乗法定数と低次の項を抑制するビッグO表記を使用して表現されます。


6
アルゴリズムがO(log n)の複雑さを持つ原因は何ですか?
big-Oについての私の知識は限られています。対数項が方程式に現れると、私はさらに驚かされます。 誰かがO(log n)アルゴリズムについて簡単に説明してもらえますか?対数はどこから来たのですか? これは特に、この中期的な練習問題を解決しようとしたときに発生しました。 X(1..n)とY(1..n)に整数の2つのリストが含まれ、それぞれが降順にソートされているとします。O(log n)時間アルゴリズムを使用して、2n個のすべての組み合わせ要素の中央値(またはn番目に小さい整数)を見つけます。exの場合、X =(4、5、7、8、9)およびY =(3、5、8、9、10)の場合、7は結合されたリストの中央値(3、4、5、5、7 、8、8、9、9、10)。[ヒント:バイナリ検索の概念を使用する]

2
JavaScript配列のビッグO
JavaScriptの配列は、アイテムを追加したり削除したりすることで非常に簡単に変更できます。ほとんどの言語の配列は固定サイズであり、サイズを変更するには複雑な操作が必要であるという事実を多少覆っています。JavaScriptでは、パフォーマンスの低い配列コードを簡単に記述できるようです。これは質問につながります: 配列のパフォーマンスに関して、JavaScript実装から期待できるパフォーマンス(大きなO時間の複雑さに関して) 私はすべての妥当なJavaScript実装に最大で以下の大きなOがあると想定しています。 アクセス-O(1) 追加-O(n) 付加-O(n) 挿入-O(n) 削除-O(n) スワッピング-O(1) JavaScriptでは、new Array(length)構文を使用して、配列を特定のサイズに事前入力できます。(ボーナス質問:この方法で配列を作成していますO(1)またはO(n))これは従来の配列に似ており、プリサイズの配列として使用すると、O(1)を追加できます。循環バッファロジックが追加された場合、O(1)の先頭に追加できます。動的に拡張する配列が使用される場合、O(log n)は両方の平均ケースになります。 ここでの想定よりも、いくつかの点でより良いパフォーマンスを期待できますか?仕様で概説されているものはないと思いますが、実際には、すべての主要な実装が舞台裏で最適化された配列を使用している可能性があります。動的に拡張する配列または他のパフォーマンス向上アルゴリズムが機能していますか? PS 私がこれを不思議に思っているのは、いくつかの並べ替えアルゴリズムを研究しているためです。それらのほとんどは、全体的な大きなOを記述するときに、追加と削除がO(1)操作であると想定しているようです。


2
疑似多項式時間とは何ですか?多項式時間とどう違うのですか?
疑似多項式時間とは何ですか?多項式時間とどう違うのですか?疑似多項式時間で実行される一部のアルゴリズムには、O(nW)(0/1ナップザック問題の場合)またはO(√n)(試行除算の場合)などのランタイムがあります。なぜそれが多項式時間として数えられないのですか?

11
ユークリッドのアルゴリズムの時間の複雑さ
ユークリッドの最大の共通分母アルゴリズムの時間の複雑さを判断するのが困難です。この擬似コードのアルゴリズムは次のとおりです。 function gcd(a, b) while b ≠ 0 t := b b := a mod b a := t return a aとbに依存しているようです。私の考えでは、時間の複雑さはO(a%b)です。あれは正しいですか?それを書くより良い方法はありますか?

4
Sieve of Eratosthenesアルゴリズムの時間の複雑さ
ウィキペディアから: アルゴリズムの複雑さは O(n(logn)(loglogn))ビット操作です。 どうやってそこに着くの? 複雑さというloglogn用語が含まれているということは、sqrt(n)どこかにあることを私に教えてくれます。 最初の100個の数字(n = 100)でふるいを実行していると仮定します。数字を複合としてマークするのに一定の時間がかかる(配列の実装)と仮定すると、使用mark_composite()する回数は次のようになります。 n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2) そして、次の素数を見つけるには(たとえば、の7倍数であるすべての数に取り消し線を引いた後にジャンプする5)、操作の数はになりますO(n)。 したがって、複雑さはになりますO(n^3)。同意しますか?


2
コレクションのJavascriptES6計算/時間計算量
キー付きコレクション(Set、Map、WeakSet、およびWeakMap)のES6仕様によって(big-O表記で)どのくらいの時間計算量が提供されますか? 私の期待、およびIは、ほとんどの開発者の仕様や実装が使用することであることを期待する、広く受け入れられている場合にパフォーマンスアルゴリズムSet.prototype.has、add及びdelete平均場合の全てであるO(1)にします。MapおよびWeak–同等のものについても同じです。 実装の時間計算量が義務付けられているかどうかは、私には完全には明らかではありません。たとえば、ECMAScript 2015言語仕様-第6版-23.2オブジェクトの設定などです。 私がそれを誤解しない限り(そして私がそうすることは確かに非常に可能です)、ECMA仕様は実装(例えばSet.prototype.has)が線形時間(O(n))アルゴリズムを使用することを義務付けているように見えます。より高性能なアルゴリズムが仕様で義務付けられておらず、許可さえされていないことは非常に驚くべきことであり、なぜそうなるのかについての説明に非常に興味があります。

4
反復文字列追加の時間計算量は実際にはO(n ^ 2)ですか、それともO(n)ですか?
私はCTCIの問題に取り組んでいます。 第1章の3番目の問題は、次のような文字列を取ることです。 'Mr John Smith ' 中間スペースを%20次のように置き換えるように求められます: 'Mr%20John%20Smith' 著者はこのソリューションをPythonで提供し、O(n)と呼んでいます。 def urlify(string, length): '''function replaces single spaces with %20 and removes trailing spaces''' counter = 0 output = '' for char in string: counter += 1 if counter > length: return output elif char == ' ': output = output + …

12
コンピュータサイエンスでの並べ替えと「現実の」世界での並べ替え
私はソフトウェアのソートアルゴリズムと、O(nlogn)障害を乗り越えるための可能な方法について考えていました。実用的な意味での高速ソートは不可能だと思いますので、そうは思わないでください。 そうは言っても、ほとんどすべてのソートアルゴリズムでは、ソフトウェアは各要素の位置を知っている必要があるようです。それ以外の場合、いくつかの並べ替え基準に従って各要素をどこに配置するかをどのように知ることができますか? しかし、私がこの考えを現実の世界と交差させたとき、遠心分離機は、密度によって分子を「分類」するときに、各分子がどの位置にあるのかわかりません。実際、各分子の位置は関係ありません。しかし、各分子が密度と重力の法則に従っているという事実のために、比較的短期間で何兆ものアイテムを何兆もの分類することができます-それは私に考えさせられました。 各ノードにいくらかのオーバーヘッド(各ノードに追加された値またはメソッド)を使用して、リストの順序を「強制」することは可能でしょうか?遠心分離機のようなもので、各要素のみが(他のノードとの関係で)空間内の相対位置を気にします。または、これは計算のルールに違反していますか? ここで取り上げられた大きなポイントの1つは、自然の量子力学的効果と、それらがすべての粒子に同時に並行して適用される方法だと思います。 おそらく、古典的なコンピューターは本質的にソートをのドメインに制限しますがO(nlogn)、量子コンピューターはそのしきい値を超えてO(logn)並列に動作するアルゴリズムにできる可能性があります。 基本的に並列バブルソートである遠心分離機は正しいように思われるという点は、時間計算量がO(n)です。 次の考えは、自然が分類O(n)できるのなら、なぜコンピューターができないのかということだと思います。

1
さまざまなデータ構造の時間計算量はどのくらいですか?
配列、二分探索木、ヒープ、リンクリストなどの一般的なデータ構造の操作の時間計算量をリストしようとしています。特にJavaについて言及しています。それらは非常に一般的ですが、私たちの中には正確な答えに100%自信がない人もいると思います。どんな助け、特に参考文献も大歓迎です。 例:単一リンクリストの場合:内部要素の変更はO(1)です。どうすればいいですか?あなたはHAVEそれを変更する前に要素を検索します。また、Vectorの場合、内部要素の追加はO(n)として与えられます。しかし、なぜインデックスを使用して償却された一定時間でそれを行うことができないのですか?何か足りないものがあれば訂正してください。 私は最初の答えとして私の発見/推測を投稿しています。

5
Max-Heapifyの最悪の場合-2n / 3を取得するにはどうすればよいですか?
CLRS、第3版、155ページでは、MAX-HEAPIFYでは、 子のサブツリーのサイズはそれぞれ最大2n / 3です。最悪の場合は、ツリーの最下位レベルがちょうど半分いっぱいになったときに発生します。 ツリーの最下層がちょうど半分いっぱいになったときに最悪になる理由を理解しています。また、この質問では、MAX-HEAPIFYの最悪のケースについても回答されています。「最悪のケースは、ツリーの最下位レベルがちょうど半分いっぱいになったときに発生します」 私の質問は、2n / 3を取得する方法ですか? 最下位レベルが半分いっぱいの場合、子ツリーのサイズが最大2n / 3になるのはなぜですか? それを計算する方法は? ありがとう

2
std :: dequeは実際には最初に一定時間の挿入を持っていますか?
標準は言う: 両端キューは、ランダムアクセス反復子(27.2.7)をサポートするシーケンスコンテナーです。さらに、最初または最後の一定時間の挿入および消去操作をサポートします。途中で挿入と消去には線形時間がかかります。 ただし、同じ条項にも次のように記載されています。 この条項のすべての複雑さの要件は、含まれているオブジェクトに対する操作の数に関してのみ記述されています。[例:vector<vector<int>>含まれるそれぞれのコピーの複雑さvector<int>自体は線形であるにもかかわらず、タイプのコピーコンストラクターは線形の複雑さを持っています。—最後の例] これは、たとえば両端キューに既に存在するsと挿入される新しいオブジェクトに対して一定数以上の操作を実行しない限り、最初の挿入にdeque<int>線形時間がかかることを意味するのではありませんか?intint たとえば、「サイズKのベクターのベクター」を使用して両端キューを実装するとします。最初にK回挿入するたびに、新しいサイズKのベクトルを最初に追加する必要があるため、他のすべてのサイズKのベクトルを移動する必要があります。これは、最初の挿入の時間の複雑さが償却されたO(N / K)であることを意味します。ここで、Nは要素の総数ですが、Kは定数なので、これは単なるO(N)です。しかし、これは規格で許可されているようです。サイズKのベクトルを移動してもその要素は移動せず、「複雑さの要件」は含まれているintオブジェクトの「操作の数に関してのみ述べられている」ためです。 規格はこれを本当に許可していますか?それとも、より厳しい要件、つまり、含まれているオブジェクトに対する一定数の操作に加えて一定の追加時間があると解釈する必要がありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.