如果我有一组已排序的浮点数,那么如何才能找到排序集中任意两个值之间的最小差值?
例如,如果排序集包含
#{1.0 1.1 1.3 1.45 1.7 1.71}那么,我想要的结果是0.01,因为1.71和1.7之间的差值是排序集中任意两个值之间的最小差。
发布于 2016-09-21 23:15:43
编辑
正如Alan向我指出的,问题是这是一个排序的集合,所以我们可以做这个简单得多的事情:
(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))它将为我们提供所需的输出,0.01
最后一行可以更明确地写成
(reduce min
(map (fn[[a b]]
(abs (- a b)))
pairs))发布于 2016-09-21 23:27:50
我认为使用Clojure内置函数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.010000000000000009https://stackoverflow.com/questions/39627409
复制相似问题