Python中List的最小值和最大值(不使用min / max函数)

问题描述 投票:0回答:2

我想知道是否有办法在不使用Python中的min / max函数的情况下找到列表的最小值和最大值。所以我用递归写了一个小代码。我的逻辑很天真:我做了两个堆栈(min_stack和max_stack),它们在每次递归调用期间跟踪最小值和最大值。我有两个问题:

  1. 有人可以帮我估算代码的复杂性吗?
  2. 有一个更好的方法吗?是使用mergesort / quicksort对列表进行排序,并选择第一个和最后一个元素可以提供更好的性能吗?

谢谢

这是我在Python中的尝试:

minimum = []
maximum = []

# Defining Stack Class
class Stack:
    def __init__(self) :
        self.items = []

    def push(self, item) :
        self.items.append(item)

    def pop(self) :
        return self.items.pop()

    def access(self, index):
        return self.items[index]

    def isEmpty(self) :
        return (self.items == [])

    def length(self):
        return len(self.items)

def minmax(input_list):
    # make two stacks, one for min and one for max
    min_stack = Stack()
    max_stack = Stack()
    # comparing the first two elements of the list and putting them in appropriate stack
    if input_list[0]<input_list[1]:
        min_stack.push(input_list[0])
        max_stack.push(input_list[1])
    else:
        max_stack.push(input_list[0])
        min_stack.push(input_list[1])

    # Pushing remaining elements of the list into appropriate stacks. 
    for i in range(2, len(input_list)):
        if input_list[i] < min_stack.access(-1):
            min_stack.push(input_list[i])
        else:
            max_stack.push(input_list[i])

    # to find minimum
    minlist = []
    while min_stack.length() > 0:
        minlist.append(min_stack.pop())

    # to find maximum
    maxlist = []
    while max_stack.length() > 0:
        maxlist.append(max_stack.pop())

    if len(minlist) > 1:
        minmax(minlist)
    else:
        minimum.append(minlist)


    if len(maxlist) > 1:
        minmax(maxlist)
    else:
        maximum.append(maxlist)

def main():
    input_list = [2, 0, 2, 7, 5, -1, -2]
    print 'Input List is: ', input_list
    minmax(input_list)

print 'Global Minimum is: ', minimum[0]
print 'Global Maximum is: ', maximum[len(maximum)-1]

if __name__ == "__main__":
    main()
python algorithm minmax
2个回答
3
投票

当然,使用sorted()对于中等大小的列表来说是可靠,快速编写和高性能的,因为它是内置的。对于大型列表,O(n)算法会更快,例如:

def minmax1 (x):
    # this function fails if the list length is 0 
    minimum = maximum = x[0]
    for i in x[1:]:
        if i < minimum: 
            minimum = i 
        else: 
            if i > maximum: maximum = i
    return (minimum,maximum)

print(minmax1([9,8,7,6,5,4,3,2,1,11,12,13,14,15,16,17,18,19]))
print(minmax1([1]))
print(minmax1([2, 0, 2, 7, 5, -1, -2]))

...输出为:

(1, 19)
(1, 1)
(-2, 7)

我有兴趣检查两种替代方案的性能。在运行Windows XP和Python 3.2.3的PC上,我发现排序方法比上面定义的minmax1()函数更快,对于少于500个元素的列表,但是对于更长的列表,O(n)minmax1()更快。我的计时测试代码如下:

def minmax_sort(x):
    x = sorted(x)
    return (x[0],x[-1])

import timeit

aa = list(range(0,100))
a = aa
while (1):
    stime = min(timeit.repeat('minmax_sort(a)', "from __main__ import minmax_sort,a",number=1000))
    mtime = min(timeit.repeat('minmax1(a)', "from __main__ import minmax,a",number=1000))
    if (stime > mtime):
        break
    else:
        a = a + aa
print(len(a))

0
投票

仅使用递归查找列表的最小值和最大值。

上周我有类似的任务,我将代码分为三部分。

第1步:在列表中查找最小值

def RecursiveMin(L):
if len(L)==2:
    if L[0]<L[1]:
        return L[0]
    else:
        return L[1]
else:
    X= RecursiveMin(L[1:])
    if L[0]<X:
        return L[0]
    else:
        return X

第2步:使用升序(从最小到最大)对列表进行排序

def Sort(x):
L=sorted(x)
if x==L:
    return x
else:
    i=0
    for i in range (len(x)):
        if x[i] > x[i+1] :
            break

    unsortedPart = x[i:]
    R = RecursiveMin(unsortedPart)
    I = unsortedPart.index(R)

    for j in range (len(x)):
        if x[j] > R :
            del x[(I+i)]
            x.insert(j,R)
            break

    return Sort(x)

(我之前已经回答了一个列表问题,并提供了相同的代码。所以请不要因为我自己的代码Likn:Finding minimum element in a list (recursively) - Python而标记我的抄袭。

**步骤3:使用参数创建一个新函数,无论用户是想要最小值还是最大值*

def minMax(lst,user):
    if user == min:
       return Sort(lst)
    elif user == max:
       s = Sort(lst)
       return s[::-1]

最后一步不是递归的,但如果将所有三个步骤编译成一个函数,它将是“1递归函数”。如果你的问题只是在列表中找到最小值和最大值,你可以跳过步骤2并对步骤1和步骤3进行一些更改

© www.soinside.com 2019 - 2024. All rights reserved.