数据结构系列
卜若
love game,love life
展开
-
卜若的代码笔记-数据结构系列-第十九章:二叉树的定义
1.定义一个二叉树其实很容易。1.1 节点对于任意节点都存在两个子节点,分别是左节点和右节点public class TreePoint<T> { public TreePoint(){ } public TreePoint(T value){ this.value = value; } TreePoint leftPoint; TreePoint rightPoint; T value;原创 2020-05-28 12:19:05 · 152 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十八章:队列的经典应用.广度搜索
1.先来看题目实现原理很简单,就是从边缘向内部搜索,你可以深度搜索或者广度搜索。就不做介绍了/* * @lc app=leetcode.cn id=130 lang=java * * [130] 被围绕的区域 */// @lc code=startclass Solution { public void solve(char[][] board) { bfs(board); }public static void b原创 2020-05-21 20:26:30 · 119 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十七章:队列二.链表实现
1.使用数组实现的两种方式,不前移和前移的优劣分别是不前移的优劣:入队和出队的时间复杂度均为o(1)但是极度吃内存,反正公司里面写这种代码是要挨打的前移的优劣:出队时间复杂度为o(n)这种写也要挨打。so,有没有更好的实现方式?2.基于链表的实现当然后,那就是链表图17-1实现代码://接口见上一章public class TLinkQueue<T> implements IQueue<T> { private in原创 2020-05-19 15:51:57 · 113 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十六章:队列一.数组实现
1.实现思路如图16-1所示图16-1:当然,这种实现办法有好处也有坏处。坏处是,数组原先的资源没有被释放,留着占内存。另外,如果使用固定长度的数组,那么很容易就会满数组,从而爆出指针超过边界的文图优化方式见图16-2好处是,入队和出队的时间复杂度是o(1)图16-2:对于图2的方法,可以节省了空间的开销,但是,对于出队的操作时间复杂度则是o(n)。这种写法其实不是很好以下是图16-1的实现代码:public interface IQueue&l..原创 2020-05-19 15:23:06 · 102 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十五章:栈的经典应用.深度优先搜索
1.这是在Leetcode上的一道题,我们去看一下它的题目实现过程比较简单,因为代码会在LeetCode里面提交,我们就不用自己的写的栈和链表了,我们学习使用一下Java的内部栈对象和动态数组以下代码是通过LeetCode测试的代码。/* * @lc app=leetcode.cn id=1020 lang=java * * [1020] 飞地的数量 */// @lc code=startclass Solution { public int numEnclaves.原创 2020-05-18 17:19:28 · 159 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十四章:栈的总结(动态数组栈,数组栈,链栈)
1.就一张图吧原创 2020-05-17 15:06:27 · 87 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十三章(补充):泛型单向链表
1.泛型元素public interface Element<T> { Element getNext(); void setNext(Element t); T getValue(); void setValue(T t);}2.泛型元素的实现package DoubleDirTable;public class TElement<T> implements Element<T> { public原创 2020-05-17 15:01:10 · 97 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十二章:栈三.链栈
1.太简单了,不介绍了,直接贴代码,有问题请看10,11,章//测试代码 public static void main(String[] args) throws IOException { LinkStack<Integer> intStack = new LinkStack<>(); for (int i =0;i<100;i++){ intStack.push(i); }原创 2020-05-17 14:58:59 · 83 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十一章:栈二.顺序栈(动态数组栈)
1.首先来说明一下什么叫做动态数组。本质上还是数组,只是每次向数组里面添加的时候,如果检查到数组的长度不够的时候,就会产生以下动作:a.new 一个两倍容量数组b.将原始数组拷贝进去关于拷贝方式的性能比较,我找到一篇比较好的博客https://www.cnblogs.com/tabCtrlShift/p/9440566.html可以去看一下。c.释放掉原始数组(关于释放的问题,我会单独开辟一个专栏去介绍。在java里面我们默认自动释放)分析后我们发现,我们目前需要..原创 2020-05-17 13:27:23 · 188 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第十章:栈一.顺序栈(数组栈)
1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈。1.1栈的操作1.1.1 出栈pop()函数允许栈出,栈出之后,顶数据有移除操作。时间复杂度o(1)1.1.2 入栈push()函数入栈,入栈之后,前一个数据网后呀。时间复杂度o(1)1.1.3 顶数据获取:peek()函数不会做数据的移除。时间复杂度o(1)1.1.4 判空函数len()当用于遍历的时候,需要知道判空的终止节点。1.1.5 元素获取:search(int in.原创 2020-05-17 12:24:03 · 214 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第九章:链表体系实现类图
1.链表实现类图2.操作元素的实现类图我们可以看到,当我们企图依托于数据结构去实现某些解决策略的时候,我们不需要再构造一个复杂的新链表,比如我们的RevenueTable,去实现营业额的统计时,我们不会再重写它的插入,删除方法,我们只希望在遍历的时候自动实现某些操作,这样我们继承之后实现就很舒服了。在第七章里面的营业额的代码,我们看一下,其实仅仅只需要:几行代码,就能够实现。这就是多态的魅力。而我这种写法,也叫做模板模式。有兴趣的同学可以去了解一下。当数据结构和设计模式结合在一起..原创 2020-05-16 15:32:55 · 231 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第八章:链表-循环链表的典型应用:丢手绢
1.算法题目有一群小屁孩围坐一圈,编号从1排到10。然后主持者丢了一个骰子,1~6,会随机出一个数,比如出了一个3,然后他们就从头开始,数1,2,3,...数到3的人出队,其余人再继续数,直到只剩下两人,那其他人请那两人吃雪糕。问:谁最后一个出队。你看,这个就是一个典型的循环链表的问题。实现过程如下所示,我们定义了一个HankGame表,然后加入了10个小学生,然后循环抽取。 public static void main(String[] args) throws IOExcep.原创 2020-05-16 15:18:37 · 134 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第七章:链表-循环链表的实现
1.继承自双向链表,然后把双向链表的尾巴的end的next指向head。然后它的Insert,delete,get,函数不变。 public static void main(String[] args) throws IOException { int[] data = new int[4]; data[0] = 1; data[1] = 2; data[2] = 3; data[3] = 4; //原创 2020-05-16 14:27:21 · 82 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第六章:链表-双向链表应用典型-营业额统计问题
Description给出n个数,求每个数和它前面每个数的差值绝对值的最小值之和。n<=32767求解思路相当简单,如果你使用双向链表的话。获得当前值,然后前驱,求取和这个值的差值。对所有值用一个单项链表去存储。然后统计单项链表的sum值。所以,我们需要派生一个双向接口,关于双向接口的设计,请参考第四章。...原创 2020-05-16 14:07:25 · 118 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第五章:链表-三四章中链表元素的add函数的性能严重错误分析及其修改
1.来看三四章中的add函数的实现你是否感觉到问题呢?如果只添加一个元素,通常情况下,你感觉不到,但是,如果我添加n个元素,你觉得时间复杂度是多少呢?1+2+3+4+...+n!所以时间复杂度是o(n!)这对性能来讲是很糟糕的一件事情。所以,就添加函数来讲,我们不希望这样做,我们只需要在尾巴上添加就好,而不用每一次都去寻找。修改后的构造修改后的add函数...原创 2020-05-15 14:30:14 · 160 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第四章:链表-双向链表
1.双向链表的性能分析1.1 特征a.不支持索引访问,所以对某个元素对象的访问的时间复杂度为o(index),其中index是这个索引。b.支持前驱访问,和单向链表的主要区别。1.2 实现方式元素:Elment的接口是针对于单链表的,但事实上,双链表也会继承单链表的元素的一些特性,我们可以看一下这个元素的然后我们新增加了一个IIntElement的接口,事实上,我们的链表针对的对象可以不仅仅是Int,String,因为对象繁多,为了保证设计模式里面的:开闭原则,我们尽原创 2020-05-15 14:11:39 · 130 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表
1.一个最简单的线性表1.1单链表的特征:a.链表无法通过索引获取链表元素,只能从头开始一个一个的后继去找。b.链表无法找到父节点1.2结构:1.3 实现我们来讨论一下它的时间复杂度:1.3.1 add函数:这个函数就是直接在end()后面再加一个元素。那么时间复杂度就是o(1),这很容易想到。因为我不需要遍历。1.3.2 delete函数:这个函数有点意思,见图1-1,如果我们要删除A3节点,删除方法就是:那么我们得获取A2节点,怎么获取A2节点呢?原创 2020-05-14 21:05:57 · 175 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第二章:数据结构的内容结构
1.加点字儿吧,要不然有划水嫌疑....原创 2020-05-13 13:24:58 · 98 阅读 · 0 评论 -
卜若的代码笔记-数据结构系列-第一章:指令和5大区(栈区和堆区等)的基本概念
对于刚入门学习数据结构的同学,通常会需要了解什么叫栈区什么叫堆区。这需要和后面的数据结构里面的栈和堆的概念做一个区 分,这一点非常重要。1.指令的存储先来看一个简单的代码片段如果用中文来描述这个过程a.我定义了一个变量ab.定义一个变量bc.s输出a+b的值如果你学过汇编,那就知道,其实就是简单的mov,add指令。但是你没学过,就按照上面的中文过程理解。那么,计算机是怎么知道要使用这个中文过程来执行上述问题呢?答案就是:cpu从内存中读取到这一系列的指令。...原创 2020-05-13 12:56:13 · 255 阅读 · 0 评论