自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 数据结构学习(十一)----------赫夫曼编码

赫夫曼编码简介赫夫曼编码也称哈夫曼编码,是一种编码方式,属于一种程序算法赫夫曼编码是赫夫曼树在电讯通信中的经典应用之一赫夫曼编码广泛的用于数据文件压缩。其压缩率通常在20%-90%之间赫夫曼编码是可变长编码的一种。Huffman于1952年提出一种编码方法,称之为最佳编码原理及图解**定长编码:**将字符串转成对应的ASCII码,然后用其对应的二进制来传递信息变长编码:赫夫曼编码:代码实现:数据的压缩和解压package com.tmo.huffman;

2021-06-17 18:11:25 253

原创 数据结构学习(十一)----------赫夫曼树

赫夫曼树基本介绍给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称赫夫曼树赫夫曼树是带权路径长度最短的树,权值较大的节点离根较近重要概念**路径和路径长度:**在一棵树中,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1.**节点的权及带权路径长度:**若将树中节点赋给一个有着某种含义的数值,则这个数值称为该节点的权。

2021-06-17 18:09:05 89

原创 数据结构学习(十)----------堆排序

堆排序思想将待排序的序列构造成一个大顶堆此时,整个序列的最大值就是堆顶的根节点将其与末尾元素进行交换,此时末尾就是最大值然后将剩余的n-1个元素重新构造成一个堆,这样会得到n个元素的次小值,如此反复执行,便能得到一个有序序列代码实现package com.tmo.tree;import java.util.Arrays;/** * 堆排序 * @author tmo * */public class HeapSort { public static void mai

2021-06-15 11:31:32 87

原创 数据结构学习(十)----------线索化二叉树

线索化二叉树问题上图的二叉树,进行中序遍历的时候,数列为{8,3,10,1,6,14}但是6,8,10,14的左右节点并没有完全利用起来我们需要充分利用这些左右节点,让各个节点可以指向自己的前后节点这时,就需要使用线索化二叉树基本介绍n个节点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向该节点在某次遍历次序下的前去和后继节点的指针(这种附加的指针称为线索)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树,根据线索性质的不同,线序二叉树可分为前序线索二

2021-06-15 11:30:29 90

原创 数据结构学习(九)----------顺序存储二叉树

顺序存储二叉树介绍从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,如图:要求:上图的二叉树的节点,要求以数组的方式来存放 arr:[1,2,3,4,5,6,7]要求在遍历数组arr 时,仍然可以以前序遍历、中序遍历、后序遍历的方式完成节点的遍历顺序存储二叉树的特点顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n+1第n个元素的右子节点为2*n+2第n个元素的父节点为 (n-1)/2n:表示二叉树中的第几个元素(按0开始编

2021-06-15 11:28:37 90

原创 数据结构学习(九)----------树、二叉树

1.示意图树的常用术语节点根节点父节点子节点叶子节点(没有节点的节点)节点的权(节点值)路径(从root节点找到该节点的路线)层子树树的高度(最大层数)森林:多颗子树构成森林2.二叉树树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树二叉树的子节点分为左节点和右节点示意图如果该二叉树的所有叶子节点都在最后一层,并且节点总数等于2^n-1,我们称之为满二叉树如果该二叉树的所有

2021-06-15 11:26:43 40

原创 数据结构学习(八)----------哈希表

哈希表基本介绍散列表(Hash table)也叫哈希表,是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表思路分析代码实现package com.tmo.hashtab;import java.util.Scanner;/** * hashtab的简单案例 * @author tmo * */public class HashTabDemo { publi

2021-06-08 18:08:32 48

原创 数据结构学习(七)----------查找算法

查找算法1.线性查找线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。代码实现package com.tmo.search;/** * 线性查找 * @author tmo * */public class SeqSearch { public static void main(String[] args) { // TODO Auto-ge

2021-06-07 17:52:12 71

原创 数据结构学习(六)----------归并排序

归并排序简介归并排序是利用归并的思想实现排序的方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案”修补“在一起,即分而治之)示意图代码实现package com.tmo.sort;import java.util.Arrays;/** * 归并排序 * * @author tmo * */public class MergeSort { public static void main(String[] args)

2021-06-04 18:09:38 41

原创 数据结构学习(六)----------快速排序

快速排序简介快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有的数据都比另一部分大的所有的数据都要小,然后再按照此方法对这两个部分的数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列示例图代码实现package com.tmo.sort;import java.util.Arrays;/** * 快速排序 * @author tmo * */public class QuickSort {

2021-06-04 18:08:02 49

原创 数据结构学习(六)----------希尔排序

希尔排序简单插入排序存在的问题简介希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序排序思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。图解代码实现package com.tmo.sort;import java.util.Arrays;/**

2021-06-04 18:05:43 51

原创 数据结构学习(六)-----------插入排序

插入排序介绍插入排序属于内部排序法,对于欲排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的排序思想把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。思路图代码实现package com.tmo.sort;import java.util.Arrays;/** * 插入排序 * @

2021-06-03 10:47:20 47

原创 数据结构学习(六)----------选择排序

选择排序介绍选择排序是一种简单的排序方法,他的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]进行交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]进行交换,第三次从arr[2]arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]arr[n-1]中选择最小值与arr[i-1]进行交换,…第n-1次从arr[n-2]~arr[n-1]中选择最小值,与arr[n-2]进行交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列

2021-06-02 18:04:40 52

原创 数据结构学习(六)----------冒泡排序

冒泡排序基本介绍冒泡排序的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前向后移动,就像水底下的气泡一样逐渐向上冒因为排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个flag判断元素是否进行过交换,从而减少不必要的比较代码实现:package com.tmo.sort;import java.text.SimpleDateFormat;import ja

2021-06-02 15:57:42 58

原创 数据结构学习(六)----------排序算法

一、排序算法的介绍1.简介排序也称排序算法,排序是将一组数据,按照指定的顺序排列的过程2.排序的分类内部排序指将需要处理的所有数据都加载到内部存储器中进行排序外部排序数据量过大,无法全部加载到内存中,需要借助外部存储进行排序3.常见的排序算法分类4.算法的时间复杂度事后统计的方法这种方法可行,但是有两个问题:一是想对设计算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比

2021-06-02 14:41:43 190

原创 数据结构学习(五)----------递归

1.递归的概念递归就是自己调用自己,每次调用的时候传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得整洁图解:2.递归的应用场景递归用于解决什么问题?各种数学问题:8皇后问题、汉诺塔、阶乘问题、迷宫问题、球和篮子的问题(Google编程大赛)各种算法中也会用到递归,比如快排、归并排序、二分查找、分治算法等将用栈解决的问题------》递归代码比较简洁递归需要遵守的规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响,比如

2021-06-01 17:26:24 105

原创 数据结构学习(四)----------中缀表达式转后缀表达式

中缀表达式转后缀表达式思路分析:1.初始化两个栈 s1符号栈 和 s2 数字栈 ,s1存放运算符,s2存放数字2.从左到右依次扫描中缀表达式3.遇到操作数时,将其压入s24.遇到运算符时,比较其与s1栈顶运算符的优先级​ 1).如果s1为空,或者栈顶运算符为左括号 ( ,将此运算符直接入栈;​ 2).否则,若优先级比栈顶运算符高,也将运算符压入s1​ 3).否则,将s1栈顶运算符弹出并压入s2中,再次转到(4.1)与s1中的新栈顶运算符进行比较5.遇到括号时​ 1).如果是左括

2021-05-31 17:37:41 118

原创 数据结构学习(四)----------逆波兰计算器

逆波兰计算器的简单应用逆波兰表达式的计算 (后缀表达式)中缀表达式 :(3+4)*5-6后缀表达式 :“3 4 + 5 * 6 -” 从左向右扫描前缀表达式 :"- * + 3 4 5 6" 从右向左扫描将数字入栈,有运算符的话,就从栈中pop出两个元素,计算出结果后将结果再入栈package com.tmo.stack;import java.util.ArrayList;import java.util.Stack;/** * * @author tmo

2021-05-31 17:35:32 89

原创 数据结构学习(四)----------栈的应用案例

运用栈实现计算一个表达式第一次思路:1.需要创建两个栈,一个存放数字的栈numStack,一个存放运算符的栈operStack2.需要一个下标index帮助遍历获取str中的符号3.获取到数字,将数字放到数字栈中4.获取到运算符,判断符号栈中是否为空,为空则直接放到符号栈中5.符号栈中不为空,判断获取到的符号与符号栈中top指向的符号的优先级,5.1如果获取的操作符的优先级小于符号栈中的优先级,从数字栈中取出两个数字与符号栈中的操作符进行运算,将运算结果得到的数放入数字栈,将获取到的操作

2021-05-31 17:33:34 179

原创 数据结构学习(四)----------栈

1.栈的简介栈是一个先入后出的有序列表栈是限制线性表的插入和删除只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底最先放入栈中的元素在栈底,最后放入的元素在栈顶,删除时,最先删除的元素在栈顶,最后删除的是栈底的元素2.栈的应用场景数组模拟栈package com.tmo.stack;import java.util.Scanner;/** * * @author tmo * 1.数组模拟栈 */public

2021-05-31 17:29:35 56

原创 数据结构学习(三)----------单向环形链表和约瑟夫问题

约瑟夫问题Josepfu设编号为1 , 2 , 3 … n的n个人围坐一圈,约定编号为k(1<=k<=n) 的人从1 开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出队,以此类推,直到所有的人都出列为止,由此产生一个出队编号的序列。可以用单向环形链表来解决josepfo问题思路:* 1.首先环形链表有一个first节点,还需要一个辅助节点(helper)指向first的前一个节点* 2.报数前需要将 first节点和 helper节点移动k-1* 3.当报

2021-05-31 17:25:28 57

原创 数据结构学习(三)----------双向链表

双向链表简介双向链表与单链表相比,多了一个指向前一个节点的pre域 ,next域指向下一个节点双向链表的实现package com.tmo.linkedlist;/** * 双向链表的测试 * * @author tmo * */public class DoubleLinkedListDemo { public static void main(String[] args) { // 测试 // 实例化四个hero HeroNode2 hero1 = new He

2021-05-31 17:23:01 38

原创 数据结构学习(三)----------单链表案例

1.求单链表中的有效数据个数 //求单链表中有效节点的个数 不包括head节点 /** * * @param head 头节点 * @return 有效节点的个数 */ public static int getLength(HeroNode head) { //遍历所有的节点 //判断链表是否为空 if (head.next == null) { return 0; } int length = 0;//有效节点的个数 HeroNode temp =

2021-05-31 17:20:14 114

原创 数据结构学习(三)----------单链表

1.链表是以节点的方式进行存储的,链式存储2.每个链表包含data域:存放数据 next域:指向下一个节点3.链表中存放数据不一定是连续的4.链表分为带头节点的链表和不带头节点的链表1.单链表代码实现package com.tmo.linkedlist;public class SingleLinkedListDemo { public static void main(String[] args) { // 测试 //实例化四个hero HeroNode hero1 = n

2021-05-31 17:11:29 59

原创 数据结构学习(二)----------稀疏数组和队列

1.稀疏数组当一个数组中大部分元素为0,或者为同一个值时,可以用稀疏数组来保存改数组。稀疏数组的处理方法稀疏数组第一行记录一共有几行几列,有多少个值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。举例应用实例棋盘问题,要对棋盘上的棋子进行存取,可以先将棋盘上的棋子转化为二维数组,再将二维数组转换为稀疏数组,将稀疏数组进行io操作,写入磁盘;读取时,执行io操作获取稀疏数组,再将稀疏数组转换为二维数组,恢复成棋盘。package com.tmo.sparseA

2021-05-31 17:02:42 61

原创 数据结构学习(一)-----------数据结构简介

数据结构分为:线性结构和非线性结构线性结构数据元素存在一对一的对应关系,线性结构分为顺序存储结构(数组)和链式存储结构(链表)。顺序存储结构:顺序表中的元素是连续的链式存储结构:链表中的元素不一定是连续的,元素节点中存放元素数据以及相邻的节点信息。线性结构主要包含:数组、链表、队列、栈等。非线性结构非线性结构包含:二维数组、多维数组、广义表、图结构、树结构。...

2021-05-31 16:53:31 40

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除