
数据结构与算法
纸上得来终觉浅~
周围的人都比你厉害,你才会慢慢变强
展开
-
红黑树和B树
红黑树和B树应用场景有何不同?2者都是有序数据结构,可用作数据容器。红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。B树多用在内存里放不下,大部分数据存储在外存上时。因为B树层数少,因此可以确保每次操作,读取磁盘的次数尽可能的少。在数据较小,可以完全放到内存中时,红黑树的时间复杂度比B树低。比如treemap。反之,数据量较大,外存中占主...转载 2019-10-20 16:05:23 · 400 阅读 · 0 评论 -
hashmap实现原理及常见问题
数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。哈希表:那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表...原创 2019-10-19 18:09:23 · 201 阅读 · 0 评论 -
最短路径的两种算法(迪杰斯特拉算法和弗洛伊德算法)
一、迪杰斯特拉(Dijkstra)算法1、定义描述Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法的时间复杂度为O(N^2)。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径:2、算法思想设G=(V,E)是一个带权有向图,把图中顶点集合...转载 2019-10-13 14:59:10 · 4632 阅读 · 0 评论 -
最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。 生成树:一个连通图的生成树是指一个连通子图,它含有图中...转载 2019-10-13 14:39:00 · 1283 阅读 · 0 评论 -
红黑树
1、写在前面当在10亿数据中只需要进行10几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我...转载 2019-10-12 21:04:25 · 194 阅读 · 0 评论 -
二分搜索算法与贪婪算法
本文整理于【拉勾*力扣】课程笔记,侵删~1、二分搜索2、二分搜索算法实现(递归、非递归)(1)递归写法:(2)非递归写法3、题型一:找上下界问题4、题型二:找模型的边界问题5、题型:旋转后的排序数组6、题型:不定长的边界7、贪婪算法...原创 2019-09-24 14:25:27 · 544 阅读 · 0 评论 -
动态规划
本文整理于【拉勾*力扣】课程笔记,侵删~1、动态规划定义2、例题:最长上升子序列的长度题目:解法:1、暴力搜索:2、动态规划:这个状态转移方程的含义是:以nums[n-1]结尾的最长子序列长度,等于以nums中0到n-2任意一个数字结尾的最长子序列长度+1代码:递归写法递归写法时间复杂度分析:递归+记忆化:直...原创 2019-09-24 12:59:58 · 128 阅读 · 0 评论 -
深度优先搜索DFS和广度优先搜索BFS
本文整理于【拉勾*力扣】课程笔记,侵删~1、深度优先搜索2、深度优先搜索算法思想(栈)先选择一个节点A放入栈中,并标记访问过,输出结果;将与A相连的、没有被访问过的节点,选择一个节点B放入栈中,并标记访问过,输出结果;重复以上操作...,结果为A B E G,此时,与当前节点G相连的节点都被访问过,于是将其从栈中弹出;同理弹出E;重复以...原创 2019-09-24 00:13:56 · 375 阅读 · 0 评论 -
递归与回溯
本文整理于【拉勾*力扣】课程笔记,侵删~1、递归2、例题:汉诺塔题目:将A上所有盘子挪到C上解法:要想将A上所有盘子挪到C上,首先要将A上前n-1个盘子放在B上,将第n个盘子放在C上,再将前n-1个盘子放在C上;同理,再将B上的前n-2个盘子放在A上,将B上最大的盘子放在C上,再将A上的n-2个盘子放在C上;以此类推...代码实现:...原创 2019-09-23 23:37:24 · 178 阅读 · 0 评论 -
排序算法
本文整理于【拉勾*力扣】课程笔记,侵删~1、常用排序算法2、冒泡排序3、例题:冒泡排序题目:解法:从数组第一个元素开始,相邻元素比较大小,如果前面元素>后面元素,则两两交换;第一趟冒泡的结果是:【1,2,7,5,8,9】,最大的元素放置在数组末尾;第二天冒泡的结果是:【1,2,5,7,8,9】,第二大的元素放置在数组倒数第二个位置;...原创 2019-09-23 14:24:20 · 257 阅读 · 0 评论 -
优先队列、图、前缀树、线段树、树状数组
本文整理于【拉勾*力扣】课程笔记,侵删~1、优先队列向上筛选:每次新元素放在最底部,然后和它的父节点比较,若新元素优先级高,则交换新元素与父节点的位置,直到无法交换向下筛选:每次新元素放在最顶部,然后和它的两个子节点比较,如果哪个子节点的优先级高,则交换新元素与这个子节点的位置,直到无法交换。2、题目:前K个高频元素(优先队列经典题型)先使用哈希表记...原创 2019-09-23 11:46:07 · 440 阅读 · 0 评论 -
平衡二叉(查找)树
平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 —-来自百度百科由于普通的二叉查找树会容易失去”平衡“,极端情况下,二叉查找树会退化成线性的链表,导致插入和查找的复杂度下降到 O(n) ,所以,这也是平衡二叉树设计的初衷。那么平衡二叉树如何保持”平衡“呢?根据定义,有两个重点,一是左右两子树的高度差...转载 2019-09-23 00:44:31 · 372 阅读 · 0 评论 -
二叉查找树
二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 任意节点的左、右子树也分别为二叉查找树;(4) 没有键值相等的节点。如上图所示,是不同形态的二叉查找树。二叉...转载 2019-09-23 00:38:25 · 542 阅读 · 0 评论 -
数组、字符串、链表、栈、队列、双端队列、树
本文整理于【拉勾*力扣】课程笔记,侵删~1、题目:字符串翻转解法:两个指针指向首尾,元素交换,指针向中间移动,继续交换元素2、数组优缺点3、题目:有效的字母异位词(数组)解法1:两个长度为26的数组,分别统计两个字符串中各字母的个数,比较两个数组即可解法2:一个长度为26的数组,出现在s中,该位置+1,出现到t中,该位置-1,判断是否每个位置都...原创 2019-09-22 23:54:36 · 245 阅读 · 0 评论