快速选择算法——求解第k小的数

1.问题描述

给定n个无序的数,求出其中第k小的数

2.问题分析

求一个无需数列中第k小的数最简单的方法就是先使用快速排序或是选择排序对数组排序,然后直接挑选升序序列中的第k个数作为结果。此时算法的时间复杂度为O(nlogn)。

3.快速选择

快速选择是一种利用了快速排序的性质从而在平均时间复杂度O(n)的情况下选择出无序数组中第k小的元素的算法。在快速排序中我们首先会从数组中选择一个数作为划分标准,将比该数小的放在左边,比该数大的放在右边,经过一轮划分后实际上我们已经确定了这个被选择的数在排序后的数组中的正确位置p。如果我们此时将p和k作比较,会发现当p和k相同时,此时数组第p位的数就是我们要找的第k小的数。如果p>k则在左边的划分中寻找第k小的数,反之在右边的划分寻找第k-p小的数。通过观察我们可以发现,每次我们只需要选择一个子集合进行划分, T ( n ) = T ( n 2 ) + O ( n ) T(n)=T(\frac{n}{2})+O(n) T(n)=T(2n)+O(n)

4.算法模板

int findKth(int a[], int l ,int r,int k){
    if (l == r) return a[l];
    
    int x = a[l + r >> 1] , i = l - 1 , j = r + 1;
    while (i < j){
        while (a[++i] < x);
        while (a[--j] > x);
        if (i < j) swap(a[i] , a[j]);
    }
    //计算主元左边数字个数
    int lcnt = j - l + 1;
    //判断第k个数在左边还是右边
    if (k <= lcnt) return findKth(a, l, j, k);
    else return findKth(a, j + 1, r, k - lcnt);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TSP问题是一个经典的组合优化问题,它要求在给定的一组点之间找到一条最短的路径,使得每个点都被恰好访问一次。在这里,我将介绍如何使用动态规划算法来解决TSP问题。 动态规划算法是一种基于递推的算法,它将一个复杂的问题分解成简单的子问题,然后通过递推的方式来求解子问题的最优解,最终得到原问题的最优解。 对于TSP问题,我们可以使用动态规划算法求解。具体来说,我们可以定义一个状态数组dp,其中dp[i][j]表示从起点出发经过点集i到达点j的最短路径长度。其中,点集i是指除了起点和终点之外的所有点的集合。 接下来,我们考虑如何计算dp[i][j]。对于任意一个点k,如果k不在点集i中,则可以忽略它对dp[i][j]的影响。如果k在点集i中,则可以将dp[i][j]表示为从起点出发经过点集i- {k}到达点k再到达点j的最短路径长度,即: dp[i][j] = min(dp[i-{k}][k] + dist[k][j]) 其中,dist[k][j]表示从点k到点j的距离。我们可以使用递推的方式从小到大依次计算dp数组的所有元素。最终,dp[all][0]就是TSP问题的最优解,其中all表示所有点的集合。 下面是使用Python实现TSP问题动态规划算法的代码: ``` import sys # DP-based TSP solver def tsp_dp(dist): n = len(dist) # dp[i][j] represents the shortest path starting from 0, visiting all nodes in i, and end at j dp = [[sys.maxsize] * n for i in range(1 << n)] dp[1][0] = 0 for i in range(1, 1 << n): for j in range(n): if i & (1 << j): for k in range(n): if i & (1 << k) and k != j: dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + dist[k][j]) return dp[(1 << n) - 1][0] # Test case dist = [ [0, 1, 15, 6], [2, 0, 7, 3], [9, 6, 0, 12], [10, 4, 8, 0] ] print(tsp_dp(dist)) # Output: 21 ``` 在上面的代码中,我们使用了一个二进制来表示点集i。具体来说,如果二进制的第j位为1,则表示点j在点集i中。例如,二进制1011表示点集{0, 1, 3}。 总之,动态规划算法是解决TSP问题的一种有效方法,它可以在较短的时间内求解出TSP问题的最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值