
数据结构与算法
zhangjun62
我是一个爱学习、爱动漫的程序员
展开
-
Java实现队列和栈的相互转换
队列特性是先入先出,栈特性是先入后出,栈实现队列需要两个栈来实现,队列实现栈也需要两个对立来实现。1.栈实现队列public class TwoStacksQueue{ private Stack<Integer> stackPush; private Stack<Integer> stackPop; ...原创 2019-03-03 15:21:43 · 731 阅读 · 0 评论 -
数据结构之Java实现底层Map
Map是一种映射类集合,相比于Set既有键也有值,以一对键值对形式存储,不能存在相同元素(键不能相同),首先和前面的Set一样,定义一个Map接口类,分别用链表和二分搜索树来实现,由于结点元素需要存储的是一对键值对,所以不用前面文章的链表和二分搜索树,重新定制一下结点信息和相应的数据结构,下面是实现过程。1、Map接口public interface Map<K, V> {/...原创 2018-09-23 16:46:30 · 850 阅读 · 0 评论 -
数据结构之Java实现底层Set
Set也是一种重要数据结构,其特点为不允许出现重复元素,不保证集合中的元素顺序,可以有元素为null但只允许出现一次。首先定义了一个Set接口,根据前面几篇文章实现的链表和二分搜索树实现Set数据结构,下面是实现过程Set接口public interface Set<E> {void add(E e); //添加一个元素void remove(E e); //删除...原创 2018-09-22 10:05:05 · 11319 阅读 · 0 评论 -
数据结构之Java实现底层BinarySearchTree
数组、栈、队列和链表都是一种线性数据结构,树形数据结构是一类重要的非线性数据结构。树形数据结构可以表示数据表素之间一对多的关系。其中以树与二叉树最为常用,树是以分支关系定义的层次结构。树只有一个根结点,对于二叉树父结点至多有两个子结点,每个子结点只有父结点,结点的无子结点,表明此结点是叶子结点,对于二叉树每一个结点都有左右子结点称为满二叉树。二分搜索树是二叉树的一种,其要求左子树比根结点的值都要小...原创 2018-09-19 09:48:33 · 1470 阅读 · 0 评论 -
数据结构之Java实现底层LinkedList
链接表是一种真正的动态数据结构,由一个个节点相互连接而构成,每一个节点包含数据和引用。相比于数组,查询速度慢,删除头元素方便,下面就是链表的实现过程public class LinkedList<E> {private class Node { //定义一个私有内部类代表每一个结点public E e; //声明数据public Node next...原创 2018-09-18 15:49:11 · 323 阅读 · 0 评论 -
数据结构之Java实现底层Queue
队列是一种先进先出的线性数据结构,只能观察到队首元素,首先创建了一个Queue接口类如下:public interface Queue<E> { //队列接口int getSize(); //获取队列大小boolean isEmpty(); //判断队列是否为空void enqueue(E e); //入队E deque...原创 2018-09-18 09:30:20 · 2935 阅读 · 0 评论 -
数据结构之Java实现底层ArrayList
数据结构是算法的基础和计算机应用的基础,第一个实现的是动态数组,对应于Java的ArrayList,没有它做得那么好,但对于底层实现原理可以有一个初步掌握。以下是具体代码实现://此数组类支持泛型public class Array<E> {private E[] data;//声明保存数据的数组private int size; //声明数组的大小即存储了多少个...原创 2018-09-16 09:54:57 · 444 阅读 · 0 评论 -
整数阶乘尾部0的个数
求解整数阶乘尾部0的个数主要是算出有多少个5及其倍数,因为这些数与偶数相乘会产生0,以100!的阶乘举例5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 20个 100 / 5 = 20,可以产生至少20个0,这20个数中有25 50 75 100 总共四个数可以产生两个0,也就是多出20 / 5 = 4个0,10...原创 2018-08-10 10:22:10 · 1526 阅读 · 0 评论 -
数据结构之Java实现底层Stack
栈是一种先进后出的线性数据结构,先进后出,只能观察到栈顶元素,利用上篇文章(https://blog.youkuaiyun.com/zhangjun62/article/details/82720572)实现的动态数组来实现底层栈的数据结构。首先创建了一个Stack接口类如下:public interface Stack<E> {int getSize(); //获取...原创 2018-09-16 11:44:14 · 959 阅读 · 0 评论 -
数据结构之Java实现底层PriorityQueue & MaxHeap
普通队列是按照先进先出的顺序执行,出队顺序与入队顺序有关,优先队列出队顺序和入队顺序无关,与优先级相关.优先队列与动态选择优先级高的任务执行的需求有关,普通队列无法满足。首先说堆,堆也是种树形结构,比如二叉堆。二叉堆是一颗完全二叉树,完全二叉树是把元素顺序排成树形结构,从左至右依次排,如果元素不够也是右侧未排满。二叉堆除了要求完全二叉树,还有对元素大小有要求,有最大堆和最小堆之分,对于最大堆,堆中...原创 2018-09-23 21:45:28 · 1094 阅读 · 0 评论 -
数据结构之Java实现底层SegmentTree
SegmentTree叫线段树,也叫区间树。在某些情况下,只关注某一段区间的数据情况,比如经典的区间染色问题。查询和更新某区间的信息使用数组实现时间复杂度都是O(n),用线段树实现查询和更新时间复杂度为O(log n),线段树更新数组中一个值或者一个区间的值,查询一个区间的最大值、最小值或者是求和等操作。线段树是主要是将传入的数组形成树结构记录区间信息,如下图所示结构对于元素个数不是2 ...原创 2018-09-26 09:39:56 · 2101 阅读 · 0 评论 -
十大排序算法之堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是一种选择排序,时间复杂度是o(n log n),本博客将使用最大堆来实现堆排序。对于堆的具体描述在本博客的这篇文章(https://blog.youkuaiyun.com/zhangjun62/article/details/82824759)已经对最大堆这种数据结构做出了介绍,故不做重复介绍,主要介绍堆排序。以下是最大堆结构具体实现过...原创 2018-10-19 21:08:09 · 215 阅读 · 1 评论 -
十大排序算法之快速排序
快速排序是一类比较著名的排序算法,时间复杂度为O(n log n),体现了分治思想,侧重于分,归并排序在于治。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序重要过程就是partition,找到使得元素p左边比它小,右边比它大的位置。以下是...原创 2018-10-17 19:03:45 · 340 阅读 · 0 评论 -
十大排序算法之归并排序
归并排序是一个O(n log n)排序算法,采取了分治的思想。将已有序的子序列合并,得到完全有序的序列,即使得每个子序列有序,再使得每个子序列段有序,最后整个序列有序。图示是自顶向下的归并排序过程,采取递归思想归并排序合并过程是算法的关键过程,需要生成一个辅助数组,大小与需要合并的两部分子序列大小之和,临时装载需要排序的元素,用k指示排序后元素所在的位置,i是左序列标定点,j是右序列标定点...原创 2018-10-14 11:05:10 · 562 阅读 · 0 评论 -
十大排序算法之希尔排序
希尔排序是一种缩小增量的插入排序,是直接插入排序算法的一种改进版本,平均时间复杂度为O(n ^ 1.3),最坏时间复杂度是O(n ^ 2),最好情况是O(n)。简单插入排序是一种稳定的排序算法,希尔排序是一种非稳定的排序算法。排序过程是先取一个正整数d1 < n,将所有序号相隔的的元素放一组,组内进行直接插入排序;然后取d2 < d1,重复上述分组和排序操作;直至di = 1,将所有记...原创 2018-10-11 09:13:50 · 487 阅读 · 0 评论 -
十大排序算法之插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法时间复杂度为O(n ^ 2),虽然时间复杂度为O(n ^ 2),但对于近乎有序的数组,时间效率会得到极大的提升,插入排序一般用于小数据量数组或者应用于近乎有序的数组,可以用于归并排序和快速排序的优化。以下是插入排序具体实现过程public class InsertSort {publ...原创 2018-10-09 09:53:50 · 201 阅读 · 0 评论 -
十大排序算法之选择排序
选择排序也是一种O(n ^ 2)时间复杂度的排序算法,选择排序是每一次循环都将找到最小值,依次将最小值、次小值分别从左至右进行排序。以下是具体实现过程,其中使用的工具类这篇博客已经给出,(https://blog.youkuaiyun.com/zhangjun62/article/details/82966500)import cn.zjut.util.SortTestUtil;public clas...原创 2018-10-08 22:58:52 · 161 阅读 · 0 评论 -
十大排序算法之冒泡排序
排序算法是一类比较重要和经典的一类算法,主要十类排序算法。主要有两大类,一类是非线性时间比较类排序(通过比较来决定元素间相对次序,其时间复杂度不能突破O(n logn)),另一类是线性时间非比较类排序(不通过比较来决定元素间的相对次序,可以突破基于比较排序的时间下届,以线性时间运行)。第一类有交换排序(冒泡排序、快速排序),插入排序(简单插入排序、希尔排序),选择排序(简单选择排序、堆排序),归并...原创 2018-10-08 16:09:02 · 221 阅读 · 0 评论 -
数据结构之Java实现AVL Tree
AVL Tree是最早的自平衡二分搜索树结构。平衡二叉树对于任意结点左子树与右子树高度差不超过1,平衡二叉树高度与结点数量为O(log n)关系。每一个结点需要记录每一个结点的高度,计算平衡因子,平衡因子等于左子树高度减去右子树高度。对于一个二分搜索树,当添加元素时会破坏平衡,这时需要维护,删除元素时也会造成平衡破坏,需要维护平衡。主要有四种情况,分别如下1.LL,平衡因子大于1,左子树平衡因...原创 2018-09-28 11:10:04 · 1774 阅读 · 0 评论 -
图论基础学习
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。图的分类 无向图(Undirected Graph) 有向图(Directed Graph)...原创 2019-07-06 20:43:13 · 1040 阅读 · 0 评论