Min-Search的非递归版本

时间:2017-09-21 17:06:40

标签: algorithm pseudocode

A[x,...,y]是整数数组,x,y是自然数&gt; = 1和x <= y

Foo(Array,x,y)

if (x=y): return Array[x]

else: 
    m=(x+y)/2 
    return min(Foo(Array,x,m), Foo(Array(m+1),y)

我试图弄清楚如何编写这段代码的非递归版本,找到未排序数组中的最小值。

我尝试使用while循环,其中(x!= y)但是我无法弄清楚如何移动m直到它到达x = y并终止并返回最小值。我还想知道是否可以在不弹出m和m + 1的最大值的情况下完成

2 个答案:

答案 0 :(得分:4)

如果你想找到一根棍子的质心(你可以在一根手指上平衡它的点),只需用两根手指在两端握住它,然后慢慢地将它们一起移动。

类似的方法适用于查找数组中的最小元素:

findMin(Arr,x,y):

    while(x < y):
        if (Arr[x] < Arr[y])
            y-=1
        else
            x+=1

    return Arr[x]

答案 1 :(得分:1)

如果您只是使用堆栈来保存待定比较,那么这个想法非常简单。类似的东西:

Func Min(a, x, y)
    min_value = INT_MAX  // largest possible int
    s = empty stack of (x,y) pairs
    s.push(x,y)
    while (!s.isEmpty())
        x,y = s.pop()
        if (x == y)
        {
            if (a[x] < min_value)
                min_value = a[x]
        }
        else
        {
            m = (x+y)/2
            s.push(a, x, m)
            s.push(a, m+1, y)
        }
    }
    return min_value

请注意,这是递归代码的非递归转换。它根本不打算成为如何获得最小数字数组的推荐。