基础算法——BFPRT

def partition(arr, pivot_index):
    index = 0
    r = len(arr) - 1
    pivot_value = arr[pivot_index]
    arr[pivot_index], arr[r] = arr[r], arr[pivot_index]
    for i in range(0, r + 1):
        if arr[i] > pivot_value:
            arr[index], arr[i] = arr[i], arr[index]
            index += 1
    arr[index], arr[r] = arr[r], arr[index]
    return index

#找到数组中的中位数并返回
def pivot_mid(arr):
    n = len(arr)
    while n > 5:
        cols = (n // 5) + 1
        m = []  # 存储中位数
        for i in range(cols):
            s = sorted(arr[5 * i:(5 * i + 5)])
            s_mid = (len(s) - 1) // 2
            # print(s_mid)
            m.append(s[s_mid])
        arr = m
        n = len(arr)
        print(n)
    arr.sort()
    return arr[n // 2]


def bfprt(arr, k):
    pivot = pivot_mid(arr)
    pivot_index = arr.index(pivot)
    index = partition(arr, pivot_index)
    n = len(arr)
    if k < n - index:
        return bfprt(arr[index + 1:n], k)
    elif k == n - index:
        return pivot
    elif k > n - index:
        return bfprt(arr[0:index], k - (n - index))


array = [2, 3, 8, 5, 6, 7, 9, 0, 4, 1, 11, 12]
print(sorted(array))
print(bfprt(array, 5))


### 关于《算法导论》中BFPR算法的相关考试题目 #### 题目一:选择问题的理解 解释什么是选择问题,并说明如何利用BFPRT算法解决这一类问题。给出具体的应用场景并讨论该算法的优势。 对于给定的一组数据,选择问题是找出其中第$k$小的元素。BFPRT算法通过分治策略来处理这个问题,在最坏情况下能够达到线性时间复杂度$O(n)$[^1]。应用场景可以是在数据库查询优化、统计学中的样本选取等领域;优势在于即使面对极端输入也能保持高效性能。 #### 题目二:BFPRT算法流程描述 请详细描述BFPRT(Blum-Floyd-Pratt-Rivest-Tarjan)算法的工作原理及其步骤。画出伪代码表示整个过程,并指出哪些部分使得它能够在最坏情形下仍维持$O(n)$的时间效率。 ```python def bfprt(A, k): if len(A) <= 5: A.sort() return A[k] medians = [] for i in range(0, len(A), 5): group = sorted(A[i:i + 5]) median = group[len(group)//2] medians.append(median) pivot = bfprt(medians, len(medians)//2) L = [x for x in A if x < pivot] E = [x for x in A if x == pivot] G = [x for x in A if x > pivot] if k < len(L): return bfprt(L, k) elif k < len(L) + len(E): return pivot else: return bfprt(G, k - len(L) - len(E)) ``` 上述伪代码展示了完整的BFPRT算法实现方式。为了确保最坏情况下的线性时间复杂度,关键是每次划分都尽可能均匀地分割原始列表,这依赖于精心挑选枢轴——即各小组中间值组成的集合再次应用本算法得到的结果作为最终枢轴[^2]。 #### 题目三:比较不同方法求解Top-K问题 对比分析使用快速排序与采用BFPRT算法分别解决top-k问题时的表现差异。重点考虑两者在平均时间和最坏时间上的区别,并举例说明实际编程环境中可能遇到的情况。 当涉及到从大量未排序的数据集中提取前$k$大或小项的任务时,传统做法可能是先进行全面排序再取所需数量的最大/最小值,这种方法虽然简单直观但在某些特殊条件下可能会退化到平方级别的运行速度。相比之下,BFPRT不仅能在理论上保证更优的时间界限,而且由于不需要完全有序排列所有记录,因此更适合大规模实时数据分析场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值