我必须运行各种版本的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)
答案 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
解决了此问题