在一个接一个地运行快速排序算法时获得最大递归深度错误,但不是单独运行

时间:2014-02-16 03:28:59

标签: python runtime-error quicksort

我必须运行各种版本的quicksort,对包含未分类数字的一堆数据文件计算排序和冒泡排序算法,以记录算法在不同数据集上所花费的时间,我想做一个脚本所以我不要不必为每个文件手动运行它们(我有很多)。

当我自己运行各种算法时,使用Python“algorithmname”.py -f“testfilepath”在控制台中手动调用它们,一切正常。不幸的是,当我运行我的脚本在每个测试文件上一个接一个地运行它们时,我遇到了我已经实现的4个quicksort版本的问题。每次运行我的脚本以逐个运行算法时,我都会收到以下错误:RuntimeError:比较时超出了最大递归深度。

以下是我在脚本文件中逐个调用算法的方法:

for dataFile in sorted(listdir("tp1-H10-donnees")):
    inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
    unsortedList1 = [int(line.rstrip('\n')) for line in inputFile]
    unsortedList2 = unsortedList1
    unsortedList3 = unsortedList1
    unsortedList4 = unsortedList1
    unsortedList5 = unsortedList1
    unsortedList6 = unsortedList1

    (algoTime, sortedList) = bubble.main(unsortedList1)
    bubbleResult.append(dataFile + "\tbubble sort\t" + ", time = %.6f\n" % algoTime)

    (algoTime, sortedList) = counting.main(unsortedList2)
    countingResult.append(dataFile + "\tcounting sort\ttime = %.6f\n" % algoTime)

    (algoTime, sortedList) = quick.main(unsortedList3)
    quickResult.append(dataFile + "\tquick sort\ttime = %.6f\n" % algoTime)

    (algoTime, sortedList) = quickMed.main(unsortedList4)
    quickMedResult.append(dataFile + "\tquickMed sort\ttime = %.6f\n" % algoTime)

    (algoTime, sortedList) = quickSeuil.main(unsortedList5)
    quickSeuilResult.append(dataFile + "\tquickSeuil sort\ttime = %.6f\n" % algoTime)

    (algoTime, sortedList) = quickMedSeuil.main(unsortedList6)
    quickMedSeuilResult.append(dataFile + "\tquickMedSeuil sort\ttime = %.6f\n" % algoTime)

在快速排序算法的主要功能中,我只调用quick()函数,它是实现快速排序算法的函数,具有良好的参数。这是一个例子:

def main(unsortedList):
    # Execute algorithm
    start = time.clock()
    sortedList = quick(unsortedList, 0, (len(unsortedList) - 1), mediane=True, seuilRecurcivite=1)
    end = time.clock()

    return (end - start, sortedList)

这是我的快速实施:

import math

def quick(unsortedList, left, right, mediane=False, seuilRecurcivite=1):

    if right - left >= seuilRecurcivite:
        if (mediane == False):
            pivotIndex = left
        else:
            pivotIndex = medianIndex(unsortedList, left, right);
        pivotNewIndex = partition(unsortedList, left, right, pivotIndex)
        quick(unsortedList, left, pivotNewIndex - 1)
        quick(unsortedList, pivotNewIndex + 1, right)
    elif right - left >= 1:
        unsortedList[left:right+1] = bubble(unsortedList[left:right+1])

    return unsortedList

def partition(unsortedList, left, right, pivotIndex):
    pivotValue = unsortedList[pivotIndex]
    unsortedList[pivotIndex], unsortedList[right] = unsortedList[right], unsortedList[pivotIndex]
    storeIndex = left

    for i in range(left, right):    # RUNTIME ERROR
        if unsortedList[i] <= pivotValue:
            unsortedList[i], unsortedList[storeIndex] = unsortedList[storeIndex], unsortedList[i]
            storeIndex = storeIndex + 1

    unsortedList[storeIndex], unsortedList[right] = unsortedList[right], unsortedList[storeIndex]

    return storeIndex

medianIndex()只是一个函数,可以找到列表的第一个,中间和最后一个元素之间的中位数索引。

控制台告诉我该行发生错误

for i in range(left, right):

但我无法找到为什么当我运行一个接一个地运行每个算法的脚本时,它会给我这个错误,而不是在我单独运行时。

感谢您的帮助。

编辑: 根据需要,这里是medianIndex()函数和它内部使用的med3()函数:

def med3(a, b, c):
    if a <= b <= c or c <= b <= a:
        return b
    elif b <= a <= c or c <= a <= b:
        return a
    else:
        return c

def medianIndex(list, left, right):
    firstValue = list[left]
    lastValue = list[right]
    middleValue = list[math.ceil((left + right) / 2)]

    medianValue = med3(firstValue, middleValue, lastValue)

    return list.index(medianValue)

1 个答案:

答案 0 :(得分:0)

所以我发现了我的问题。它在以下代码中:

for dataFile in sorted(listdir("tp1-H10-donnees")):
    inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
    unsortedList1 = [int(line.rstrip('\n')) for line in inputFile]
    unsortedList2 = unsortedList1
    unsortedList3 = unsortedList1
    unsortedList4 = unsortedList1
    unsortedList5 = unsortedList1
    unsortedList6 = unsortedList1

正确的方法是执行以下操作:

for dataFile in sorted(listdir("tp1-H10-donnees")):
    inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
    unsortedList1 = [int(line.rstrip('\n')) for line in inputFile]
    unsortedList2 = list(unsortedList1)
    unsortedList3 = list(unsortedList1)
    unsortedList4 = list(unsortedList1)
    unsortedList5 = list(unsortedList1)
    unsortedList6 = list(unsortedList1)

基于unsortedList1创建一个新列表,而不只是指向unsortedList1。这部分解决了我的问题。

我之后遇到的另一个问题仍然是出现同样的错误,但仅限于最大的数据集(100 000或500 000个数字)。使用sys.setrecursionlimit

解决了此问题