【问题标题】:Minimal element of an array数组的最小元素
【发布时间】:2018-12-20 15:29:10
【问题描述】:

一个抽象的问题,与任何特定语言无关:

如果我有如下功能

min(int, int) :: int

返回数组中的最小值,

concat([int], [int]) :: [int]

结合了两个数组,应该怎么写这样的函数

minInArray([int]) :: Int

它返回数组中的最小元素,但输出可以像这样链接,即使输入数组为空:

min(minInArray(array1), minInArray(array2)) == minInArray(concat(array1, array2))

换句话说,是否有任何常用的中性元素 minInArray 可以在空输入时返回,这不会弄乱min()

【问题讨论】:

    标签: arrays design-patterns


    【解决方案1】:

    如果数组没有元素,一种选择是返回一些中性值,例如 nullNaN,然后如果运行 min() 函数并且其中一个参数是中性值,那么您只需返回另一个数组的最小值。如果数组为空,另一种选择是返回语言与+Infinity 最接近的值;这有效且不需要修改min(),但有时会在调用minInArray() 函数时产生返回无限值的副作用。这个无限值可以作为一个真正的中性值,与默认的min() 函数一起使用,但如果数组中的最小值真的是无限的,它可能会引起一些混乱。

    【讨论】:

      【解决方案2】:

      minInArray(arr1) 如果 arr1 为空,则返回 null。

      min() 应该只返回非空值而不是空值。这意味着 min() 仅在两个参数都为 null 时才返回 null。否则,它将返回最小的非空值。

      【讨论】:

        【解决方案3】:

        在思考这个问题时,我们似乎找到了唯一可能的解决方案: 如果数组为空 - 我们应该返回 int 的最大可能值以满足条件。

        其实没那么好……

        【讨论】:

        • 但是如果两个数组都是空的呢?或者,如果其中一个数组实际上只包含 int 的最大值怎么办?我建议使用某种异常,或者只是检查数组以确保它们不为空,然后再尝试计算它们。
        • 如果两个数组都是空的,或者我们只是调用 minInArray([]) 那么答案就不会很好了。但是有一个任务 - 找到一个中性元素。我们可以从 Haskell 的 Monoid 实例中获取 Min 的相同方法:instance (Ord a, Bounded a) => Monoid (Min a) where mempty = maxBound
        • 我确定它在其他地方被使用过,但如果您不必这样做,我不会那样写;如果我必须找出代码,那将是一个令人讨厌的错误,并且不会是我所期望的。
        【解决方案4】:

        只是为了补充一些观点(并不是说这是列出的问题的重复)-

        当要求计算空列表或数组的最小值时,所有这些都会引发某种错误:Java、Scala、Python、numpy、Javascript、C#。可能更多,但这就是我所看到的。我敢肯定有一些不是,但我希望大多数语言都是以可理解性和清晰性换取速度的语言。

        This 问题是关于一种特定语言的,但有与所有语言相关的答案。

        注意here 如何使用 Python 之类的工具解决此问题。

        特别是对于 Haskell,请注意此问题中的 advice

        最后是here's a response,了解您问题的更一般情况。

        一般来说,让代码正常工作始终是最重要的,但紧随其后的是它必须是人类可以理解的。如果您是唯一处理该函数的人,那么对于您当前的项目可能并不重要,但在调用“get_minimum”函数时我最不希望看到的是 Int.MAX。

        我知道它使编码变得简单,但我敦促您提防易于编写且难以理解的代码。多花一点时间使代码易于阅读,尽可能多地具有立即明显的含义,以后总会节省更多的时间。

        【讨论】:

          猜你喜欢
          • 2014-12-19
          • 2012-05-11
          • 1970-01-01
          • 2012-10-17
          • 1970-01-01
          • 2017-01-17
          • 2015-04-18
          • 2013-12-15
          • 1970-01-01
          相关资源
          最近更新 更多