【问题标题】:Recursive algorithm to find the smallest element [closed]找到最小元素的递归算法[关闭]
【发布时间】:2013-03-28 07:40:40
【问题描述】:

我想写一个递归算法来找到一个最小的元素。 我画了一棵二叉树,其中叶子代表元素,内部节点是比较后的最小元素。

算法的输入是:

5 3 1 9 8 7 6 10

二叉树:

输出:1

我需要找到一种以某种方式合并此二叉树的算法。首先比较一对元素,然后将问题减少到 n/2 然后 n/4 .. 当 n 变为 1 时,我们得到答案。

【问题讨论】:

  • 你有什么问题?
  • 你试过什么?
  • 而你的问题是......你已经尝试过......
  • 使用非递归算法(for循环)我们可以轻松找到最小元素,但我想使用递归算法找到最小元素
  • 您能描述一下递归算法如何遍历您的树吗?

标签: algorithm search recursion binary-tree


【解决方案1】:

这是一个查找树中最小值的函数:

function smallest(tree)
    if isEmpty(tree)
        return infinity
    return min( tree.value,
                smallest(tree.leftKid),
                smallest(tree.rightKid) )

但我不明白你的问题。如果输入是数组的形式,则不需要构建树。只需遍历数组,两两比较值,每一步保持最小值,最后输出最小值。

【讨论】:

    【解决方案2】:

    使用divide and conquer

    M(i, j) 表示“子数组”[i...j] 的最小元素。然后M(i, j) = min(M(i, k), M(k + 1, j)),如果i < j(我留给你找出合适的k)。

    另外,您需要处理i = j 的情况。

    【讨论】:

      【解决方案3】:

      伪代码:

      mydata = [5 3 1 9 8 7 6 10];
      n = 8;
      while n > 1
        for ii = 2 to n Step 2
          mydata[ii/2]=min(mydata[ii-1],mydata[ii]);
        next ii
        n = n/2;
      wend
      

      【讨论】:

      • 实际上没有递归,算法应该像我展示的二叉树一样工作。
      • 刚刚看到您的评论。我想这不是递归的......
      • 它确实像你的二叉树一样工作,因为它比较对,并沿着你的树向上工作......mydata 的大小不断缩小,并表示“所有数字都在下一级" - 但它不是递归的。
      猜你喜欢
      • 2012-03-16
      • 2016-03-27
      • 2020-08-12
      • 1970-01-01
      • 2018-06-13
      • 2013-03-17
      • 2020-07-03
      • 1970-01-01
      • 2017-05-20
      相关资源
      最近更新 更多