底层数据结构由链表和哈希表组成。
添加和删除数据很方便,但访问起来很耗时。
大批
访问数据很容易,添加和删除数据很费力
堆
堆栈 (LIFO) 队列 (FIFO) 哈希表
推荐观看:
二叉树
删除数据时数据结构链表底层数据结构路径算法与删除数据匹配(一)
,如果节点没有子节点,直接删除。如果删除一个,则将添加子节点。如果有两个,从左子树中删除最大的一个并添加它。
比较的次数取决于树的高度。所以如果节点数为n,并且树的形状比较平衡,那么最大比较和移动的次数是log2n。所以时间复杂度是O(logn)。但是,如果树的形状在一侧纵向延伸,树就会变得非常高,时间复杂度变为 O(n)。
常用算法 排序 数组 搜索 安全算法 查找图 其他算法
【扩张】
图的表示:邻接矩阵和邻接表
遍历算法:深度搜索和广度搜索(必填)最短路径算法:Floyd,(必填)最小生成树算法:Prim,(必填)实际常用算法:关键路径,拓扑排序(原理与应用)二分图匹配:配对,匈牙利算法(原理与应用)扩展:中心性算法、社区发现算法(原理与应用)
2.图还是比较难的,不过我觉得图里面涉及的很多算法还是挺实用的,比如最短路径的计算等等。对于图,还是推荐看这里的书。第四版。
3、搜索和回溯算法
贪心算法(必学)
启发式搜索算法:A*寻路算法(了解)
地图着色算法、N 皇后问题、最优加工顺序
这个方便的知识与一些算法有关。我觉得如果可以java回溯算法,就学吧。必须学习诸如贪心算法之类的想法。建议刷题学习,直接刷题。
4、动态编程
树形DP:01背包问题
线性DP:最长公共子序列、最长公共子串
区间DP:矩阵最大值(和以及积)
数位DP:数字游戏
我认为动态规划是最难的算法思想。记得第一次接触动态规划的时候,是看01背包问题的。我不会做这个问题,但我能理解答案。一气之下,连续刷了几十个话题,掌握了动态编程套路,也有了自己的一套模板。但说实话java回溯算法,动态编程真的是很多测试。学习算法和刷题一定要掌握。建议先了解一下什么是动态规划,再刷题。反正一般都是以上几类题。
5、字符匹配算法
正则表达式
6、流相关算法
最大流:最短增广路、Dinic 算法
最大流最小割:最大收益问题、方格取数问题