数据结构与算法
森-Js
521
展开
-
快速幂(全网最详细)
请点击此处传送到全网最详细博客代码1: public int fastPower(int x, int n) { int result = 1; while (n > 0 ){ if(n % 2 == 0){ //如果指数为偶数 n = n / 2; //把指数缩小为一半 x = x * x % 1000; //底数变大成原来的乘方 .原创 2020-09-18 11:42:10 · 395 阅读 · 1 评论 -
分块查找算法
分块查找又称索引顺序查找,它是顺序查找的一种改进方法。算法流程:先选取各块中的最大关键字构成一个索引表; 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。图片借自https://blog.csdn.net/qq_27870421/article/details/106773548?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.210原创 2020-09-16 16:38:51 · 794 阅读 · 1 评论 -
静态查找表与动态查找表
静态查找表:仅做查询和检索操作的查找表动态查找表:在查询之后,还需要将查询结果不在查找表中的数据元素插入到查找表中;或者,从查找表中删除其查询结果为在查找表中的数据元素;简而言之,动态查找表的结构是可以随时修改或变化的,表结构本身在查找过程中动态生成,一般而言链式结构有这个特征,比如二叉查找树、三棵树等。另外,基于顺序存储的Hash查找应该也算动态查找表;而静态查找表的结构一次性生成后就不再允许改变,就像在有序数组上使用折半查找那样。...原创 2020-09-16 10:36:22 · 6941 阅读 · 2 评论 -
二叉树
1、二叉树的概念和常用术语1.1、树的示意图1.2、二叉树的概念2、前序中序后序遍历二叉树3、前序 中序 后序遍历代码实现3.1、代码实现1package tree;public class BinaryTreeDemo{ public static void main(String[] args) { }}//定义的BinaryT...原创 2020-04-29 11:41:42 · 389 阅读 · 0 评论 -
数组 链表 树存储方式分析
1、数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入某个值(按一定顺序)会整体移动,效率较低2、链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)缺点:在进行检索时,效率仍然较低,...原创 2020-04-29 09:27:19 · 723 阅读 · 0 评论 -
四种查找算法(Java)
一、线性查找算法【easy】package search;public class SeqSearch{ public static void main(String[] args) { int[] arr = {1, 3, 9, 8, 7, -1, 2}; //没有顺序的数组 int index = seqSearch(arr, 7); if(index == -1...原创 2020-04-26 11:44:29 · 2039 阅读 · 0 评论 -
哈希表
哈希表的基本介绍package hashTab;import java.util.Scanner;public class HashTableDemo{ public static void main(String[] args) { //创建哈希表 HashTab hashTab = new HashTab(7); //写一个菜单 S...原创 2020-04-11 15:01:06 · 121 阅读 · 0 评论 -
基数排序
基数排序图文:代码分析:package sort;import java.util.Arrays;public class RadixSort{ public static void main(String[] args) { int arr[] = { 53, 3, 542, 748, 14, 214}; radixSort(arr); } ...原创 2020-04-09 11:38:40 · 138 阅读 · 0 评论 -
归并排序
归并排序介绍归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案‘修补’在一起,即分而治之)。package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;...原创 2020-03-18 10:24:52 · 7586 阅读 · 2 评论 -
快速排序
基本思想:快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:对于给定的一组记录,选...原创 2020-03-17 20:29:33 · 146 阅读 · 0 评论 -
希尔排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整...原创 2020-03-17 09:02:30 · 300 阅读 · 0 评论 -
插入排序
插入排序法介绍插入式排序属于内部排序,是对于欲排序的元素以插入的方式找寻该元素的适当位置,已达到排序的目的插入排序法思想把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把他的排序码依次与有序表中的排序码进行比较,将他插入到有序表中的适当位置,使之成为新的有序表代码:package ...原创 2020-03-16 11:10:59 · 95 阅读 · 0 评论 -
选择排序及速度测试
·package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class SelectSort { public static void main(String[] args) {// int[] arr = {4, 3, 2, 1...原创 2020-03-15 21:40:53 · 156 阅读 · 0 评论 -
冒泡排序及优化
冒泡排序+优化优化思想:在一次冒泡中,当没有数据交换的话,直接突出循环另外,代码加上了时间复杂度的测试:O(n^2)package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class BubbleSort { public s...原创 2020-03-15 10:48:56 · 109 阅读 · 0 评论 -
排序算法的介绍
排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。2)外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序3)常见的排序算法算法的时间复杂度:度量一个程序(算法)执行时间的两种方法1)事后统计的方法这种方法可行,...原创 2020-03-13 17:13:08 · 220 阅读 · 0 评论 -
八皇后问题
*递归-八皇后问题(回溯算法)八皇后问题算法思路分析1)第一个皇后先放第一行第一列2)第二个皇后放在第二行第一列,判断是否OK,如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适的3)继续第三个皇后,还是第一列、第二列......直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确的解4)当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将...原创 2020-03-13 11:47:44 · 164 阅读 · 0 评论 -
迷宫回溯问题
如上,黑色为障碍物,从青色到红色代码+注释:package recursion;public class MiGong{ public static void main(String[] args) { //先创建一个二维数组,模拟地图 int[][] map = new int[8][7]; //墙用1来表示 //上下全部置1 for(int i =...原创 2020-03-12 13:49:37 · 177 阅读 · 1 评论 -
图解递归调用机制
递归需要遵守的重要规则1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2)方法的局部变量是独立的,不会相互影响。比如n变量3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据4)递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError5)当一个方法执行完毕,或者遇到return,就会返回,遵循谁调用,就将...原创 2020-03-12 10:26:09 · 326 阅读 · 0 评论 -
中缀表达式转后缀表达式计算表达式值
思路:1.将中缀表达式转换为list2.将中缀表达式的list转换为后缀表达式list3.通过后缀表达式计算结果:思路见注释(详细)package stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation{ p...原创 2020-03-10 20:30:11 · 227 阅读 · 0 评论 -
计算器(栈实现)
通过栈的数据结构实现一个计算器详解见注释package stack;public class Calculator{ public static void main(String[] args) { //表达式 String expression = "3+20*6-20"; //创建两个栈,一个符号栈,一个数栈 ArrayStack2 numStack ...原创 2020-03-08 20:50:27 · 766 阅读 · 0 评论 -
数组、链表实现栈结构
数组实现:详情见注释package stack;import java.util.Scanner;public class ArrayStackDemo{ public static void main(String[] args) { //测试一下ArrayStack是否正确 //先创建一个ArrayStack对象,表示栈 ArrayStack stack =...原创 2020-03-08 09:40:09 · 245 阅读 · 0 评论 -
图解约瑟夫问题
循环链解决约瑟夫问题详细解释,请见代码注释package linkedList;public class CircleLinkedListDemo{ public static void main(String[] args) { CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinke...原创 2020-03-05 19:30:16 · 214 阅读 · 0 评论 -
双向链表的增删改查
具体分析:见注释,简明易解package linkedList;public class DoubleLinkedListDemo{ public static void main(String[] args) { //测试 System.out.println("双向链表的测试~"); //先创建节点 HeroNode2 node1 = new HeroNode2...原创 2020-03-05 11:04:54 · 991 阅读 · 0 评论 -
逆序打印单链表【百度面试题】
不改变链表的结构,逆序打印单链表思路:通过栈来进行操作伪代码: //逆序打印出单链表 //利用栈的这种数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,实现逆序打印的效果 public static void reversePrint(HeroNode head) { if(head.next == null) { return; //空链表,...原创 2020-02-25 12:04:29 · 407 阅读 · 1 评论 -
反转单链表【腾讯面试题】
单链表常见面试题3)将一个单链表反转思路:1、先定义一个节点reverseHead = new HeroNode;2、从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表的最前端3、原来的链表的head.next =reverseHead.next伪代码: //将单链表反转 public static void reversetList(Hero...原创 2020-02-24 20:19:11 · 962 阅读 · 0 评论 -
求单链表中有效节点的个数+查找单链表中倒数第k个节点【新浪面试题】
单链表的常见面试题:代码+思路1)求单链表中有效节点的个数伪代码(完整代码在下方):获取头节点: //先初始化一个头节点,头结点不要动,不存放具体数据 private HeroNode head = new HeroNode(0, "", ""); //获取头节点 public HeroNode getHead() { return head; } /...原创 2020-02-24 15:29:11 · 379 阅读 · 0 评论 -
单链表的增删改查
根据一个数字no,来删除一个节点package linkedList;public class SingleLinkedListDemo{ public static void main(String[] args) { //进行测试,先创建节点 HeroNode node1 = new HeroNode(1, "宋江", "及时雨"); HeroNode no...原创 2020-02-23 11:06:27 · 301 阅读 · 0 评论 -
单链表节点的修改
根据单链表节点的no值,修改节点的信息package linkedList;public class SingleLinkedListDemo{ public static void main(String[] args) { //进行测试,先创建节点 HeroNode node1 = new HeroNode(1, "宋江", "及时雨"); HeroNo...原创 2020-02-23 09:59:30 · 1913 阅读 · 0 评论 -
单链表按照顺序插入节点
单链表按照顺序插入节点按照节点的no值进行排序插入链表插入时:定义一个temp辅助节点,插入的位置即:temp之后如图:插入时,temp为2节点 temp.next = 节点4因此有:插入节点.next = temp.nexttemp.next == 插入节点package linkedList;public class SingleLinked...转载 2020-02-22 18:56:39 · 2089 阅读 · 1 评论 -
单链表的创建和遍历
链表介绍链表是有序的列表,但是他在内存中是存储如下1)链表是以节点的方式来存储,是链式存储2)每个节点包含data域,next域:指向下一个节点3)如图:发现链表的各个节点不一定是连续存储4)链表分带头节点的链表和没有头节点的链表,根据实际需求来确定单链表(带头结点)逻辑结构示意图如下package linkedList;public class...原创 2020-02-22 17:47:34 · 1126 阅读 · 0 评论 -
循环队列
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。 循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再...原创 2020-02-21 14:47:21 · 554 阅读 · 0 评论 -
队列的介绍以及代码实现
队列介绍# 队列是一个有序表,可以用数组或是链表来实现# 遵循先进先出的原则。即:先存入队列的数据,要先取出。后存入数据的要后取出# 示意图:使用数组模拟队列示意图数组模拟队列# 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如图,其中MaxSize是该队列的最大容量。# 因为队列的输出、输入是分别从前后端来处理的,因此需要两个变量fro...原创 2020-02-20 19:04:19 · 479 阅读 · 0 评论 -
稀疏数组的代码实现
稀疏数组转换的思路分析二维数组 转 稀疏数组的思路1、遍历原始的二维数组,得到有效的个数sum2、根据sum就可以创建稀疏数组sparseArr int[sum+1][3]3、将二维数组的有效数据存入到稀疏数组稀疏数组转原始的二维数组的思路1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2 = int[11][1...原创 2020-02-19 22:07:01 · 298 阅读 · 0 评论 -
稀疏数组(sparsearray)的应用场景
先看一个实际的需求:**编写一个五子棋程序中使用二维数组记录棋盘**分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据因此可以使用稀疏数组-稀疏数组:基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法是:1)记录数组一共有几行几列,有多少不同的值2)把具有不同...原创 2020-02-18 13:08:12 · 826 阅读 · 0 评论 -
线性结构和非线性结构
数据结构包括: 线性结构和非线性结构**线性结构1)线性结构作为最常见的数据结构,其特点是数据元素之间存在一对一的线性关系2)线性结构有两种不同的数据结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的3)链式存储的线性表称为链式表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻的地址信息4)线性结构常见的有:数组、队列、链...原创 2020-02-17 21:06:20 · 287 阅读 · 0 评论