数据结构与算法
数据结构与算法
Elltor
刘启春的专栏
展开
-
【数据结构】二叉树的性质随想总结
二叉树的性质在二叉树的第i层最多有2i−12^{i-1}2i−1个节点(i≥1i\geq1i≥1),其中i为层数深度为k的二叉树最多多有2k−12^{k-1}2k−1个节点(k≥1k\geq1k≥1),其中k为树的深度对于任意一棵二叉树,如果其叶节点为n0n_0n0, 度为二的节点n2n_2n2, 则有n0=n2+1n_0 = n_2 +1n0=n2+1如果树为满二叉树(节点只能在最大的两层出现)具有n个节点的完全二叉出的深度为⌊log2n⌋+1\lfloor\log_2n\rfl原创 2020-06-08 20:30:46 · 270 阅读 · 0 评论 -
【数据结构】二叉树顺序存储结构实现
二叉树顺序结构的存储实现是用数组存储的,使用下标存储第i个节点。二叉树的顺序存储结构非常适合存储满二叉树,这使得二叉树的存储占用最少。在数组中完全二叉树中没有双亲节点的值用0填充。二叉树顺序存储结构实现/* * 二叉树的顺序存储结构使用数组存储 * 以节点编号存储在数组中, 例如节点1就存储在数组索引为1的存储单元中 * 对于完全二叉树, 按照层序存储即可 特点:适合存储满二叉树*/#include<iostream>#define MAX_SIZE 100#defi原创 2020-06-08 18:07:58 · 5033 阅读 · 0 评论 -
【数据结构】树、二叉树总结(一)
知识结构树的基本概念和定义树的性质(重要)1. 树中的节点树等于所有节点的度树加1总度数等于根节点的所有子节点,当n=3,则度为2总结点数等于度加12. 度为m的树第i层最多有 mi−1m^{i-1}mi−1 个节点把树每层看做等比数列, 每一层看作一项, 则第1到第i层分别为: a1,a2…aia_1, a_2 \dots a_ia1,a2…ai ;度即为等比梳理的...原创 2020-04-26 19:07:10 · 1005 阅读 · 0 评论 -
【数据结构】图的定义及其概念(一)
图主要知识图的一些概念什么是图图是由顶点集合V和边集E组成的集合,记作G=(V,E)。注意: G中的顶点是有限非空集合. 线性表可以为非空表, 树也可以是空树, 但图不可以是空图. 即图中不能一个顶点也没有.有向图/无向图组成图G的E为有向边是, 此时图称为有向图.假如有两个顶点v1,v2, 此时可记作<v1,v2>, v1可以称作边的头, v2可以称作边的尾....原创 2020-04-21 19:15:41 · 1322 阅读 · 0 评论 -
【数据结构】二叉树三种遍历方式
二叉树的遍历分三种:先序、中序、后序先序遍历:根节点->左孩子->右孩子,则上图树的先序遍历结果为:ABC中序遍历:左孩子->根节点->右孩子,则上图树的遍历结果为:BAC后序遍历:左孩子->右孩子->根节点,则遍历结果为:BCAps:注意根节点的位置,先序在第一个,中序在中间,后续在最后。树的定义就是递归的,特别是链式存储结构的树,因此树的遍历通常使用递原创 2020-04-13 14:32:52 · 1005 阅读 · 1 评论 -
队列实现(循环队列、链式队列)
队列(Queue)是一种类似栈的数据结构, 栈是"后进先出", 而队列是"先进先出"; 队列通常模拟进出一致的数据处理场景, 例如消息推送处理, 商城中的购物处理等.原创 2020-03-16 18:29:20 · 248 阅读 · 0 评论 -
【数据结构】将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均
将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:typedef struct{int top [ 2],bot [ 2];//栈顶和栈底指针SE...原创 2020-03-15 09:40:32 · 8317 阅读 · 4 评论 -
【数据结构】双向链表实现
双向链表(Double Linked List)由两个指针域构成,分别指向前驱、后驱。如下图。判断链表是否到头、到尾:list.next != null、list.prior != null假设上图中间节点为q,则有: q = q->next->prior = q.prior.next线性链表、单链表: https://blog.csdn.net/weixin_4321794...原创 2020-03-14 20:17:13 · 245 阅读 · 0 评论 -
【数据结构】线性、链式List简单实现
文章目录线性数组实现链式实现总结线性数组实现#include <stdio.h>#include <stdlib.h>#define ERROR 0#define OK 1#define OVERFLOW -1#define TRUE 1#define FALSE 0#define INIT_SIZE 5typedef int ElemType;...原创 2020-03-14 10:56:42 · 277 阅读 · 0 评论 -
最大公约数最小公倍数
最大公约数是两个及以上的数,能被所有的数整除的最大因子,就是这些数的最大公约数。举个栗子:8的因子1,2,4,812的因子1,2,4,6,12很明显他们的最大约数4。约数即能以上的数约分的数8/4=0,12/4=0。多个数求最大公约数方法相同。最大公约数的特点:最大为所给数中的最小的数 最小为1最小公倍数能被所给的所有数整除,即所给的数除以最小公倍数均为0。举个...原创 2019-11-29 22:48:23 · 143 阅读 · 0 评论 -
水洼数目
题目: 有一个大小为N*M的园子, 雨后起了积水,八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼.如下列字符组成的图,可以看出有两个水洼。使用深度优先搜索(DFS), 在某一处水洼, 从8个方向查找, 直到找到所有连通的积水. 再次指定下一个水洼, 直到没有水洼为止。输入数据:5 5...WWWWWW....W.W....WWW..public c...原创 2019-05-29 21:41:22 · 1245 阅读 · 0 评论 -
机器人走方格
有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。这里采用两种方法实现。默认是3*3的方格。public class 机器人走方格 { public static void main(String[] args) { ...原创 2019-05-29 21:37:48 · 465 阅读 · 0 评论 -
合法括号
合法括号是个排列组合问题,问题是给出一个n表是括号的数量,让你求出这n个括号的合法摆放方式有那些。示例:n = 3,所有的合法序列为[()()(), (()()), ()(()), (())(), ((()))]这题是求全排列问题的一个变体,问题是放在左边或右边,由于这道是变体题,所以在全排列的基础上增加了放在中间。在这使用迭代和递归实现。迭代实现 /** *...原创 2019-05-29 21:35:59 · 474 阅读 · 2 评论 -
求全排列和非空子集算法——排列组合
在数学种排列和组合都是很重要的,在算法中也是,下面我们将介绍几种求全排列和求元素所有子集的方法。一、全排列全排列如果使用递归来实现的话是元素与元素交换的问题,而如果使用迭代实现的话是把当前字符加在已形成字符的前面或后面的问题。这里分别使用迭代,普通递归和多路递归+回溯实现。迭代实现 //迭代实现,子问题:加在前面,加在后面,加在中间 static List<S...原创 2019-05-29 21:34:39 · 870 阅读 · 0 评论 -
常用字符串算法
一、判断两个字符串是否包含相同的内容1.巧用数组下标实现,把用字符的ASCII码值当作下标,记录出现的字符,然后对两字符串进行遍历 /** * 判断s于s2是否相同 * @param s * @param s2 * @return boolean */ static boolean equals(String s,Strin...原创 2019-05-29 21:27:13 · 3470 阅读 · 3 评论 -
归并排序
归并排序同快排一样也体现了分治的思想,归并排序把数组元素按照下标分成两组,然后分别对每一组进行排序,排序完成后将两个部分合并到一起。过程大致如下图,假设柱子为小朋友,我们的目标的是小朋友按照身高进行排序,如果使用归并排序,首先把小朋友分成两队,然后对每一对按身高进行排序,排完序后两两比较身高,谁的身高矮谁先通过门,最后两个队伍合并到一起排序完成。代码实现:public class...原创 2019-05-29 21:18:34 · 142 阅读 · 0 评论 -
素数环
题目描述素数环:从1到n这n个数摆成一个环,要求相邻的两个数的和是一个素数。如,n=8是,素数环为:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2其总数为4输入n的值(n不大于15)输出打印素数环并输出数量,如果不存在素数环则输出 “no solution!”(不输出双引号)。这个...原创 2019-05-29 09:26:54 · 8473 阅读 · 1 评论 -
独数问题
题目:数独问题:9*9的矩阵,要求每一行,每一列,每个九宫格都是1-9这九个数字且不能重复。给定一9*9矩阵,里面有部分数空缺,要求找出满足上述要求的一个矩阵。形如下方:代码:import java.util.Scanner;public class 独数问题 { public static void main(String[] args) { ...原创 2019-05-29 09:24:20 · 3510 阅读 · 1 评论 -
快速排序
快速排序是平常使用最多的排序算法,就连Java中Arrays类的sort方法在数据量多的情况下也使用快速排序,快速排序体现了分治思想,即在这种排序算法中会把排序元素分成两个部分再进行排序。他的核心思想在于分区,首先找出一个主元(可能的中间值),然后把小于主元的放在左边大于主元的放在右边。最后每个小分区拍好序后整体也就排好序了。代码如下:双分区、单指针扫描快排 /** * ...原创 2019-05-27 16:50:00 · 383 阅读 · 0 评论 -
冒泡排序与选择排序
冒泡排序与选择排序是最经典的排序算法之一,通过这两种排序,我们可以掌握交换数组元素的技巧以及对数组的基本操作。二者均是通过两两进行比较的方式将最大的元素拍到数组尾部,N个元素时第一次需比较N-1次,因此冒泡排序与选择排序都是O(n^2)的时间复杂度。冒泡排序实现: static void bubbleSort(int[] arr) { for(int i=0;i&l...原创 2019-05-27 12:52:45 · 255 阅读 · 0 评论 -
希尔排序
希尔排序(ShellSort)又称缩小增量排序,与插入排序的有着一曲同工之妙,可以认为它是插入排序的升级版,建议看一下我之前写的关于插入排序的博客。希尔排序把所有相同间隔的分为一组,把小于当前值的所有向后移,直到当前值比某个值大,此时停止移动,并于该值进行交换。代码: /** * 迭代希尔排序(缩小增量排序) * @param arr */ s...原创 2019-05-27 12:23:44 · 150 阅读 · 0 评论 -
简单二分
二分查找是极有效率的算法,它的时间复杂度为O(log N),这里使用两个小案例简单分析。递归搜索需要进行排序,否则无法进行,Arrays类提供的BinarySearch方法也是一样的。为了找到某个值,把数据分成两部分,然后看所要查找的数在哪一个范围,如果不在另一个范围则把搜索的范围缩小一半。代码如下:public class 递归二分查找 { public static void...原创 2019-05-27 11:21:05 · 120 阅读 · 0 评论 -
汉诺塔问题
我们的目标是在遵守规则的情况下把一根柱子上的盘子全部都移动到另一根柱子上,在三根柱子中假设其中一根为源柱,其中一根为目标柱,最后一根为辅助柱。源柱即所要移动圆盘的柱子,目标柱即圆盘所要移向的柱子,辅助柱即为了保持圆盘小的在上大的在下暂存盘子的柱子。递归是一种描述重复子问题的思想也是一种逆思想,在这里我们可以把1~(n-1)移动到辅助柱看作一步,然后把第n个盘子移动到目标柱,再然后把移动到辅助柱上的盘子也看作一个整体,将辅助柱子的盘子挪到原空间上去。原创 2019-05-27 10:42:06 · 475 阅读 · 0 评论 -
贪心与动规小结
动态规划动态规划用于解决多阶段决策最优化问题可以用局部最优解来推导全局最优解, 即动态规划三要素阶段状态决策两个条件最有子结构(最优化原理)无后效性:当前状态是前面状态的完美总结,后一个状态的改变不会影响前一个状态,是否可以用动态规划,否则用搜索模型匹配:多做题,掌握经典的模型一维: 上升序列模型, 背包模型二维: 最长公共子序列问题寻找规律: 规模由小...原创 2019-05-20 19:28:53 · 313 阅读 · 0 评论 -
Hash字符串匹配
hash字符串匹配即把固定长度的字符串转化为hash值进行匹配,这种匹配方式在大量数据的情况下是有误差的,大约万分之四五左右,这是因为hash值是通过字符和公式计算出来的,不同的字符串有可能根据我们的计算公式算出相同的hash值,这就会导致匹配的误差。一、普通Hash匹配普通hash匹配即每次截取模式串长度的字串计算hash值,然后原模式串的hash值进行比较,两者相同则认为匹配成功。...原创 2019-05-20 19:23:17 · 2025 阅读 · 0 评论 -
插入排序
插入排序。插入排序将某一个元素(假设为tar,tar=arr[k])插入到它之前的第一个大于它的元素前,如果没有找到比它大的元素,则不进行插入操作;因为这里的操作是插入而不是交换,所以要将tar之前到第一个大于tar的元素均向后移动一格,因此其中使用while循环进行移动操作。原创 2019-05-20 19:10:49 · 171 阅读 · 0 评论