首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在排序的一组浮点数之间找到最小的差值。

问在排序的一组浮点数之间找到最小的差值。
EN

Stack Overflow用户
提问于 2016-09-21 22:16:24
回答 2查看 108关注 0票数 0

如果我有一组已排序的浮点数,那么如何才能找到排序集中任意两个值之间的最小差值?

例如,如果排序集包含

代码语言:javascript
复制
#{1.0 1.1 1.3 1.45 1.7 1.71}

那么,我想要的结果是0.01,因为1.71和1.7之间的差值是排序集中任意两个值之间的最小差。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 23:15:43

编辑

正如Alan向我指出的,问题是这是一个排序的集合,所以我们可以做这个简单得多的事情:

代码语言:javascript
复制
(def s (sorted-set 1.0 1.1 1.3 1.45 1.7 1.71))
(reduce min (map - (rest s) s)))
=> 0.01

原始答案

假设集合是无序的,尽管排序可能更好。

给定的

代码语言:javascript
复制
(def s #{1.0 1.1 1.3 1.45 1.7 1.71})

我们可以得到相关的对,例如,对于列表中的每个数字,将其与右边的所有数字配对:

代码语言:javascript
复制
(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])

现在,我们要看一下每对之间差异的绝对值:

代码语言:javascript
复制
(defn abs [x] (Math/abs x))

把它们放在一起,得到最小值:

代码语言:javascript
复制
(reduce min (map (comp abs (partial apply -)) pairs))

它将为我们提供所需的输出,0.01

最后一行可以更明确地写成

代码语言:javascript
复制
(reduce min
    (map (fn[[a b]]
           (abs (- a b)))
         pairs))
票数 2
EN

Stack Overflow用户

发布于 2016-09-21 23:27:50

我认为使用Clojure内置函数partition是最简单的方法:

代码语言:javascript
复制
(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
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39627409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档