2016-09-21 9 views
0

浮動小数点数のソートセットがある場合、そのソートセットの2つの値の最小の差はどうすればわかりますか?例えばソートされた浮動小数点数の最小の差を見つける

ソートセットが

#{1.0 1.1 1.3 1.45 1.7 1.71} 

が含まれている場合は1.71と1.7との間の差は、そのソートセット内の任意の2つの値間の最小差であるように、私の後だ結果は、0.01であろう。

答えて

2

EDIT

アランが私に指摘したように、問題はこれがソートセットだっ述べたので、私たちはこれを行うことがはるかに簡単:

(def s (sorted-set 1.0 1.1 1.3 1.45 1.7 1.71)) 
(reduce min (map - (rest s) s))) 
=> 0.01 

オリジナル回答

セットが順序付けされていないと仮定しますが、順序は良いかもしれません。

考える

(def s #{1.0 1.1 1.3 1.45 1.7 1.71}) 

我々は、リスト内のすべての数のために、のように、関連するペアを取得し、それの右側にあるすべての数字とペアリングできます。今すぐ

(def pairs 
    (loop [r [] s (into [] s)] 
     (if-let [[f & v] s] 
     (recur (concat r (for [i v] [f i])) 
       v) 
     r))) 
=> ([1.0 1.45] [1.0 1.7] [1.0 1.3] [1.0 1.1] [1.0 1.71] [1.45 1.7] [1.45 1.3] 
    [1.45 1.1] [1.45 1.71] [1.7 1.3] [1.7 1.1] [1.7 1.71] [1.3 1.1] [1.3 1.71] 
    [1.1 1.71]) 

、我々すべてのペアの差の絶対値を調べることをお勧めします:

(defn abs [x] (Math/abs x)) 

最小値を取得する:

私たちに必要な出力が得られます
(reduce min (map (comp abs (partial apply -)) pairs)) 

、最後の行は、より明示的に私はClojureのが組み込まれて使用して考える

(reduce min 
    (map (fn[[a b]] 
      (abs (- a b))) 
     pairs)) 
+3

'(適用min(map - (rest s)s))' – amalloy

+0

素敵な簡単な答え - ありがとう! – monch1962

-2

のように書くことができることを0.01


-in function partitionが最も簡単な方法です:

(ns clj.core 
    (:require [tupelo.core :as t])) 
(t/refer-tupelo) 

(def vals [1.0 1.1 1.3 1.45 1.7 1.71]) 
(spyx vals) 

(def pairs (partition 2 1 vals)) 
(spyx pairs) 

(def deltas (mapv #(apply - (reverse %)) pairs)) 
(spyx deltas) 

(println "result=" (apply 

vals => [1.0 1.1 1.3 1.45 1.7 1.71] 
pairs => ((1.0 1.1) (1.1 1.3) (1.3 1.45) (1.45 1.7) (1.7 1.71)) 
deltas => [0.10000000000000009 0.19999999999999996 0.1499999999999999 0.25 0.010000000000000009] 
result= 0.010000000000000009 
+0

これは実際には、最小値が連続する数であると仮定しています。これは '[1.0 1.1 1.3 1.7 1.45 1.71]では失敗します。' - 1.7をちょっと戻しました。 – Shlomi

+0

問題はそれが「並べ替えられた浮動小数点セット」であると述べました。元のセットがソートされていない場合は、それを最初にソートし(n * log n)、すべてのペア(n^2)を比較するよりもネイバーを比較する方が良いでしょう。 –

+0

ソートされた部分が見つかりませんでした。その場合、 'partition'はあまりにも多すぎるかもしれません。単純に'(map -s(rest s)) 'を行うことができます。悪い私の答えを更新する:) – Shlomi

関連する問題