![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法——Old
JAVA的数据结构的算法
爱为斯坦
这个作者很懒,什么都没留下…
展开
-
二叉树——哈夫曼树(妙!)
1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 2) 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1 结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结原创 2020-06-01 22:45:59 · 490 阅读 · 0 评论 -
堆排序!!!!!!!!!
堆排序 堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 大顶堆举例说明 5)小顶堆举例说明: 6)一般升序采用大顶堆,降序采用小顶堆 排序的基本思想 堆排序的基本思想是: 将待排序序列构原创 2020-06-01 00:18:38 · 204 阅读 · 0 评论 -
前序线索化二叉树
前序化二叉树的方法 其实这里的重点就是设置一个变量来记录当前节点的上一个节点,然后再进行处理,重中之重就是画图!!! 还有就是要明白递归是什么,递归式回溯!!! 在上一篇文章中已经讲过线索化二叉树和中序线索化二叉树的方法 现在在这里再讲一下前序线索化二叉树以及遍历前序线索化二叉树的方法 /** * 前序线索化二叉树 * @param node */ void preThreadOrder(HeroNode node) { if(node == null)原创 2020-05-31 13:28:44 · 1124 阅读 · 6 评论 -
JAVA线程高级用法
Lock锁的用法 之前了解了Java中进程锁的关键字synchronized 的用法 今天还有一种方法可以实现进程锁——Lock java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的) Lock锁可以手动加锁解锁,这部分就相当于synchronized括起来的代码段部分 package gaoji; import java.util.concurrent.locks.ReentrantLock; /** * 测试lock锁 */ public原创 2020-05-30 14:27:27 · 362 阅读 · 0 评论 -
线索化二叉树的概念与实现
n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 一个结点的前一个结点,称为前驱结点 一个结点的后一个结点,称为后继结点 说明: 当线索化二叉树后,...原创 2020-05-30 13:18:24 · 259 阅读 · 0 评论 -
顺序存储二叉树
package tree; public class ArrBinaryTreeDemo { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7}; //创建一个arrBinaryTree ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr); arrBinaryTree.perO...转载 2020-05-29 19:05:06 · 187 阅读 · 0 评论 -
JAVA中的二叉树(数据结构)
二叉树的遍历 代码实现 package tree; /** * 二叉树 * 前序中序后序遍历实现 */ public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的节点 HeroNode heroNode1 = ...原创 2020-05-28 23:00:07 · 2567 阅读 · 1 评论 -
哈希表的JAVA实现(HashTable)
Google面试问题描述 有一个公司, 当有新员工报道的时候, 要求将该员工的信息保存(id, 姓名, 年龄, 住址等), 当输入该员工的的id时, 要求查找该员工的所有信息。 注: 不要使用数据库, 尽量节省内存, 速度越快越好 思路分析 不让使用数据库, 越快越好, 我们选择哈希表 使用链表来实现哈希表, 该链表不带表头, 即链表的第一个结点就存放雇员信息 什么是哈希表? 1.哈希表是通过关键码key来直接进行访问的一种数据结构 2.也就是它通过关键码来值映射到表中的一个位置来访问记录,进而加快访问的速原创 2020-05-28 13:22:10 · 567 阅读 · 0 评论 -
插值查找算法(二分查找升级版)
本质上和二分查找一样,但在原基础上进行了公式的优化,使它对于排列较为均匀的数列效率更高! /** * 插值查询 */ public class InsertSerach { public static void main(String[] args) { int[] arr=new int[100]; for (int i = 0; i < 100; i++) { arr[i]=i; } int i..原创 2020-05-27 10:13:53 · 126 阅读 · 0 评论 -
二分查找算法(有序数组)
只适用于有序数组哦!!! 二分查找,顾名思义就是将数组对半分开进行查找 package search; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 二分查找法 * 数组必须有序 */ public class BinarySeatch { public static void main(String[] args) { int[] arr = {1,1,原创 2020-05-26 23:16:11 · 931 阅读 · 0 评论 -
动态规划算法(dynamic planning)
求数组中是否存在某几个数相加等于s? 这里我使用的是Java实现: 使用递归实现 public class Test1 { public static void main(String[] args) { int[] arr={3,34,4,12,5,2,0}; System.out.println(dp_subset(arr,9)); S...原创 2020-04-12 11:41:36 · 501 阅读 · 0 评论 -
数组模拟栈实现计算器功能(加减乘除)
数组模拟栈实现计算器功能(加减乘除) package stack; public class Calculator { public static void main(String[] args) { //根据思路实现表达式的运算 String expression="30+3*2-6+6/2+356*2"; //创建两个栈 ArrayStack2 numstack=new ArrayStack2(10); Array原创 2020-05-10 20:55:43 · 426 阅读 · 0 评论 -
数组模拟链表解决约瑟夫问题
数组模拟链表解决约瑟夫问题 package linkedlist; public class Josepfu { public static void main(String[] args) { CircleSingleLinkedList list=new CircleSingleLinkedList(); list.addBoy(20); list.countBoy(1,19,20); } //创建一个环形的单项链表 } cla原创 2020-05-10 20:58:08 · 198 阅读 · 0 评论 -
单链表模拟栈(数据结构)
package stack; public class Linkdemostack { Linkeddemo top;//初始化栈顶 public static void main(String[] args) { Linkdemostack linkdemostack=new Linkdemostack(); linkdemostack.push(1); linkdemostack.push(2); linkdemostack.原创 2020-05-11 19:09:40 · 104 阅读 · 0 评论 -
使用栈实现中缀表达式转换后缀表达式
package stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class PolandNotation { public static void main(String[] args) { //完成将一个中缀表达式转成后缀表达式的功能 //1. 1+((2+3)*4)-5 =》转成1 2 3 + 4 * + 5 - /原创 2020-05-12 19:59:17 · 801 阅读 · 0 评论 -
递归解决迷宫问题
package recursion; import java.util.ArrayList; import java.util.List; public class MiGonf { public static void main(String[] args) { //创建一个二维数组来模拟迷宫 //地图 int[][] map=new int[8][7]; //使用1表示墙 //上下全部置为1 fo原创 2020-05-12 23:26:39 · 122 阅读 · 0 评论 -
递归实现八皇后
八皇后思路分析 package recursion; public class Queue8 { //定义一个max表示共有多少个皇后 int max=8; int count=0; //定义数组array,保存皇后放置位置的结果 int[] array=new int[max]; public static void main(String[] args) { Queue8 queue8=new Queue8(); qu原创 2020-05-13 00:34:58 · 139 阅读 · 0 评论 -
快速排序算法
快速排序算法 package sort; import java.util.Arrays; public class QuickSort { public static void main(String[] args) { int[] arr={-9,78,0,23,-567,70}; System.out.println(Arrays.toString(arr)); } /** * 中值取在第一位的 * @param arr原创 2020-05-20 00:25:50 · 133 阅读 · 0 评论 -
归并算法(分而治之)
package sort; import java.util.Arrays; /** * 归并算法 */ public class MergerSort { public static void main(String[] args) { int[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; int[] temp=new int[arr.length]; mergeSort(arr,0,arr.length-1,te..原创 2020-05-20 00:45:50 · 154 阅读 · 0 评论 -
基数排序(桶排序) 经典空间换时间算法
基数排序(桶排序) 经典空间换时间算法 package sort; import java.util.Arrays; import java.util.Date; import java.math.*; import java.text.SimpleDateFormat; /** * 基数排序(桶排序) * @author Administrator * */ public class RadixSort { public static void main(String[] ar原创 2020-05-20 23:53:52 · 403 阅读 · 0 评论