数据结构
程序员黄小青
技术之路任重道远,上下求索不亦乐乎
展开
-
二叉树与B树
二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.多叉树在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)2-3树,2-3-4树就是多叉树,多叉树通过重新组织节点,减少树的.原创 2021-03-20 13:00:04 · 361 阅读 · 0 评论 -
平衡二叉树(AVL树)
介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。代码public class AVLTreeDemo { public static void main(String[] args) { //int[] arr原创 2021-03-20 13:00:10 · 62 阅读 · 0 评论 -
二叉排序树
介绍BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点 public class BinarySortTreeDemo { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};原创 2021-03-13 15:23:51 · 172 阅读 · 0 评论 -
赫夫曼编码
介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码原理剖析通信领域中信息的处理方式1-定长编码 import java.io.FileInputStream;import java.io原创 2021-03-13 14:23:14 · 1290 阅读 · 0 评论 -
赫夫曼树
介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称原创 2021-03-13 14:18:56 · 65 阅读 · 0 评论 -
堆排序
基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆一般升序采用大顶堆,降序采用小顶堆大顶堆举例说明小顶堆举例说明图例说明代码 import java.util.Arrays;原创 2021-03-13 14:07:16 · 68 阅读 · 0 评论 -
线索化二叉树
基本介绍n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种一个结点的前一个结点,称为前驱结点一个结点的后一个结点,称为后继结点 public class Thr原创 2021-03-13 13:51:34 · 66 阅读 · 0 评论 -
二叉树
为什么要使用树数组存储方式的分析:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析能提高数据存储,读取的效率, 比如利用 二原创 2021-03-13 13:01:38 · 63 阅读 · 0 评论 -
哈希表(散列)
介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。代码有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工的 所有信息 import java.util.Scanner;public class HashTabDemo {原创 2021-03-13 12:23:33 · 94 阅读 · 0 评论 -
斐波那契(黄金分割法)查找算法
黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值0.618代码 import java.util.Arrays;public class FibonacciSearch .原创 2021-03-13 11:44:07 · 164 阅读 · 0 评论 -
插值查找算法
介绍插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法举例说明数组 arr = [1, 2, 3, …, 100]假如我们需要查找的值 1使用二分查找的话,我们需要多次递归,才能找到 1使用插值查找算法int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])int mid = 0 + (99 - 0) *原创 2021-03-13 10:43:22 · 200 阅读 · 0 评论 -
二分查找算法(要求有序)
import java.util.ArrayList;import java.util.List;//注意:使用二分查找的前提是 该数组是有序的.public class BinarySearch { public static void main(String[] args) { // int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13,14,15,16,17,18,19,20 }; // in...原创 2021-03-13 10:22:12 · 539 阅读 · 0 评论 -
基数排序(桶排序)
属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。基本思想将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后.原创 2021-03-07 17:25:31 · 124 阅读 · 0 评论 -
归并排序
是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。import java.util.Arrays;//归并排序public class MergetSort { public static void main(String[] args) { int arr[] = { 4, 5,.原创 2021-03-07 15:01:03 · 72 阅读 · 0 评论 -
快速排序
是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 import java.util.Arrays;//快速排序public class QuickSort { public static void main(String[] args) { int[] arr = {-9,78,0,23,-5.原创 2021-03-07 14:31:49 · 65 阅读 · 0 评论 -
插入排序
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。package com.example.demo.shujujiegou;import java.util.Arrays;//插入排序public class InsertSort { public static void main(Strin.原创 2021-03-07 11:39:47 · 76 阅读 · 1 评论 -
选择排序
也是一种简单的排序方法。它的基本思想是:第一次从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次,得到一个按排序码从小到大排列的有序序列。import java.util.Arrays;//选择排序public class Se.原创 2021-03-07 11:39:07 · 59 阅读 · 0 评论 -
冒泡排序
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;//冒泡排序public class BubbleSort { public static void main(String[] args) { //in.原创 2021-03-07 11:37:15 · 78 阅读 · 0 评论 -
排序算法介绍
介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。常见的排序算法分类算法的时间复杂度事后统计的方法:这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要原创 2021-03-07 11:36:34 · 161 阅读 · 0 评论 -
希尔排序
介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。常见的排序算法分类算法的时间复杂度事后统计的方法:这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要原创 2021-03-07 11:44:12 · 72 阅读 · 0 评论 -
八皇后问题(回溯算法)
八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解原创 2021-03-06 19:34:16 · 193 阅读 · 0 评论 -
递归介绍和迷宫问题(回溯)
介绍递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁递归用于解决什么样的问题各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.将用栈解决的问题–>递归代码比较简洁递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响, 比如n变量如果方原创 2021-03-06 19:22:33 · 102 阅读 · 0 评论 -
逆波兰计算器和中缀转后缀
中缀表达式转换为后缀表达式初始化两个栈:运算符栈s1和储存中间结果的栈s2;从左至右扫描中缀表达式;遇到操作数时,将其压s2;遇到运算符时,比较其与s1栈顶运算符的优先级:如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;否则,若优先级比栈顶运算符的高,也将运算符压入s1否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;遇到括号时:(1) 如果是左括号“(”,则直接压入s1(2) 如果是右括号“)”,则依次弹出s1栈顶的运算符原创 2021-03-06 18:19:39 · 98 阅读 · 0 评论 -
中缀表达式栈实现综合计算器
介绍中缀表达式就是常见的运算表达式,如(3+4)×5-6中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作(前面我们讲的案例就能看的这个问题),因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式.)//中缀 实现计算器public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expres转载 2021-03-06 17:43:30 · 88 阅读 · 0 评论 -
java 栈的基本介绍
介绍栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除栈的应用场景子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地原创 2021-03-06 16:22:23 · 2444 阅读 · 0 评论 -
java 约瑟夫问题
介绍package com.example.demo.shujujiegou;public class Josepfu { public static void main(String[] args) { // 测试一把看看构建环形链表,和遍历是否ok CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circl原创 2021-03-06 16:03:25 · 73 阅读 · 0 评论 -
双向链表
介绍使用带head头的双向链表实现 –水浒英雄排行榜管理单向链表的缺点分析:单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除节点,总是找到temp,temp是待删除节点的前一个节点代码package com.example.demo.shujujiegou;public class DoubleLinkedListDemo {}//创建一个双向链表的类class Dou原创 2021-03-06 15:15:42 · 84 阅读 · 0 评论 -
单链表
介绍链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下代码先写个链表的增删改查,在更新一个面试题.求单链表中有效节点的个数查找单链表中的倒数第k个结点 【新浪面试题】单链表的反转【从尾到头打印单链表 【 要求方式1:反向遍历 。 方式2:Stack栈】合并两个有序的单链表,合并之后的链表依然有序【课后练原创 2021-03-06 14:50:00 · 164 阅读 · 0 评论 -
队列
介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:代码实现//数组模仿队列public clas原创 2021-03-06 12:58:14 · 88 阅读 · 0 评论 -
稀疏数组
介绍当一个数组大部分元素为0或者是一个值的数组是,可以使用稀疏数组保存稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模此文以存放棋子为例package com.example.demo.shujujiegou;import java.io.*;import java.util.ArrayList;public class SparseArray { public static v原创 2021-03-06 10:55:31 · 50 阅读 · 0 评论