数据结构与算法
道法—自然
不积跬步,无以至千里;不积小流,无以成江海。——荀子
展开
-
二叉树的接口
2.定义二叉树接口public interface BinaryTree { /** * 是否空树 * @return */ public boolean isEmpty(); /** * 树结点数量 * @return */ public int size(); /** * 获取二叉树的高度 * @return */ public int...原创 2018-09-28 23:47:37 · 278 阅读 · 0 评论 -
二分查找思想(使用递归和不适用递归的思想)
public class BinarySearch { public static void main(String[] args) { int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; System.out.println(searchLoop(array, 101)); } /** * 循环二分查找,返回第一次出现该值的...原创 2018-10-04 09:47:35 · 352 阅读 · 0 评论 -
顺序查找示例
非常简单示例1:在成绩中查询分数是100的第一个分数示例2:在学生中查询分数是100的第一个学生存储结构可以是顺序表,也可以是链表。逐个比较查询,如果找到,返回数据或者索引,如果到最后也没有找到,返回null可以是在顺序表中,也可以是在链表中在各个节点查找概率相同情况下,默认查询长度为一半长度,所以时间复杂度是T(n) = O(n);package com.bjsxt....原创 2018-10-04 09:17:24 · 1187 阅读 · 0 评论 -
图中求最短路径的算法
在许多应用领域,带权图都被用来描述某个网络,比如通信网络、交通网络等。这种情况下,各边的权重就对应于两点之间通信的成本或交通费用。 此时,一类典型的问题就是:在任意指定的两点之间如果存在通路,那么最小的消耗是多少。这类问题实际上就是带权图中两点之间最短路径的问题。 问题:计算V1到V8的最短路径最短路径1:段数最少的最短路径:换乘最少 使用广度优先遍历即可类似问题:编写国...原创 2018-10-04 09:01:32 · 909 阅读 · 0 评论 -
图的遍历(深度优先遍历和广度优先遍历)
图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础深度优先遍历(depth-first search):类似于树的先根遍历,是树的先根遍历的推广 广度优先遍历(breadth-first search):遍历类似于树的层次遍历,它是树的按层遍历的推广...原创 2018-10-04 08:57:54 · 3231 阅读 · 0 评论 -
图的存储方式(数组+链表的存储方式)
原创 2018-10-04 08:55:17 · 1780 阅读 · 1 评论 -
图的概念
图(graph)是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成。 其形式化的定义如下:Graph = ( V , E )V = {x| x∈某个数据对象}E = {<u , v>| P(u , v)∧(u,v∈V)}V 是具有相同特性的数据元素的集合,V 中的数据元素通常称为 顶点(Vertex) ),E 是两个顶点之间关系的集合。P(u ,...原创 2018-10-04 08:36:43 · 780 阅读 · 0 评论 -
数据结构与算法部分听课笔记
原创 2018-10-03 11:30:21 · 446 阅读 · 0 评论 -
顺序表的查找
顺序表的查找 对于数组,按顺序比较给定的值,时间复杂度0(n),,以下是实现: public static int Linear_Search(int[] data, int key) { if (data == null || data.length <= 0) { return -1; } for (int i = 0; i < data.leng...原创 2018-10-01 19:49:57 · 1664 阅读 · 0 评论 -
二分查找(使用递归方式和使用非递归循环的方式来实现)
二分查找是一种查询效率非常高的查找算法。又称折半查找。二分查找算法思想有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。...原创 2018-10-01 19:46:47 · 1005 阅读 · 1 评论 -
数据结构与算法的基本常识,数据结构与算法中图的概念,图的实现方式,狄克斯特拉算法
算法的实现方式:递归和非递归(借助于队列的方式)存储结构:顺序存储结构和链式存储结构深度优先遍历和广度优先遍历 数据结构的遍历中有往回退的方式 ...原创 2018-10-01 15:14:47 · 379 阅读 · 0 评论 -
求二叉树中叶子结点的个数(递归和非递归的方式实现)
思路:(1)通过先序遍历的方式求解(2)叶子节点的特点: 左右孩子都为空可以用非递归的方式也可以用递归方式 package com.zhaochao.tree; import java.util.Stack; /** * Created by zhaochao on 17/1/23. * 叶子结点的特点: 左右孩子都为空 * 通过先序的方式找到叶子结点 * ...原创 2018-10-01 12:35:30 · 14103 阅读 · 0 评论 -
获取二叉树的最大宽度(只能采用非递归的方式,采用堆的先进先出的方式去实现)
使用队列,层次遍历二叉树。在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度。以此类推,依次遍历下一层即可求出二叉树的最大宽度。 // 获取最大宽度 public static int getMaxWidth(TreeNode root) { if (root == null) return 0;...原创 2018-10-01 12:07:05 · 473 阅读 · 0 评论 -
二叉树,平衡二叉树,红黑树,B-树、B+树、B*树的区别
二叉查找/搜索/排序树 BST (binary search/sort tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;(2)若它的右子树上所有结点的值均大于它的根节点的值;(3)它的左、右子树也分别为二叉排序树。注意:对二叉查找树进行中序遍历,得到有序集合。平衡二叉树(Self-balancing b...原创 2018-10-04 10:32:15 · 60079 阅读 · 7 评论 -
哈希表的查找
引入哈希表前面查找方法共同特点:通过将关键字值与给定值比较,来确定位置。效率取决比较次数。理想的方法是:不需要比较,根据给定值能直接定位记录的存储位置。这样,需要在记录的存储位置与该记录的关键字之间建立一种确定的对应关系,使每个记录的关键字与一个存储位置相对应。 1.哈希表的结构和特点 hashtable 也叫散列表 特点:快 很快 神奇的快 结构...原创 2018-10-04 10:51:19 · 8516 阅读 · 2 评论 -
数据结构与算法中的排序
什么是排序排序(sorting) )的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。其确切的定义为:假设有n个数据元素的序列{R 1 , R 2 , … , R n },其相应关键字的序列是{K 1 , K 2 , … , K n },通过排序要求找出下标 1 , 2 , … , n的一种排列p 1 , p 2 , … , p n ,使得相应关键字满足如下的非递减(或非...原创 2018-10-04 11:22:23 · 190 阅读 · 0 评论 -
二叉树结点
定义二叉树结点类:/** * 链式二叉树结点 * @author Administrator * */public class Node { int value; Node leftChild; Node rightChild; public Node(int value) { this.value = value; } public Node(int va...原创 2018-09-28 23:45:26 · 401 阅读 · 0 评论 -
二叉树遍历概念和算法
二叉树的遍历: 遍历(Traverse):就是按照某种次序访问树中的所有结点,且每个结点恰好访问一次。也就是说,按照被访问的次序,可以得到由树中所有结点排成的一个序列。树的遍历也可以看成是人为的将非线性结构线性化。这里的“访问”是广义的,可以是对结点作各种处理,例如输出结点信息、更新结点信息等。在我们的实现中,并不真正的“访问”这些结点,而是得到一个结点的线性序列,以线性表的...原创 2018-09-28 23:41:36 · 418 阅读 · 0 评论 -
二叉树
二叉树:每个结点的度均不超过 2 的有序树,称为 二叉树(binary tree) 。与树的递归定义类似,二叉树的递归定义如下:二叉树或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树。由以上定义可以看出,二叉树中每个结点的孩子数只能是 0、1 或 2 个,并且每个孩子都有左右之分。位于左边的孩子称为左孩子,位于右边的孩子称为右孩...原创 2018-09-28 23:25:27 · 172 阅读 · 0 评论 -
树的概念
树树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。树的结点包含一个数据元素及若干指向其子树的若干分支。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。我们可以形式地给出树的递归定义如下:树(tree )是 n(n ≥ 0)个结点的有限集。它1) 或者是...原创 2018-09-28 23:10:39 · 310 阅读 · 0 评论 -
递归求斐波那契额数列
一、斐波那契数列由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫“兔子数列”。它指的是这样一个数列:0,1,1,2,3,5,8,13......从这组数可以很明显看出这样一个规律:从第三个数开始,后边一个数一定是在其之前两个数的和。在数学上,斐波纳挈数列可以以这样的公式表示:F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)二、斐波纳挈数列的...原创 2018-10-06 23:46:19 · 1901 阅读 · 0 评论 -
各种排序算法的比较与总结
1.直接插入排序、简单选择排序、冒泡排序是最简单的三种排序算法,时间复杂度也最高O(n2),作为基础排序,面试中有被问到,三种都要掌握。2.三种简单排序算法简单,但是效率低下;高级排序在简单排序基础上优化,算法复杂,换取的是性能提高,同时可能需要更多的辅助空间。3.快速排序和归并排序都使用了分治和递归,所以面试时被问到的机会比较高,尤其是快速排序。4.从时间性能上看,快速排序是所有排序算...原创 2018-10-05 09:05:36 · 1553 阅读 · 1 评论 -
归并排序的原理及Java版实现方式
一. 算法描述归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。 归并排序将待排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列。具体排序过程如下图所示:...原创 2018-10-05 09:04:55 · 218 阅读 · 0 评论 -
直接插入排序算法的原理及Java版实现方式
直接插入排序基本思想是:仅有一个元素的序列总是有序的, 因此,对 n 个记录的序列,可从第二个元素开始直到第 n 个元素, 逐个向有序序列中执行插入操作,从而得到 n 个元素按关键字有序的序列。一般来说,在含有 j-1 个元素的有序序列中插入一个元素的方法是:从第 j-1 个元素开始依次向前搜索应当插入的位置,并且在搜索插入位置的同时可以后移元素,这样当找到适当的插入位置时...原创 2018-10-05 09:04:32 · 656 阅读 · 0 评论 -
堆排序的原理及Java版的实现方法
堆是数据结构中的一种重要结构,了解了“堆”的概念和操作,可以快速掌握堆排序。堆的概念堆是一种特殊的完全二叉树(complete binary tree)。如果一棵完全二叉树的所有节点的值都不小于其子节点,称之为大根堆(或大顶堆);所有节点的值都不大于其子节点,称之为小根堆(或小顶堆)。在数组(在0号下标存储根节点)中,容易得到下面的式子(这两个式子很重要):1.下标为i的节点,父节点坐标...原创 2018-10-05 09:04:17 · 151 阅读 · 0 评论 -
简单选择排序的原理及实现方式
简单选择排序的算法 第一趟,从 n 个元素中找出关键字最小的元素与第一个元素交换;第二趟,在从第二个元素开始的 n-1 个元素中再选出关键字最小的元素与第二个元素交换;如此,第 k 趟,则从第 k 个元素开始的 n-k+1 个元素中选出关键字最小的元素与第 k 个元素交换,直到整个序列按关键字有序。(这个图好像不合理,为什么是这样,后边里边是怎么进行比较的,怎么知道13就是最小的)...原创 2018-10-05 09:04:00 · 3048 阅读 · 0 评论 -
快速排序算法的原理及实现
快速排序 快速排序是冒泡排序的改进版,也是最好的一种内排序,还涉及到分治和递归,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。 冒泡排序中记录的比较和交换是在相邻的单元中进行,每次交换只能上移或者下移一个单元,因而总的比较和移动次数较多。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-a...原创 2018-10-05 09:03:46 · 1013 阅读 · 0 评论 -
冒泡排序算法
冒泡排序的实现/** 功能:数组排序(无序数组-----有序数组) 排序算法很多,冒泡排序,选择排序,插入排序,是三种最基本最简单的排序算法,效率最低 技能:冒泡排序 冒泡排序的算法 * 1.整个数列分成两部分:前面是无序数列,后面是有序数列 * 2.初始状态下,整个数列都是无序的,有序数列是空 * 3.如果一个数列有n个元素,则至多需要n-1趟循环才能保证...原创 2018-10-04 11:54:43 · 156 阅读 · 0 评论 -
层次遍历二叉树和采用栈的方式遍历二叉树
//中序遍历非递归 @Override public void inOrderByStack() { System.out.println("中序遍历非递归操作"); //创建栈 Deque<Node> stack=new LinkedList<Node>(); Node current=root; while(current!=null||!s...原创 2018-10-01 11:00:25 · 1795 阅读 · 1 评论 -
数据结构中的线性表及其结构
线性表(linear list) ) 线性表是n个类型相同数据元素的有限序列,通常记作(a 0 , a 1 , …a i-1 , a i , a i+1 …,a n-1 )。1.相同数据类型在线性表的定义中,我们看到从a 0 到a n-1 的n个数据元素是具有相同属性的元素。比如说可以都是数字,例如(23, 14, 66, 5, 99);也可以是字符,例如(A, B, C, … ...原创 2018-09-15 10:50:55 · 222 阅读 · 0 评论 -
二分查找:非递归实现和递归实现
二分查找算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。二分查找的前提是这个数组是有序的。第一种:非递归实现: package com.bjsxt.com;publi...原创 2018-09-17 22:58:16 · 401 阅读 · 0 评论 -
递归:累加求和,累积求和,斐波那契疏忽列
递归递归(recursion )是指在定义自身的同时又出现了对自身的引用。如果一个算法直接或间接地调用自己,则称这个算法是一个递归算法。任何一个有意义的递归算法总是由两部分组成:递归调用与递归终止条件。 德罗斯特效应(Droste effect)是递归的一种视觉形式,是指一张图片的某个部分与整张图片相同,如此产生无限循环。这种图片可以通过名为 Mathmap的数学软件制作出...原创 2018-09-17 22:58:33 · 14109 阅读 · 0 评论 -
Java中栈和队列的类
Stack类:栈类 过时 public class Stack<E> extends Vector<E>Queue:队列类Deque:双端队列(栈操作建议使用)public class LinkedList<E> extends AbstractSequentialList<E> implements List&l...原创 2018-09-16 16:29:39 · 13169 阅读 · 0 评论 -
队列(queue)的定义,队列的存储结构
队列定义队列(queue )简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。在队列中把插入数据元素的一端称为 队尾(rear) ),删除数据元素的一端称为 队首(front) )。向队尾插入元素称为 进队或入队,新元素入队后成为新的队尾元素;从队列中删除元素称为 离队或出队,元素出队后,其后续元素成为新的队首元素。由于队列的插...原创 2018-09-16 16:20:24 · 14417 阅读 · 0 评论 -
栈的定义,两种基本的存储结构:顺序存储结构和链式存储结构
栈的定义栈(stack )又称堆栈,它是运算受限的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。表中进行插入、删除操作的一端称为 栈顶(top) ,栈顶保存的元素称为 栈顶元素。相对的,表的另一端称为栈底(bottom) 当栈中没有数据元素时称为空栈;向一个栈插入元素又称为 进栈或 入栈;从一个栈中删除元素又称为 出栈或 退栈...原创 2018-09-16 16:15:34 · 11864 阅读 · 0 评论 -
数组中顺序表的实现:其实就是模拟ArrayList
package com.bjsxt.ds.linelist;import java.util.Arrays;public class ArrayList implements List { private Object[] elementData; // 底层数组来存储多个元素 private int size;// 存储的元素的个数,线性表的长度,注意,不是数组的长度 pub...原创 2018-09-16 09:42:26 · 309 阅读 · 0 评论 -
Java中双链表的查找、插入、删除等
双向链表结构和单向链表的区别:最后一个结点的链接地址上,单向链表是null,而双向链表是表头的链接地址。即双向链表的head和last互相指向示意图 表头为空 head之前的节点是last=50这个节点 ,head之后的节点是first=10这个节点last之前是40这个节点,last之后是head这个头节点 双向链表删除节点 删除之后 ...原创 2018-09-16 00:10:28 · 7753 阅读 · 1 评论 -
深入理解java中的ArrayList和LinkedList
深入理解java中的ArrayList和LinkedList杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0个或多个数据元素组成的有限序列.如果没有元素,称为空表,如果存在多个元素,则第一个元素无前驱,最后一个元素无后继,其他元素元素都有且只有一...转载 2018-09-16 00:06:02 · 180 阅读 · 0 评论 -
双向链表与循环链表
双向链表单链表的一个优点是结构简单,但是它也有一个缺点,即在单链表中只能通过一个结点的引用访问其后续结点,而无法直接访问其前驱结点,要在单链表中找到某个结点的前驱结点,必须从链表的首结点出发依次向后寻找,但是需要Ο(n)时间。为此我们可以扩展单链表的结点结构,使得通过一个结点的引用,不但能够访问其后续结点,也可以方便的访问其前驱结点。扩展单链表结点结构的方法是,在单链表结点结构中新增加一...原创 2018-09-16 00:06:56 · 12768 阅读 · 1 评论 -
单链表的讲解:单链表的原理,添加、删除元素
单链表及其节点链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个域是指向其他单元的指针。这里具有一个数据域和多个指针域的存储单元通常称为 结点(node)一种最简单的结点结构如图所示,它是构成单链表的基本结点结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。因为只有一个指针结点,称为单链表 ...原创 2018-09-16 00:06:42 · 37152 阅读 · 3 评论