2017-10-11 9 views
0

コンテキスト:ruby​​の.minと.maxメソッドはどのように動作しますか?配列内の最小値または最大値を見つけるためにこれらのメソッドを使用すると時間の複雑さはどのくらいですか?

株価の配列が与えられたときにmax_stock_profitを決定するアルゴリズムの問​​題を調べていました。私は前記方法の時間複雑さを決定しようとしており、each方法内の配列に.minが使用されていました。これは私にこのポストで題された質問をするようになった。

一般的に言えば、単に例えば長1,000,000のアレイ上.min又は.max方法を見たとき、(n)は、minまたはmax値を決定するために線形時間Oを必要とするアレイ上の.min又は.maxを実行していないであろう、 Nはアレイの長さである?..

もしそうであれば、以下に示すコード例に基づいて、eachメソッド内.min又は.max方法を実行することによって、時間複雑度はOではない(N^2 )最小値を決定するためにeachメソッド内で別の繰り返しを実行する必要があるためです。私はコードスニペットがO(n)時に実行されるべきだと思っていますが、.min.maxがどのように動作するかについての私の不足は大きな混乱の原因となっています。

.minは2つの値しか含まない配列で呼び出されるので、コード行が一定時間O(1)で動作するとはいいですか?何が起こっているのかについての私の誤解を解消する助けがあれば歓迎されます。ありがとう。

例コードスニペット:each

stock_prices = [5, 7, 2 ,4, 9, 1, 8] 
min_price = stock_prices[0] 
max_profit = 0 

stock_prices.each do |current_price| 
    min_price = [min_price, current_price].min 
    potential_profit = current_price - min_price 
    max_profit = [max_profit, potential_profit].max 
end 
+0

「etc ...」で何が行われていますか?これは、なぜこれを書いた人が 'min_price = stock_prices.min'というだけではないのかと関係しているかもしれません。例えば、それは逐次プロセスであり、論理はそれまでに見られた最低株価を前提としています。 – pjs

+0

はいそれは逐次処理であり、最初の最小価格と現在の価格を比較するとき、最も低い株価に基づいています。しかし、私はこのコードスニペットの時間の複雑さ、特に.eachメソッド内で.minと.maxを実装するときに、何が混乱しているのか混乱しています。私は.minを使って、それぞれの中で別の繰り返しが必要だと思ったので、時間の複雑さはO(n)よりも長くかかると信じられましたか? –

+0

私はここのコードはO(n)であると信じています。つまり、株価の長さに基づいて線形です。 – stujo

答えて

0

.min.max操作はわずか2要素をアレイに適用されているので、各々がO(1)操作です。 stock_pricesの要素の数nを変更すると、各反復で.minまたは.maxのいずれかが見つかるまでの時間が変更されず、nとは独立しています。その結果、ブロック全体がO(n)となる。

+0

答え、ありがとう。一般的に言えば、配列が大きければ、例えば1000の長さの場合、min/maxメソッドは各要素を正しく反復処理するので、線形時間がかかります。ランタイムを最適化したい場合は、別のイテレータ内で.minまたはmaxを自由に使用するとき、病気がより慎重でなければならないため、質問しています。 –

+0

'min'は配列のサイズで線形です。しかし!この場合、 'min'が反復処理する配列のサイズは、定数で囲まれています(元の例では2、仮説では1000)。 *関数が定数によって束縛されるときはいつでも、それはO(1)にある。ボトムライン:時間の複雑さをnの関数として話すときは、常に「n」が何であるかを厳密に定義するように注意してください。 –

+0

@GeorgeV。いいえ、元の配列を反復処理していないためです。 'each'ブロックは、2要素しか含まない一時的な配列を作成するので、反復ごとの作業量は元の配列の長さとは関係ありません。 – pjs

関連する問題