第i阶统计python的确定性快速选择(中值法的中间值)

2024-09-27 00:16:18 发布

您现在位置:Python中文网/ 问答频道 /正文

dselect利用快速排序原理,在O(n)时间内找到给定的未排序整数(无重复项)列表中的第i阶统计量。第i阶统计量被定义为给定列表中已排序版本中的第i个最小元素。所以一阶统计量是最小的元素,而N阶统计量是最大的元素,等等。。。在

运行时,我在dselect函数的末尾得到IndexError: list index out of range上的return arr[l]。我认为这个错误是由于我在对dselect函数的列表medians的递归调用中将l硬编码为0。(第4行)

我该怎么做才能避免这个错误?我应该如何将l的值放入该递归调用中?这就是这个错误的根源吗?如果这是一个愚蠢的问题,请随时指出,我会删除这个问题。我不得不问这个,因为我已经被困在这个问题上很久了。谢谢。在

def dselect(arr, l, r, i):
    if l < r:
        #finding pivot deterministically
        medians = createMedianList(arr, l, r)
        pivot = dselect(medians, 0, len(medians) - 1, len(medians) // 2) #line4

        pivot = partition(arr, l, r, pivot)
        if pivot + 1 == i:
            return arr[pivot]
        elif pivot + 1 > i:
            return dselect(arr, l, pivot - 1, i)
        else:
            return dselect(arr, pivot + 1, r, i)

    return arr[l]

def partition(arr, l, r, pivot):
    pivotIndex, i = arr.index(pivot), l
    arr[l], arr[pivotIndex] = arr[pivotIndex], arr[l]

    for j in range(l + 1, r + 1):
        if arr[j] < arr[l]:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[l], arr[i] = arr[i], arr[l]

    return i

def createMedianList(arr, l, r):
    medians = []
    for i in range(l, (r + 1) - 5 + 1):
        temp = sorted(arr[i:i + min(5, (r - l + 1) - i)])
        medians.append(temp[len(temp) // 2])

    return medians

if __name__ == '__main__':
    arr = [5, 2, 4, 3, 1, -1]
    #arr = list(map(int, open('select.txt').read().splitlines()))
    print(dselect(arr, 0, len(arr) - 1, int(input('Which order 
    statistic to find? '))))

Tags: 元素列表lenreturnif排序def错误
1条回答
网友
1楼 · 发布于 2024-09-27 00:16:18

问题是createMedianList有时返回一个空列表: 如果l >= r-3最终会发生这种情况。 我建议您向createMedianList添加一些内容,以确保它不会返回空列表。 E、 g.:if medians==[]:medians=[arr[0]]或类似的东西(取决于你想让中间带具有什么属性)。在

相关问题 更多 >

    热门问题