
数据结构
花开归矣
陌上花开,可缓缓归矣
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
平衡二叉树(Self-balancing binary search tree)之AVL树
1.基础(基础)二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),也称二叉搜索树2.AVL树出现的背景(AVL树出现的背景)问题分析:数列{1,2,3,4,5,6},对应的二叉排序树(BST)的问题所在(1)左子树全部为空,从形式上看,更像一个单链表(2)插入速度没有影响(3)查询速度明显降低(因为需要依次比较),不能发挥B...原创 2020-04-04 14:52:42 · 686 阅读 · 1 评论 -
排序算法之堆排序
1.堆的概述堆是具有以下性质的完全二叉树:(1)每个结点的值都大于或等于其左右子结点的值,称为大顶堆(2)或者每个结点的值都小于或等于其左右子结点的值,称为小顶堆同时,对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子该数组从逻辑上讲就是一个堆结构,用公式来描述堆的性质如下:大顶堆:arr[i] >= arr[2i+1] && a...转载 2020-04-02 13:44:57 · 282 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法之加权连通图的最小生成树问题
1.图的几个概念(1)连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图(2)强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为权,权代表着连接两个顶点的代价,称这种连通图叫做连通网(4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部 n...原创 2020-03-31 22:23:54 · 1719 阅读 · 0 评论 -
普里姆(Prim)算法之加权连通图的最小生成树问题
1.图的几个概念(1)连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图(2)强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为权,权代表着连接两个顶点的代价,称这种连通图叫做连通网(4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个...原创 2020-03-31 17:51:23 · 3574 阅读 · 1 评论 -
迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题
1.概述(1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止2. 迪杰斯特拉(Dijkstra)算法 与 弗洛伊德(Floyd)算法 的区别(1)迪杰斯特拉(Dijkstra)算法:选定图中某一个顶点作为出发顶点,求出出发顶点到其他顶...原创 2020-03-31 00:27:30 · 3821 阅读 · 0 评论 -
弗洛伊德(Floyd)算法之两点之间的最短距离问题
1.概述(1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法名称以创始人之一、1978 年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名2.弗洛伊德(Floyd)算法 与 迪杰斯特拉(Dijkstra)算法 的区别(1) 弗洛伊德(Floyd)算法:图中的每一个顶点都是出发顶点,需要求出每一...原创 2020-03-30 16:28:37 · 3720 阅读 · 1 评论 -
马踏棋盘算法(骑士周游问题)
1.概述马踏棋盘算法也被称为骑士周游问题2.问题描述将象棋马随机放在国际象棋的 8×8 棋盘(二维数组[0~7][0~7])的某个方格中,马按走棋规则(马走日字)进行移动,要求每个方格只进入一次,走遍棋盘上全部 64 个方格3.解题方法求解问题的方法有2种:(1)使用 图的深度优先搜索(DFS)回溯 进行求解(2)使用 贪心算法 确定 贪心策略优化方法(1) 进行求...原创 2020-03-29 21:17:38 · 1782 阅读 · 0 评论 -
图的广度优先搜索(BFS)与图的深度优先搜索(DFS)详解及其代码实现
参考文章:https://blog.youkuaiyun.com/weixin_40953222/article/details/805449281.概述与树的遍历类似,图的遍历也是从图中某个顶点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次但是图的遍历相对树而言要更为复杂,因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已被访问的顶点,避免重复访问根据搜索路径的不同,...原创 2020-03-27 16:27:47 · 2155 阅读 · 0 评论 -
从暴力匹配算法到KMP算法之字符串匹配问题
字符串匹配问题描述给定两个字符串,字符串 str = "aabbcabc" ,字符串regex = "abc" ,判断字符串 str(aabbcabc) 是否 包含 字符串 regex(abc) ,如果包含,则返回regex(abc) 在 str(aabbcabc) 中首次出现的位置,否则返回 -1(题外话:str.indexOf(regex) 得到结果,不在本文讨论的范畴中)一、暴...原创 2020-03-16 17:37:58 · 271 阅读 · 0 评论 -
动态规划算法之0-1背包问题
待续。。。代码实现package com.zzb.algorithm.dynamic;/** * 动态规划算法 * 应用实例:0-1背包问题(限制每个物品要么拿(1个),要么不拿(0个)) */public class KnapsackProblem { public static void main(String[] args) { // 每个物品的重量...原创 2020-03-15 16:33:58 · 7959 阅读 · 0 评论 -
排序算法之基数排序
基数排序(桶排序)介绍(1)基数排序(Radix Sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过元素的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用(2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法(3)基数排序(Radix Sort)是桶排序的扩展(4...原创 2020-03-11 00:09:45 · 634 阅读 · 0 评论 -
排序算法之归并排序
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer )策略,分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之将两个的有序数列合并成一个有序数列,称之为"归并"归并排序基本思想(1)分(分解):一开始对当前数组一分...原创 2020-03-10 16:04:08 · 323 阅读 · 0 评论 -
排序算法之快速排序
快速排序介绍快速排序(Quicksort)是对冒泡排序的一种改进,同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较与交换位置来达到排序的目的,不同的是,冒泡排序在每一趟只把一个元素冒泡到数列的一端,而快速排序在每一趟挑选一个基准元素,并让其他比基准元素大的元素移动到数列的一边,比基准元素小的元素移动到数列的另一边,从而把数列拆解成了两个部分,这种思路就叫做分治法基本思想是:通过一...原创 2020-03-09 17:21:01 · 4041 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序介绍希尔排序,也称递减增量排序算法(缩小增量排序),是插入排序的一种更高效的改进版本,但希尔排序是非稳定排序算法希尔排序基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件被分成一组,算法便终止希尔排序算法讲解(需要有直接插入排序算法作为基础知识)以数组 {82 ,31 ,29...原创 2020-03-08 15:59:11 · 365 阅读 · 0 评论 -
排序算法之(直接)插入排序
package com.zzb.sort;import java.util.Arrays;/** * @Auther: Administrator * @Date: 2020/3/6 22:16 * @Description: 插入排序 * 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表, * 开始时有序表中只包含一个...原创 2020-03-06 23:06:34 · 309 阅读 · 0 评论 -
排序算法之选择排序
package com.zzb.sort;import java.util.Arrays;/** * @Auther: Administrator * @Date: 2020/3/6 16:52 * @Description: 选择排序 */public class SelectSort { public static void main(String[] args) ...原创 2020-03-06 17:16:03 · 168 阅读 · 0 评论 -
排序算法之冒泡排序
package com.zzb.sort;import java.util.Arrays;/** * @Auther: Administrator * @Date: 2020/3/6 14:44 * @Description: 冒泡排序 * 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较 * 相邻元素的值,若发现...原创 2020-03-06 15:29:03 · 379 阅读 · 0 评论 -
中缀表达式转后缀表达式的代码实现及逆波兰计算器求值(后缀表达式求值)的代码实现
1、案例1+((2+3)*4)-52、思路步骤分析:本代码实现只考虑3类符号:正整数,运算符(+,-,*,/)、小括号,后续扩展,转换核心是这3类符号的比较特点3、代码实现package com.zzb.stack;import java.io.Serializable;import java.util.ArrayList;import java.util...原创 2020-02-05 00:30:13 · 414 阅读 · 0 评论 -
使用带头结点的单向链表模拟栈
package com.zzb.stack;import java.io.Serializable;import java.util.Scanner;/** * @Auther: Administrator * @Date: 2020/1/21 12:50 * @Description: 使用 带头结点的单向链表 模拟 栈 数据结构 * (1)栈是一个先入后出(FILO-Fir...原创 2020-01-21 15:32:03 · 416 阅读 · 0 评论 -
使用数组模拟栈
package com.zzb.stack;import java.util.Scanner;/** * @Auther: Administrator * @Date: 2020/1/20 12:25 * @Description: 使用 数组 模拟 栈 数据结构 * (1)栈是一个先入后出(FILO-First In Last Out)的有序列表 * (2)栈(stack)是...原创 2020-01-20 14:47:57 · 577 阅读 · 0 评论 -
使用环形单向链表解决约瑟夫环问题
package com.zzb.datastructure.singlelist;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2020/1/18 17:38 * @Description: 使用 环形单向链表 解决 约瑟夫环 问题 * * 问题描述: * total 个人围成一圈,从第 i...原创 2020-01-19 15:10:13 · 279 阅读 · 0 评论 -
使用数组解决约瑟夫环问题
package com.zzb.datastructure.singlelist;/** * @Auther: Administrator * @Date: 2020/1/17 15:31 * @Description: 使用 数组 解决 约瑟夫环 问题 * * 问题描述: * total 个人围成一圈,从第 index 个人起从 1 开始报数,数到 target 的那个人出队,...原创 2020-01-17 18:59:52 · 1303 阅读 · 0 评论 -
合并两个有序的单链表,合并之后的新链表依然有序
package com.zzb.datastructure.singlelist;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2020/1/15 16:55 * @Description: * 合并两个有序的单链表,合并之后的新链表依然有序 */public class MergeOrde...原创 2020-01-16 15:05:28 · 1537 阅读 · 1 评论 -
使用数组模拟环形队列
package com.zzb.queue;import java.util.Scanner;/** * @Auther: Administrator * @Date: 2020/1/13 18:30 * @Description: 使用 数组 模拟 环形队列(以数组长度为2的极端方式理解) * (1)front成员变量表示指向队列的第一个元素(即头部数据)的头索引,即arra...原创 2020-01-14 14:42:00 · 512 阅读 · 0 评论 -
使用数组模拟队列
package com.zzb.queue;import java.util.Scanner;/** * @Auther: Administrator * @Date: 2020/1/13 13:29 * @Description: 使用 数组 模拟 队列 * * 队列是一个有序列表,可用 数组 或 链表 来实现 * 队列遵循 先进先出 的原则,即先存进队列的数据被先取出来,...原创 2020-01-13 16:52:04 · 299 阅读 · 0 评论 -
稀疏数组的理解及与原始数组之间的相互转化的代码实现
原始数组 稀疏数组 原始数组 转 稀疏数组package com.zzb.sparsearray;/** * @Auther: Administrator * @Date: 2020/1/7 14:44 * @Description: 原始数组 转 稀疏数组 * 稀疏数组 原理 * (1)稀疏数组的第...原创 2020-01-07 15:24:08 · 152 阅读 · 0 评论 -
二叉排序树的添加与删除
package com.zzb.tree;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2019/10/14 00:07 * @Description: * 二叉排序树:BST(Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点, * 要求左子节点的值比当...原创 2019-10-14 03:52:39 · 263 阅读 · 0 评论 -
二叉树的顺序存储与遍历
二叉树的存储结构目前所学:1、顺序存储 概念:采用数组来存储二叉树的所有节点。注意,顺序存储只适用于完全二叉树(满二叉树也是完全二叉树的一种) 顺序存储的特点对于一棵有n个结点的完全二叉树,按照从上至下和从左至右的顺序对所有结点从 0 开始到 n-1 进行顺序编号,则对于索引为 i的结点(0≤i<n) (1)如果 i=0,则结点i是二叉树的根 (2)第...原创 2019-10-12 01:27:48 · 2325 阅读 · 0 评论 -
哈希表的增、删、查、遍历
package com.zzb.hashtable;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2019/10/7 00:44 * @Description: 哈希表的增、删、查、遍历 * * 哈希表数据结构 就是 数组数据结构 与 链表数据结构 的组合而构成的,即 * 哈希表 = 数组 ...原创 2019-10-07 02:48:39 · 3293 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历、查找、删除的实现
package com.zzb.tree;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2019/10/5 20:59 * @Description: 二叉树的 * 前序遍历 * 中序遍历 * 后序遍历 * * 前序遍历查找指定节点 * 中序遍历查找指定节点 * 后序遍历查找指点...原创 2019-10-06 01:51:37 · 374 阅读 · 0 评论 -
带头结点的双向链表 增删改查遍历
package com.zzb.datastructure;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2019/10/2 21:13 * @Description: 带头结点的双向链表 增删改查遍历 */public class DoubleLinkedListDemo01 { p...原创 2019-10-02 23:37:42 · 272 阅读 · 0 评论 -
带头结点的单向链表 增删改查遍历
package com.zzb.datastructure;import java.io.Serializable;/** * @Auther: Administrator * @Date: 2019/10/1 18:20 * @Description: 带头结点的单向链表 增删改查遍历 */public class SingleLinkedListDemo01 { p...原创 2019-10-02 15:12:39 · 499 阅读 · 0 评论