
数据结构和算法
程序员飞鱼子
花有重开日,人无再少年。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
35、二叉排序树的添加和删除节点
思路:二叉排序树的定义:形如图1所示,每棵二叉树有一个根节点,根节点下面至多有两个子节点,每个节点只能最多有两个分支节点,并且左侧分支子节点数值小于父节点数值,右侧子节点数值大于父节点数值。 ...原创 2020-05-15 18:17:45 · 1985 阅读 · 0 评论 -
34、哈夫曼树压缩文本和解压文本
思路:利用输入流和输出流进行文本的读出和写入,注意:压缩文件时会用到对象流(ObjectOutputStream写入文件),解压文件时,也会用到对象流(ObjectInputStream,读出文件)代码://压缩文件 public void zipFile(String srcFile, String dstFile) { InputStream is = null; OutputStream os = null; ObjectOutputStream oos = null;原创 2020-05-15 11:47:42 · 504 阅读 · 0 评论 -
33、哈夫曼解压(有问题,待解决)
哈夫曼编码的时候,我们得到了哈夫曼哈希表、编码后的字节数组,我们根据这两个,便可以进行解码。思路:1、首先将字节数组转化为二进制字符串:/** * 将一个byte 转成一个二进制的字符串, 如果看不懂,可以参考我讲的Java基础 二进制的原码,反码,补码 * @param b 传入的 byte * @param flag 标志是否需要补高位如果是true ,表示需要补高位,如果是false表示不补, 如果是最后一个字节,无需补高位 * @return 是该b 对应的二进制的字符串,(注原创 2020-05-14 19:27:34 · 687 阅读 · 0 评论 -
32、哈夫曼编码之数据压缩
前言:前面讲了如何如何生成哈夫曼树,如何用哈夫曼树进行编码,进而得到哈夫曼哈希表,本节主要讲实例,如何对字符串进行压缩展示。思路:1、将字符串用生成哈夫曼树,生成哈夫曼哈希表 2、将原byte[]通过哈夫曼哈希表,生成新的byte[],进而压缩了数据代码://数据压缩:将字符串压缩 public byte[] zip(byte[] bytes, Map<Byte, StringBuilder> hfmMap) { StringBuilder stringBuilder =原创 2020-05-14 14:28:39 · 692 阅读 · 0 评论 -
31、赫夫曼编码
1、赫夫曼编码概念是一种编码方式,属于一种程序算法。 广泛用于数据文件的压缩,其压缩率在20%~90%左右。一般的编码流程:字符穿 => ASCLL编码编码发展过程:定长编码(不进行处理)=>变长编码(减少长度,但是有多异性) => Hefuman编码2、赫夫曼编码思路1、先总结每个字符使用频率,并存入节点2、将频率作为权值,将每个字符作为叶子节点,构建赫夫曼树3、将赫夫曼树每个节点(非叶子节点)的左边分支标为0,右边分支标为1。那么,从根节点到叶子节点的分支上原创 2020-05-13 18:22:46 · 456 阅读 · 0 评论 -
30、赫夫曼树
1. 概念赫夫曼树:给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也叫赫夫曼树(Huffman Tree)。路径:从一个节点往下可以达到的孩子或者孙子节点之间的通路,称之为路径。路径长度:通路中的分支数目称之为路径长度,若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1。权:将书中的节点赋给一个有某种意义的数值,则这个数值称之为给节点的权。带权路径长度:从根节点到该节点之间的路径长度与该节点的权的乘积。.原创 2020-05-13 16:17:51 · 143 阅读 · 0 评论 -
29、堆排序
思路:1、首先是初始化堆,建立从小到大的升序堆,只需要保证父节点的值大于相邻的子节点值即可2、将数组收尾换位置,确保最大的元素在数组的尾部。3、此时从头部元素开始调整堆,使他满足从小到大的序列,以此执行2-3步,直到执行n-1次(n:数组的长度) 代码: package heap; import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class Heap原创 2020-05-12 11:54:38 · 160 阅读 · 0 评论 -
28、线索二叉树
1、前序和中序线索二叉树 思路就是构建个pre指针,在交换时,注意pre和curNode节点的指针指向问题代码:package tree;import javax.xml.soap.Node;public class ThreadBinaryTreeDemo { public static void main(String[] args) { // TODO Auto-generated method stub //1、**************演示前中后序打印结果***原创 2020-05-09 12:18:23 · 175 阅读 · 0 评论 -
27、数组存储完全二叉树
思路: 简单介绍了用数组存储完全二叉树的问题,重点就是找到父节点和子节点的关系(Node = 2leftNode+1,Node = 2rightNode+1 ) 下面的代码就是二叉树用数组存储后,怎么对数组进行前中后遍历的问题。 代码: package tree;public class ArrBinaryTreeDemo { public static void main(String[] args) { // TODO Auto-generated method stub..原创 2020-05-08 18:53:45 · 1704 阅读 · 0 评论 -
26、二叉树的应用
思路:写了树节点类、树类和测试类,并写了前中后序遍历和搜索,并写了删除函数。相关代码package tree;public class BinaryTreeDemo { public static void main(String[] args) { //1、**************演示前中后序打印结果*************** // TODO Auto-generated method stub BinaryTreeNode binaryTreeNode1原创 2020-05-08 18:49:17 · 174 阅读 · 0 评论 -
25、哈希表的应用
引入谷歌问题:添加公司员工的个人信息(id、姓名),并且,能通过id查询该员工的信息。 要求:不使用数据库、速度越快越好=》哈希表(散列) 思路:建立三个类:员工信息节点类、单链表类、哈希表类代码:package Hash;import java.awt.RenderingHints.Key;import java.util.Scanner;import or...原创 2020-05-08 15:39:19 · 974 阅读 · 0 评论 -
22、查找算法:顺序查找+二分查找
1、顺序查找过于简单,此处就不再赘述。2、二分查找(适用于有序数组)思路: 要找的元素为targe,数组为arr:1、首先定义left和right(left:数组最左边的index,right:数组左右最右边的index)2、定义mid = (left+right)/2,比较mid处的元素和targe的大小 2.1、如果arr[mid]>targe,那么要找的元素在le...原创 2020-05-06 16:05:15 · 285 阅读 · 0 评论 -
24、查找算法:斐波那契查找算法
铺垫知识:黄金分割点:黄金分割点是指把一条线段(长度为H)分割成两部分A和B,其中A/H=B/A,取前三位近似值为0.618,由于按照这个比例设计的造型十分美丽,所以称作**黄金分割**,也叫**中外比**。斐波那契数列:{1,1,2,3,5,8,13,21,34,55...}这个数列满足如下性质:1、index为0和1的元素的值都为1;2、从第三个元素开...原创 2020-05-07 17:32:04 · 349 阅读 · 0 评论 -
23、查找算法:差值查找(二分查找优化)
思路:针对二分查找算法中的mid定义,我们可以优化些,二分查找中,mid = (left + right)/2我们可以写成mid = left + (right - left)/2针对除数2,我们可以有个优化,用(targe - arr[left])/(arr[right] - arr[left])来替代2,这样,每次取mid时会更加接近targe值代码:package Se...原创 2020-05-06 16:43:21 · 359 阅读 · 0 评论 -
20、基数排序
思想:用空间换时间,他用一个二维数组(10*n)和一位数组(1*10),用于排序的道具,该排序不是依据的传统的比较的思想,她是采用,先让所有元素按照个位的数字,放在二维数组中(二维数组中,第一维:个位、十位、百位...,第二位用于盛放数据:一个数据、两个数据...),然后以为数组记录每个个位数组里数据的数量,然后再将二维数组中的数据,依据从小到大的顺序拿出来,这个新组成的数据,就是第一轮排序后...原创 2020-04-30 19:24:00 · 182 阅读 · 0 评论 -
19、归并排序
思想:归并排序个人理解的是==分治==思想,先把整体一直递归的划分成单独的最小单元(只含有一个元素的单独个体),然后回溯将单个个体排序,组成有序的小个体,然后对这些有序的小个体进行排序代码:package Sort;import java.util.Arrays;public class MergeSort { public static void main(String[...原创 2020-04-30 19:23:25 · 146 阅读 · 0 评论