浮動小数点数のソートセットがある場合、そのソートセットの2つの値の最小の差はどうすればわかりますか?例えばソートされた浮動小数点数の最小の差を見つける
ソートセットが
#{1.0 1.1 1.3 1.45 1.7 1.71}
が含まれている場合は1.71と1.7との間の差は、そのソートセット内の任意の2つの値間の最小差であるように、私の後だ結果は、0.01であろう。
浮動小数点数のソートセットがある場合、そのソートセットの2つの値の最小の差はどうすればわかりますか?例えばソートされた浮動小数点数の最小の差を見つける
ソートセットが
#{1.0 1.1 1.3 1.45 1.7 1.71}
が含まれている場合は1.71と1.7との間の差は、そのソートセット内の任意の2つの値間の最小差であるように、私の後だ結果は、0.01であろう。
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))
のように書くことができることを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
これは実際には、最小値が連続する数であると仮定しています。これは '[1.0 1.1 1.3 1.7 1.45 1.71]では失敗します。' - 1.7をちょっと戻しました。 – Shlomi
問題はそれが「並べ替えられた浮動小数点セット」であると述べました。元のセットがソートされていない場合は、それを最初にソートし(n * log n)、すべてのペア(n^2)を比較するよりもネイバーを比較する方が良いでしょう。 –
ソートされた部分が見つかりませんでした。その場合、 'partition'はあまりにも多すぎるかもしれません。単純に'(map -s(rest s)) 'を行うことができます。悪い私の答えを更新する:) – Shlomi
'(適用min(map - (rest s)s))' – amalloy
素敵な簡単な答え - ありがとう! – monch1962