算法笔记
九筒-
这个作者很懒,什么都没留下…
展开
-
【排序算法】插入排序&归并排序&快速排序&堆排序
针对随机序列的排序算法随机生成序列void init(){ arr.clear(); for(int i = 0; i < n; ++i){ int num = (int)(round(1.0 * rand() / RAND_MAX * n));//生成0~n内的随机数 arr.push_back(num); } origin = arr;}插入排序时间复杂度为O(N2)具有稳定性//插排 void insertSort(){ for(int i = 0; i原创 2020-10-18 17:39:36 · 2413 阅读 · 0 评论 -
【分治法】快速幂
快速幂输入正整数????????,????????(????????≤109,????????≤1018)要求输出xp mod m m = 109+7样例输入3 5样例输出243思路分治法实现快速幂划分:当指数划分得足够小,即指数为0时,可以直接进行求解,返回1求解:通过对指数除以2缩小规模,划分时有指数为奇数,指数为偶数两种情况,针对这两种情况需要分别处理奇数时,指数-1转化为偶数偶数时,指数/2直接划分合并:返回值相乘得到原问题的解递归体:根据指数的奇偶性进行划分原创 2020-10-18 17:07:02 · 583 阅读 · 0 评论 -
【启发式算法】Python实现禁忌搜索算法求解TSP问题
禁忌搜索# -*- coding: utf-8 -*-import numpy as npimport randomimport mathimport matplotlib.pyplot as pltimport timeimport copy"""Desicribe:禁忌搜索解TSP问题"""# 原始数据coordinates = np.array([[565.0, 575.0], [25.0, 185.0], [345.0, 750.0], [945.0, 685.0], [84原创 2020-08-31 16:08:21 · 1859 阅读 · 0 评论 -
【启发式算法】Python实现遗传算法求解TSP问题
遗传算法# -*- coding: utf-8 -*-import numpy as npimport randomimport mathimport matplotlib.pyplot as pltimport time"""Desicribe:遗传算法解TSP问题"""# 原始数据coordinates = np.array([[565.0, 575.0], [25.0, 185.0], [345.0, 750.0], [945.0, 685.0], [845.0, 655原创 2020-08-31 12:46:36 · 798 阅读 · 0 评论 -
【启发式算法】Python实现模拟退火算法求解TSP问题
模拟退火算法相关参数初始温度T0结束温度Tend迭代次数Times温度衰减系数a算法流程数据初始化:计算距离矩阵(dist[i][j]表示i城市与j城市之间的距离);随机得到初始解(起点为0城市);编写距离计算函数在每个温度下,进行Times次迭代每次迭代时:求得新路径并计算其路径长度(通过二次变换法和数据切片交换来求得新解)若得到的新路径长度小于当前路径长度,则更新当前路径和当前路径长度,若与此同时新路径长度还优于最优路径长度,则同时更新最优路径及其长度模拟退火算法的核心:若得原创 2020-08-29 21:58:49 · 1650 阅读 · 0 评论 -
提高篇-平衡二叉树AVL-《算法笔记》同步笔记总结与补充
专题要点:可解问题:几点注意:原创 2020-04-10 11:50:25 · 135 阅读 · 0 评论 -
PAT甲级118-155题解析笔记索引-扩充《算法笔记》(解析+思路+AC代码)
前言PAT索引题目类型1001 A+B Format原创 2020-04-09 16:05:25 · 336 阅读 · 0 评论 -
提高篇-动态规划-《算法笔记》同步笔记总结与补充
这已经是本人第三遍学习动态规划了,其实现在脑子里还是乱糟糟的,容我想想怎么总结能有所收获,有所提升。第一遍单纯地比葫芦画瓢,留下的印象只是要具体问题具体分析,状态转移方程各不相同;第二遍对DP有了较为系统地认识,认识到了贪心只能达到局部最优,DP可以得到全局最优解;认识到了自底向上分析问题;认识到了状态转移的过程和分析;认识到了逆向求解决策选择情况。第三遍感觉比前两次有所提升,却还是有点讲不...原创 2020-03-26 17:35:12 · 284 阅读 · 0 评论 -
专项扩展-快乐模拟(全线崩盘!一点都不快乐!)-《算法笔记》同步笔记总结与补充
专题要点:可解问题:几点注意:原创 2020-03-22 11:12:40 · 203 阅读 · 0 评论 -
专题扩展-树状数组-《算法笔记》同步笔记总结与补充
专题要点:树状数组结构仍是普通数组,但在数组中的查询和更新过程类似于树状核心函数运算 lowbit(i) ((i) & (-i))的三种解释: 求i元素的二进制形式中最右侧“1”的位置;等价于求元素i的因数,且该因数是最大2的幂次;或者说是能被i整除的最大的2的幂次数据结构:int c[]:表示存放i号位之前lowbit(i)个元素和功能:getSum(int x):求x之前...原创 2020-03-19 15:17:14 · 94 阅读 · 0 评论 -
专题扩展-分块思想求解第K大元素-《算法笔记》同步笔记总结与补充
专题要点:数据结构:blockNum:块数eleNum:块中的元素范围table[]:统计第i个整数的个数block[]:统计每个块中元素个数算法思想:通过累加块中元素个数block[i],快速定位第K大元素所在块号,在定位的块中遍历table[],快速找到第K大元素注意:一个block块负责一个范围,在这个范围内遍历累加table[]并与K作比较两种实现:for循环...原创 2020-03-18 23:27:30 · 182 阅读 · 0 评论 -
解读!《算法笔记》的正确打开方式(目录索引+章节总结)
个人阅读《算法笔记》过程中,每啃完一章(难度高,内容多,不易消化的会对小节进行总结)会做一个小总结,总结里面涵盖这一章的专题要点,可解的问题,注意要点。个人水平和个人理解有不到位的地方,请指正讨论。目前正在啃动态规划,PAT甲乙级代码会放在Github上欢迎大家下载——PAT甲乙级代码合集希望大家可以watch,star,fork三连持续更新中……预计四月底完成目录第1章 如何使用本书:...原创 2020-03-17 13:34:41 · 3793 阅读 · 2 评论 -
入门篇-数学问题-《算法笔记》同步笔记总结与补充
专题要点:可解问题:个人逻辑不够清晰,if,while等逻辑顺序不合理几点注意:原创 2020-03-17 11:28:28 · 205 阅读 · 0 评论 -
提高篇-图论-《算法笔记》同步笔记总结与补充
专题要点:点权和边权:顶点和边均可具有权值,根据题意判断。邻接矩阵:边的权值可以存入矩阵中,点的权值需要另存储在一位数组中;邻接表:点权边权都可以用结构体存储图的遍历dfs,bfs:遍历时,要对所有顶点进行搜索,防止出现图不连通的情况。搜索的次数即为图中连通块的个数可解问题:几点注意:首先要注意图中点和边虽然不同,却又息息相关:如点权边权,和删除点或删除边遍历过程中需要...原创 2020-03-12 11:12:24 · 229 阅读 · 0 评论 -
提高篇-最短路径问题(图论)-《算法笔记》同步笔记总结与补充
专题要点:单源最短路径Dijkstra可解问题:几点注意:要得到具体路径,必须通过pre[]和dfs(递归)思想,注意是逆向访问(即从终点访问到起点)Dijkstra(不对多条最短路径dfs):要根据题目要求增减边权花费数组c[],点权资源数组w[],最短路径条数num[];要注意各个数据结构的初始化问题Dijkstra + dfs:前提:声明前驱结点集合v...原创 2020-03-10 13:06:14 · 351 阅读 · 0 评论 -
图论-全源最短路径-对比Floyd算法与暴力Dijkstra算法
题目输入顶点数N,有向边数M,接下来M行输入格式为u,v,w分别代表两个顶点u,v和两点之间边的权值w。输出全源最短路径输入样例:6 80 1 10 3 40 4 41 3 22 5 13 2 23 4 34 5 3输出样例:0 1 5 3 4 61073741823 0 4 2 5 51073741823 1073741823 0 1073741823 107374...原创 2020-03-10 13:04:40 · 332 阅读 · 0 评论 -
本科期间算法练习的经验与误区以及个人备战记录
本科算法经验1、本科期间学习过数据结构,算法设计与分析相关课程2、有一些代码量,做过一些网站,小程序,系统3、大三寒假曾备战过一个月的某个比较水的算法比赛回顾总结现在回想,谈一下我当时的情况1、当时寒假备战不够深入,整个过程有点像是吃快餐,导致对算法的认识仍然不够透彻,吃不透算法思想,最后效果没有达到预期的结果2、AC完一道题目之后不会举一反三,仅仅是做完了这道题目,导致会的永远都会...原创 2019-12-13 18:05:12 · 490 阅读 · 7 评论 -
提高篇-树结构-《算法笔记》同步笔记总结与补充
专题要点:几点注意:动态与静态树:Node* root存放的是结点地址;int root存放的是结点在结构体数组中的下标结构体指针变量,root == NULL与 *root == NULL的区别:插入,删除操作的形参需要引用:遍历:一般树的dfs等价于先根遍历,bfs等价于层序遍历;完全二叉树的性质:可以使用一维数组顺序存放(直接按规律递归访问即可,无需使用结构体指明左右子节点...原创 2020-03-05 15:55:47 · 215 阅读 · 0 评论 -
提高篇-并查集(树结构章节)-《算法笔记》同步笔记总结与补充
专题要点:并查集即集合,其主要作用为:合并与查找并查集可以抽象为树结构,并具有与树类似的性质如:具有根节点的概念,结构无环并满足(N个结点N-1条边,下文题目通信系统用到这一特性)并查集初始化的意义:对元素顺序赋值进行初始化。即将所有的元素视为相互独立的集合,便于之后的合并数组(合并只对不同集合的元素进行合并)并查集的数据结构father[]的含义:第i个元素的根节点为father[i]...原创 2020-03-03 20:45:43 · 202 阅读 · 0 评论 -
i++与++i必须要区分(for循环中)的细节
表面区别++i是先加在赋值;i++是先赋值再加。这样记忆:++在前就先加代码中初始:i = 1for循环中i++与++i的区别(根本区别)在for循环中++i与i++到底有没有区别,只放在for循环里,区别不大,但是要明白他们的区别i++是先用后加,++i是先加后用,所以区别就是。。。看下面代码你就懂啦。//模拟a=i++;temp=i;i=i+1;a=temp; //...原创 2020-02-29 17:05:34 · 1370 阅读 · 0 评论 -
二叉树经典问题-根据层序与中序重建二叉树+前序后序无法确定二叉树的原因(另附前序,后序)
敲层序与中序花了好一会儿功夫总体思路:前后层序均是为二叉树提供根节点;中序是依据所提供的根节点来划分左右子树;然后递归,在左右子树中继续寻找根节点划分左右子树,直到遍历完所有子树。层序与中序给出层序中序重建二叉树方法与给出前后序的思路略有不同层序遍历的特点是所有的根节点均依次在序列的前面,并且序列中左右子树混乱排列,并不集中。因此层序的难点在于找出根节点(因为所有根节点均排列在序列...原创 2020-02-28 13:39:51 · 686 阅读 · 0 评论 -
提高篇-广度优先搜索BFS-《算法笔记》同步笔记总结与补充
专题要点:几点注意:边界问题:与DFS的递归不同,BFS的while循环并没有单独做边界判断进行return,一般在遍历周围节点入队时的if条件就是边界PAT更优的解题思路A1065个人思路...原创 2020-02-26 10:16:06 · 251 阅读 · 0 评论 -
提高篇-深度优先搜索DFS与剪枝-《算法笔记》同步笔记总结与补充
搜索作为算法的开篇需要彻底吃透,因此搜索专题将dfs与bfs分开进行总结。在练习dfs之前,必须要将递归吃透,自己能力还是有限,递归部分一直很困扰我,这次要花费大量时间,彻底将递归和dfs吃透弄懂!可解问题n皇后问题:八皇后问题,数独,迷宫求子集问题:从n个数字中选出k个数字并满足x条件,如背包问题,全排列问题(特殊的求子集问题),求子序列问题专题要点:本章个人认为从递归参数,递归...原创 2020-02-22 20:36:03 · 379 阅读 · 0 评论 -
提高篇-链表处理-《算法笔记》同步笔记总结与补充
时隔两个月再次拾起来算法,用链表找找感觉专题要点:在初学C时,一旦涉及指针和链表准懵。其实链表是一个数据结构,是一种思想,对于离散存储的数据可以顺序访问。链表分为动态链表和静态链表,动态链表是通过指针进行访问的,静态链表是通过数组下标进行访问的。本章节主要以静态链表为主,中间涉及对静态链表的排序问题。几点注意:链表的思想与静态链表的思想:链表思想通过next来访问离散的数据结构;静态链...原创 2020-02-19 22:03:21 · 131 阅读 · 0 评论 -
入门篇-字符串处理--《算法笔记》同步笔记总结与补充
专题要点:本专题极其考验代码能力,逻辑能力与分析能力。我个人认为这一专题是区分新手和入门的分界线。许多新手出现的问题是:初看题目比较简单,易懂,但在字符串的输入输出就卡住了(字符串与字符数组的输入输出问题);许多入门“新手”出现的问题是:初看题目比较简单,但越分析越复杂,越分析越毫无头绪,导致最后心态炸裂。文章最后我在补充重新总结两道比较让我觉得费脑子的题目。因此我作为新手,通过自己在这一章联...原创 2019-11-19 16:35:34 · 196 阅读 · 0 评论 -
C++STL-《算法笔记》同步笔记总结与补充
专题要点:对算法要求不高,主要是对***代码能力,细节处理,题意理解,合理的数据结构(一维多维数组,结构体)***的掌握与运用几点注意:1、要注意输入格式,尤其是字符串的输入(getchar()吃掉最后的‘\n’),输出格式(控制多余的空格与换行)2、输出顺序(字典序,升降序)3、过程中是否要保留小数,四舍五入,以便于最后输出正确结果4、数据范围不明确时的处理方法(取模循环,!=EOF...原创 2019-12-11 10:08:41 · 241 阅读 · 0 评论 -
栈的三个经典问题--《算法笔记》同步与补充
栈的经典问题逆波兰式问题(后缀表达式),括号匹配问题,序列输出问题逆波兰式问题概述:题目给出中缀表达式,要求计算出相应的结果题目链接题目思路:1、中缀表达式转换为后缀表达式原因:中缀表达式适合人类思维,但计算机很难处理,通常要转化为后缀表达式,利用栈处理2、计算后缀表达式具体思路:1、设置操作符栈(通过比较操作符的优先级,确定是否出栈),设置队列来存放后缀表达式2、扫描遍历...原创 2019-12-10 23:25:39 · 341 阅读 · 0 评论 -
算法初步-twoPointers-《算法笔记》同步笔记总结与补充
专题要点:此处的Pointers并非指针,而是指数组的下标,了解过二分法之后,对这个思想或者说是编程技巧,应该是比较容易掌握的。此思想主要是为了对数组进行划分(或者说是扫描),以提高数组的遍历效率Two Pointers思想:应用的条件:个人认为,适用于两者之间,且数据之间存在明显关系的(大小关系,求和关系,两者之和相等的关系),以方便进行比较,根据比较结果来判断两个下标指针的移动情况。做...原创 2019-11-29 14:56:19 · 148 阅读 · 0 评论 -
二分法精讲剖析及个人理解(通俗,适合新手)-《算法笔记》同步笔记总结与补充
二分法这一章,做题时的难度明显感觉要高于前几章专题要点:对二分思想的掌握与运用是这一专题的要点,个人认为,理解二分思想中的二分取值(即left,right,mid),二分判断条件(mid > key, mid < key, mid == key),二分的循环条件(left < right, left <= right),二分的返回值(return left/right,...原创 2019-11-27 16:12:12 · 929 阅读 · 0 评论 -
算法初步-贪心法-《算法笔记》同步笔记总结与补充
专题要点:几点注意:A1065个人思路原创 2019-11-25 22:56:54 · 182 阅读 · 0 评论 -
算法初步-散列-《算法笔记》同步笔记总结与补充
专题要点:散列最重要的运用就是方便查找,提高效率。个人认为本专题是对提高代码效率的最基础最常用最有效的方法,必须掌握。常见的数组散列表有,字母表,ASCII码,数字表等。几点注意:1、当数据量小时,可将数据值作为数组下标2、当数据量大时,取余3、二维坐标散列:H(Point) = x * Range + y (x >= 0, y <= Range)4、字母散列:个人常用H...原创 2019-11-22 23:04:18 · 153 阅读 · 0 评论 -
算法初步-排序-《算法笔记》同步笔记总结与补充
专题要点:本专题主要是对结构体进行排序,写出合适的排序算法以满足题意,并提高查找与数据处理的效率几点注意:1、字符数组无法直接比较大小,必须用strcmp();string容器可以直接使用比较运算符比较大小2、字符串比较函数的返回值,可以用整型变量代替(int s = strcmp(str1, str2))3、自定义的bool cmp()比较函数中,一定要有if条件外的返回值,不能单单只...原创 2019-11-22 21:22:43 · 234 阅读 · 0 评论 -
入门篇-图形输出,日期问题,进制转换--《算法笔记》同步笔记总结与补充
由于两个专题比较简单,放在一起讲了专题要点:图形输出:即为找规律,此类型题一定在图形排列中存在规律(行,列,空格等),如果一时没有发现,不用死磕,但光凭想象不够,多画几张简单的符合题意的图更直观一些。日期问题:总结下来无非是判断天数,星期,日期的问题(若是填空题,Excel即可,没必要写程序求解)。几点注意:1、图形输出,尤其是字符矩阵,要注意先对矩阵进行初始化(根据题目要求初始化成...原创 2019-11-18 15:06:02 · 249 阅读 · 0 评论 -
入门篇-查找元素--《算法笔记》同步笔记总结与补充
专题要点本专题与第四章散列有点类似,主要目的是尽可能把查找元素的时间降低到O(1),常用到一些散列方法,结构体排序等。几点主要:1、如有具有唯一性的数据,可令其作为数组下标进行统计(类似线性散列)2、题目中关于对字符数组“不超过xxx”的描述,仍然要开得尽量大一些,因为字符数组的最后一位是’\0’3、对于特定格式的输入,如日期(yyyy/mm/dd)或时间(hh:mm:ss),使用sca...原创 2019-11-17 16:25:34 · 191 阅读 · 0 评论 -
入门篇-简单模拟--《算法笔记》同步笔记总结与补充
专题要点:对算法要求不高,主要是对***代码能力,细节处理,题意理解,合理的数据结构(一维多维数组,结构体)***的掌握与运用几点注意:1、要注意输入格式,尤其是字符串的输入(getchar()吃掉最后的‘\n’),输出格式(控制多余的空格与换行)2、输出顺序(字典序,升降序)3、过程中是否要保留小数,四舍五入,以便于最后输出正确结果4、数据范围不明确时的处理方法(取模循环,!=EOF...原创 2019-11-17 15:07:46 · 681 阅读 · 1 评论