gpt4 book ai didi

clojure - 如何计算包含 NaN 的序列的频率?

转载 作者:行者123 更新时间:2023-12-02 16:36:35 27 4
gpt4 key购买 nike

当用于包含 NaN 的序列时,frequencies 的结果是错误的,例如:

=> (frequencies [Double/NaN Double/NaN])
{NaN 1, NaN 1}

而不是预期的{NaN 2}

此外,运行时间从预期/平均 O(n) 恶化到最坏情况 O(n^2),例如

=> (def v3 (vec (repeatedly 1e3 #(Double/NaN))))
=> (def r (time (frequencies v3)))
"Elapsed time: 36.081751 msecs"
...
=> (def v3 (vec (repeatedly 1e3 #(Double/NaN))))
=> (def r (time (frequencies v3)))
"Elapsed time: 3358.490101 msecs"
...

即10 倍的元素需要 100 倍的运行时间。

当序列中存在 NaN 时,如何使用(预期/平均)O(n) 运行时间计算频率?

<小时/>

作为旁注:

 => (frequencies (repeat 1e3 Double/NaN))
{NaN 1000}

产生预期的结果,可能是因为序列中的所有元素都是同一对象的引用。

最佳答案

NaN 在许多编程语言中都非常奇怪,部分原因是 float 的 IEEE 754 标准定义 NaN 不应该等于任何东西,甚至不等于它本身。正是“甚至不是它本身”部分导致了您所看到的大多数奇怪行为。如果您好奇的话,请点击这里:https://github.com/jafingerhut/batman

下面的示例函数可能会适合您的需求。它在返回的映射中使用 :nan-kw 来指示找到了多少个 NaN。如果将 :nan-kw 替换为 ##NaN,则返回的映射有一个缺点,即由于 ##NaN 的怪异,您无法找到计数(获取频率-ret-值 ##NaN)。

(defn frequencies-maybe-nans [s]
(let [separate-nans (group-by #(and (double? %) (Double/isNaN %)) s)
num-nans (count (separate-nans true))]
(merge (frequencies (separate-nans false))
(when-not (zero? num-nans)
{:nan-kw num-nans}))))

(def freqs (frequencies-maybe-nans [1 2 ##NaN 5 5]))
freqs
(get freqs 2)
(get freqs :nan-kw)

关于clojure - 如何计算包含 NaN 的序列的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58614698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com