2012-01-07 7 views
0

[10,42,45,45,61,61,75,90,1240]のような配列が与えられている場合、どのような数のXがあるのか​​をどのようにして見つけることができますか?たとえば、X = 59の場合、回答は[45,45,61,61]になります。何番の数字がXですか?

選択列挙子はこれには完璧だと思われますが、いずれの側でもすべての要素を選択する方法を理解できません。

+3

あなたは最も近い下限と上限の数字を求めていますか?なぜ45,45 61,61? –

答えて

3

境界の繰り返し値が必要なようですね。例として機能的なアプローチがあります。これはO(n)なので、大きな入力配列を持っている場合には、O(log(n))の二等分アルゴリズムを使用する方がよいでしょう(注記:チェックする値はxs.minxs.maxの間でなければなりません)。

xs = [10,42,45,45,61,61,75,90,1240] 
chk_pairs = xs.chunk { |x| x }.each_cons(2) 
boundaries = chk_pairs.detect { |_, (y, ys)| y > 59 }.flat_map { |x, xs| xs } 
#=> [45, 45, 61, 61] 
+0

+1のコード。 – Linuxios

+1

'xs.chunk {| x | x} .each_cons(2).find {| _、(x、xs)| x> 59} .flat_map {| x、xs | xs} 'おそらく速いです –

+0

@ヴィクター:良いスポット。編集されました。 – tokland

1

入力配列が常にソートされていると仮定すると、バイナリ検索を使用して次の下位および上位(またはおそらく等しい)番号を見つけることができます。あなたの特定のケースでは、明らかにそこから左右に目を通して、最初に見つかった次の下位/上位に等しい数字をすべて見つけます。

関連する問題