数据结构
文章平均质量分 76
poppy一直在
喜欢竭尽全力做一件事
展开
-
数据结构之图的深度优先遍历和广度优先遍历
1.图的简单介绍上图就是一个图(无线图),由顶点和连线组成图可以分为无向图和有向图(这个又有出度、入度的概念)、网,一般来说图有两种常用的表示方式,邻接矩阵(用二维数组的形式表示)和邻接表(主要是数组+链表的形式表示),图常用的遍历方式有深度优先遍历(DFS)和广度优先遍历(BFS)。由于等会代码是用邻接矩阵来实现DFS和BFS,这里主要介绍一下邻接矩阵的表示方法:两个顶点相邻,则原创 2016-07-23 10:21:53 · 8185 阅读 · 0 评论 -
并查集与欧拉回路
因为“并查集详解”这篇文章写得相当精彩,本文有许多从中借鉴。链接:http://blog.csdn.net/dellaserss/article/details/77244011.并查集并查集采用树形数据结构,用于解决不相交集合的合并和查询问题。我们来看一个例子:假设存在若干个城镇,其中一些城镇有道路直接相连,现在我们可以提出这么一些问题:1)给你两个点(城镇可以看成点)让你判断这原创 2017-05-26 11:02:43 · 571 阅读 · 0 评论 -
图之最短路径之弗洛伊德算法
1.基本思想通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。然后,对矩阵S进行更新,如果"a[i][j]的距离" > "a[i][k]+a[k][j]",则更新a[i][j原创 2017-03-11 16:08:48 · 834 阅读 · 0 评论 -
数据结构之最小生成树
1.最小生成树给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树最小生成树的算法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法应用场景:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低2.普里姆(Prim原创 2016-08-11 23:19:08 · 729 阅读 · 0 评论 -
数据结构系列之平衡二叉树
1.基本介绍平衡二叉树是一种特殊的二叉查找树,其左右子树都是平衡二叉树,且高度差的绝对值不超过1如何使二叉查找树在添加数据的同时保持平衡呢?基本思想就是:当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若破坏,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子树中节点之间的关系,以达到新的平衡。所谓最小不平衡子树 指离插入节点最近且以平衡因原创 2016-08-07 17:16:22 · 509 阅读 · 0 评论 -
图之最短路径之迪杰斯特拉算法
一般最短路径算法有迪杰斯特拉算法和弗洛伊德算法,对于有负权值的需要使用弗洛伊德算法,这里主要讲解迪杰斯特拉算法1.算法思想设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按原创 2016-08-17 16:52:40 · 670 阅读 · 0 评论 -
二叉查找树
1.基本概念二叉查找树又称二叉排序树,特点是左子树全部小于根节点,右子树全部大于根节点2.生成二叉排序树,插入节点,查找节点,删除节点查找节点的思路:如果当前节点的值大于要查找节点的值,则与当前节点的左孩子比较,否则与右孩子比较,循环迭代插入节点的思路:当前二叉排序树已存在该值的节点,插入失败,返回false,要插入的节点的值小于当前节点的值,则与当前节点的左孩子比较,否则与右原创 2016-08-01 22:57:50 · 238 阅读 · 0 评论 -
哈夫曼树和哈夫曼编码
原文参照:http://blog.csdn.net/bruce_6/article/details/386564131.基本概念节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度树的路径长度:从树的根节点到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。结点的权:在一些应用中转载 2016-07-31 10:44:26 · 1599 阅读 · 0 评论 -
排序序列之直接插入排序与希尔排序
1.直接插入排序思想:将每个数字当作插入一个已经有序的数组中,则只需要找到比该数字大的第一个数字b,从b及其之后的每个数字都往后移动一位,将新数字插入到b原来的位置即可代码:import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc=new Scan原创 2016-08-03 21:08:01 · 252 阅读 · 0 评论 -
二叉树的遍历
遍历方式:前序遍历、中序遍历、后序遍历和层次遍历 (递归、非递归)代码:(递归方式) import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class BinaryTree { public sta原创 2016-07-29 20:05:13 · 344 阅读 · 0 评论 -
链表的C++代码
单链表结点定义为一个结构体struct LinkNode{ int data; Node * next;};然后定义一个链表类class List{private:LinkNode* first;public: list(){first=null;} bool insert(int i,int data原创 2016-07-14 21:32:47 · 301 阅读 · 0 评论 -
排序系列之堆排序
1.堆的基本概念堆结构是一种完全二叉树或近似完全二叉树,堆分为最大堆和最小堆(适用于只需知道最大值和最小值的场景)最大堆:根节点都大于其孩子节点 最小堆:根节点都小于其孩子节点一般使用数组来表示,如下图,是一个堆结构:最大堆:堆中根节点和孩子结点的的下标关系一般为,根节点为i,则左孩子为2+i+1,右孩子为2*i+2堆排序的思路:原创 2016-07-23 23:21:02 · 322 阅读 · 0 评论 -
SkipList及其在redis中的应用
1.SkipList是什么?SkipList其实是针对链表查找效率低的特点的一种改进,结合链表和二分查找,查询时间复杂度为O(logn)的一种数据结构特点:1)链表中结点是有序的2)能够满足类似二分查找的“跳跃式”查找2.SkipList如何实现类“二分查找”?(图片引用自https://time.geekbang.org/column/article/42896)先来看一...原创 2018-11-17 23:41:03 · 1500 阅读 · 2 评论