数据结构与算法
数据结构与算法
「已注销」
驻马处皆故里 深巷卖杏花
展开
-
随机选择算法
问题如何从一个无序数组中求出第 K 大的数(为了简化讨论,假设数组中的数各不相同)。例如,对数组 { 5,12,7,2,9,3 }来说,第三大的是 5,第五大的是 9随机选择算法概念最直接的想法是对数组排序,然后取出第 K 个。这样做法时间复杂度 O(nlogn),虽然看起来很好,但是还有更优的算法。随机选择算法,对任何输入都可以达到 O(n)的期望时间复杂度随机选择算法的原理类似于 随机快速排序假设主元为 A[p],当对 A[left,right] 执行一次 randPartition 函原创 2020-05-25 13:53:36 · 4118 阅读 · 2 评论 -
活用递推
许多题目需要细心考虑是否可能用到递推关系例如就一类涉及序列的题目来说。假如 序列的每一位所需要计算的值 都可以通过 该位左右两侧的计算结果得到,那就可以考虑所谓的“左右两侧的结果”是否可以通过递推进行预处理来得到,这样在后面的使用中就可以不必反复求解例题:PAT B1040/A1093 有几个PAT题目描述字符串 APPAPT 中包含了两个单词“PAT”,其中第一个PAT是由第二位(P)、第四位(A)和第六位(T)组成的;第二个PAT是由第三位(P)、第四位(A)和第六位(T)组成的。现给定字符串,原创 2020-05-23 12:40:36 · 214 阅读 · 0 评论 -
打表
打表是典型的 空间换时间,一般指将所有可能需要用到的结果事先计算出来存入表,后面如果需要就直接查表。常见方法有以下几种:程序中一次性计算所有需要用到的结果,之后需要用到直接取最常用的方法如一个大量查询 Fibonacci 数 F(n) 的问题中,如果每次查询都要计算是很耗时的,假设查询 Q 次,时间复杂度即为 O(nQ)。如果进行预处理,即把所有的 Fibonacci 数预先计算并存在数组中,每次查询就只要 O(1),Q 次查询的时间复杂度 O(n+Q)在程序 B 中事先算好需要用到的原创 2020-05-23 12:39:48 · 1317 阅读 · 0 评论 -
Two Pointer:快速排序
首先解决的问题快速排序平均时间复杂度 O(nlogn)它的实现要先解决解决了这样的一个问题:对一个序列 A[1]、A[2]、……、A[n]。调整序列中元素的位置,使得 A[1](原序列的 A[1],下同)的左侧所有元素都不超过 A[1]、右侧所有元素都大于 A[1]。例如序列 { 5,3,9,6,4,1 } 来说,可以把 A[1]=5 调整到满足条件的位置,如序列 { 3,1,4,5,9,6 },这样 5 的左侧元素都不超过它,右侧元素都超过它,如图 4-10这个问题很多方案解决,下面给出速度原创 2020-05-19 07:16:49 · 311 阅读 · 0 评论 -
Two Pointer:归并排序
归并排序是一种基于“归并”思想的排序方法,本节主要介绍其中最基本的2-路归并排序。2-路归并排序的原理是,将序列两两分组,将序列归并为 n/2 个组,组内单独排序;然后将这些组再两两归并,生成 n/4 个组,组内再单独排序;以此类推,直到只剩下一个组为止。归并排序的时间复杂度为O(nlogn)。例子将序列 { 66,12,33,57,64,27,18 }进行2-路归并排序① 第一趟排序:两两分组,得到四组:{ {66,12}、{33,57}、{64,27}、{18} }。组内单独排序,得到新序列原创 2020-05-17 15:08:57 · 161 阅读 · 0 评论 -
Two Pointer
很少有教材拿出来讲,因为Tow Pointer不像是一种算法,更像是一种编程思想广义上的 Two Pointer 是利用问题本身与序列的特性,使用下标 i, j 对序列进行扫描,以较低复杂度(一般是O(n))解决问题给出以下两个例子找出递增序列中满足a+b=M的a和b的位置问题给定一递增正整数序列和一正整数M,求序列中两个位置的数:a 和 b,满足:a+b=M比如给定序列 { 1,2,3,4,5,6 },M = 8,就存在 2+6=8、3+5=8一般解法直观解法是二重循环for(int原创 2020-05-17 13:47:47 · 219 阅读 · 0 评论 -
二分:快速幂
问题给定三个正整数 a、b、m( a<109,b<106,1<m<109),求 ab % m 的值一般写法为了防止溢出使用long,Java代码,long为64位,等同于 C语言 的 long longpublic long binaryPow(long a, long b, long m){ long ans = 1; for(int i = 0; i < b; i++){ ans = ans * a % m; }原创 2020-05-15 13:42:03 · 252 阅读 · 0 评论 -
二分:寻找有序数列第一个满足某条件的元素的位置
问题有这样的问题:如果递增序列 A 中的元素可能重复,那么如何对给定的欲查询元素x,求出序列中第一个大于等于x的元素的位置L以及第一个大于x 的元素的位置R。序列中第一个大于等于x的元素的位置先看第一问例如对下标从0开始、有5个元素的序列 {1,3,3,3,6}来说,如果要查询 3,则应当得到 L=1、R=4;如果查询 5,则应当得到L=R=4;如果查询 6,则应当得到 L=4、R=5;而如果查询8,则应当得到L=R=5。显然,如果序列中没有x,那么L和R也可以理解为假设序列中存在x,则x应当在的原创 2020-05-12 14:39:18 · 686 阅读 · 0 评论 -
递归:N皇后问题
了解N皇后问题之前,可以先了解递归:全排列问题N皇后问题在N*N的国际象棋盘上放置N个皇后,要求每个皇后的:同一行,同一列,对角线不会出现其他皇后,输出合法方案的个数解析如果采用组合数方式枚举法的话,从n2个位置找出n个位置,需要Cnnxn的枚举量,n=8时就是54 502 232次枚举换个思路,由于每行每列都只放一个皇后,那么把每列标记一个列号i,每行标记一个行号j,在第i列中,皇后...原创 2020-02-08 17:11:49 · 118 阅读 · 0 评论 -
递归:全排列问题
全排列问题给出1~n,n个整数,把这n个整数按照这种顺序输出n个数的所有排列:按照字典序从小到大顺序输出,如果说(a1,a2,……an)的字典序小于(b1,b2,……bn),指的是存在一个i,使得a1=b1,a2=b2,……a(i-1)=b(i-1),ai<bi例如:1,2,3三个数按顺序输出全排列就是(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(...原创 2020-02-08 16:11:54 · 572 阅读 · 0 评论 -
区间贪心:区间不相交问题和区间选点问题
贪心算法目的:求解一类问题的最优解或较优解解释:将一个问题分成几个局部,解决问题时总是考虑局部最优(或较优)解,这种情况下得到的结果也是最优(或较优)的注意:我们再看贪心算法解决的一道题时可能会发现,贪心算法有很多“不一定”,“不一定”得到的就是最优解,贪心算法并不强求得到最优解,得到较优解也可以区间贪心:区间不交集问题题目给出N个开区间(x,y),从总选择尽可能多的区间,使这些开区间...原创 2020-02-08 14:50:52 · 1213 阅读 · 0 评论 -
刷题:一个新JAVA选手学到的技巧
最近在拿着《算法笔记》刷PAT的一些题目,准备使用JAVA考一次CSP,发现因为算法题JAVA选手不太多,网上很少有针对JAVA选手的指南,于是把这几天查到的、学到的一些技巧整理出来第一次刷题,学艺不精,我的文章有任何问题或者大家有其他经验技巧的话,很希望能得到大家的指导这篇文章会随着我的学习一点一点更新完善,有同为JAVA选手的话欢迎大家一起交流我也写了一些针对于JAVA实现的、我认为能学...原创 2020-02-06 20:27:07 · 378 阅读 · 1 评论 -
什么是堆排序
堆排序是使用二叉堆这样强大的数据结构来实现的排序回顾:二叉堆的特性二叉堆本质上是一种完全二叉树最大堆(最小堆)的堆顶是整个堆中的最大(最小)元素原理当我们删除一个最小堆的堆顶的时候是把堆顶的元素删除,并把最后一个元素拿到堆顶这时如果我们不把堆顶元素删除,而是把堆顶和最后一个元素替换,并把堆的有效长度减1之后向下调整67,使堆保持稳定重复上述操作将现在有效长度内的最后...原创 2020-02-03 17:01:45 · 565 阅读 · 0 评论 -
什么是二叉堆
二叉堆是一种完全二叉树,有两种类型:最大堆(大根堆)、最小堆(小根堆)二叉堆是堆排序和优先队列的基础数据结构名词概念最大堆:父节点比子节点大或相等的二叉堆最小堆:父节点比子节点小或相等的二叉堆堆顶:二叉堆的根节点就是堆顶,最小堆的根节点是最小值,最大堆的根节点是最大值二叉堆的存储方式二叉堆虽然是一颗完全二叉树,但是它并不是采用链式存储,而是采用顺序存储也就是说,二叉树的存储...原创 2020-02-03 16:53:10 · 762 阅读 · 0 评论 -
三个奇葩的排序算法
今天在小灰前辈那看了的三个排序算法哈哈哈哈哈秀到我了睡眠排序哈哈哈哈哈哈哈哈哈隔天秀来了方法对于一组数,每一个数都创建一个线程,线程刚创建就让其sleep,sleep时间长度为数的值,醒来的先后顺序就是从小到大的排序代码public static void sleepSort(int[] array){ for (int num : array) { ne...原创 2020-02-03 16:41:40 · 561 阅读 · 0 评论 -
Floyd-弗洛伊德算法
Floyd-弗洛伊德算法1暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。现在需...转载 2019-06-26 16:22:38 · 128 阅读 · 0 评论