![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 79
SimpleFelix
编程是一种修行...
展开
-
分治算法设计:切割篱笆问题
切割篱笆问题假设有道篱笆用N个同宽的木条拼接而成。因年久失修,有些木板已经折断,因而整个篱笆呈现出参差不齐的轮廓,所以要用新的木板替换。不过为了环保,可以用一部分旧篱笆切割出长方形的木板充当木料。图(b)表示在(a)形状的篱笆中能切割出的最大长方形。给定构成篱笆的各个木板的高度,编写程序计算能够切割出的最大长方形面积。不能斜线切割,即不允许采用如图(c)的切割方法。 图1 切割篱笆问题暴力算法给出保存各个木板高度的数组h[],截取第l个木板到第r个木板的长方形面积可...原创 2021-07-11 15:40:13 · 1097 阅读 · 3 评论 -
三种线性排序算法:计数排序、桶排序与基数排序
非基于比较的排序在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。基于比较的排序算法是不能突破O(NlogN)的。简单证明如下:N个数有N!个可能的排列情况,也就是说基于比较的排序算法的判定树有N!个叶子结点,比较次数至少为log(N!)=O(NlogN)(斯特林公式)。而非基于比较的排序,如计数排序,桶排序,和在此基础原创 2021-05-05 16:41:07 · 499 阅读 · 0 评论 -
递归算法转换为非递归算法的技巧
递归函数具有很好的可读性和可维护性,但是大部分情况下程序效率不如非递归函数,所以在程序设计中一般喜欢先用递归解决问题,在保证方法正确的前提下再转换为非递归函数以提高效率。函数调用时,需要在栈中分配新的帧,将返回地址,调用参数和局部变量入栈。所以递归调用越深,占用的栈空间越多。如果层数过深,肯定会导致栈溢出,这也是消除递归的必要性之一。递归函数又可以分为尾递归和非尾递归函数,前者往往具有很好的优化效率,下面我们分别加以讨论。...原创 2020-09-28 22:33:30 · 3863 阅读 · 0 评论 -
寻找强连通分量的Tarjan算法
有向图的强连通分量在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法原创 2020-07-01 20:28:20 · 1138 阅读 · 0 评论 -
一文看懂3种背包问题
前言前面在动态规划详解一文种讲解了几个动态规划的基本问题。最近在工作中碰到了背包问题,写了一下基于动态规划的算法,决定写一篇文章总结一下。3种背包问题的比较背包问题:有N种物品和一个容量为b的背包,第i种物品的重量为,价值为,如何选择放入的物品使得总价值最大。根据每件物品的数量限制,就分为3种背包问题,定义如下:01背包:每种物品只有一件,要么选择放入,要么选择不放入 完全背...原创 2020-03-10 10:11:42 · 4176 阅读 · 1 评论 -
动态规划详解(2)
中级篇:二维DP问题接下来,让我们来看看如何解决二维的DP问题。问题描述:平面上有N*M个格子,每个格子中放着一定数量的苹果。你从左上角的格子开始,每一步只能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来,这样下去,你最多能收集到多少个苹果。解这个问题与解其它的DP问题几乎没有什么两样。第一步找到问题的“状态”,第二步找到“状态转移方程”,然后基本上问题就解决了。解这...原创 2020-02-10 16:19:01 · 387 阅读 · 0 评论 -
动态规划详解(1)
目录简介(入门篇)什么是动态规划,我们要如何描述它?“状态”代表什么及如何找到它?初级篇购买或销售股票的最佳时机最长非降子序列电梯调度问题简介(入门篇)什么是动态规划,我们要如何描述它?动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度,因此它比回溯法、暴力法等要快许多。...原创 2020-02-10 16:02:05 · 728 阅读 · 0 评论 -
寻找多数元素(主元素)
问题:有整型数组a[1…n],如果整数x在数组a中出现的次数多于半数,则x称为多数元素。初级方法:计算每一个元素出现的次数,算法复杂度O(NlogN)可以寻找中间值元素,因为多数元素在序列中必为中间值元素,时间复杂度是O(n)分析此问题: 容易证明引理:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。因此在以上引理的支持下,规模为n的问题就规约为求解规模为n-原创 2017-08-10 22:58:58 · 3327 阅读 · 0 评论