
数据结构和算法
编程之美是算法
SickeyLee
努力学习,天天向上,最美的诗和远方!
展开
-
斐波那契数列 递归方法 画图详解
题意说明:斐波那契数列可以写成这么一个序列:1,1,2,3,5,8,13,21 ......也就是每个数等于它前两个数之和,那么给你第 n 个数,问 F(n) 是多少?解题步骤:斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、......这个数列的规律就是从第三项开始的每一项都等于前面两项的和,例2=1+1 ,8=3+5,用函数表示就是F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),下面我们用递归实现一下,详细步骤如下图:代码如下:原创 2021-05-20 11:38:18 · 5413 阅读 · 3 评论 -
碾转相除法
碾转相除法,又叫欧几里德算法,可以用来求两数的最大公约数。算法:用较大数除以较小数,比较得到的余数与0的关系,如果余数等于0,那么较小的数就是两数的最大公约数,如果余数不等于0,则用除数除以余数,依此循环,直到余数等于0.设两数为a,b(a>=b)求a,b两数的最大公约数的步骤为:用a除以b,a%b=r(r>=0) 如果r=0,则(a,b)=b 如果r≠0,用b除以r,依此循环,直到r=0结束算法的流程图(摘自百度百科)代码如下: #include<s.原创 2020-11-26 14:09:24 · 2396 阅读 · 5 评论 -
排序的动画演示
1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)3、插入排序(Insertion Sort)4、希尔排序(Shell Sort)5、归并排序(Merge Sort)6、快速排序(Quick Sort)7、堆排序(Heap Sort)8、计数排序(Counting Sort)9、桶排序(Bucket Sort)10、基数排序(Radix Sort)0、排序算法说明0.1排序的定义对一序列对象根据某个关键字进行排序。0.2 术语.原创 2020-11-24 15:39:20 · 435 阅读 · 0 评论 -
二叉树常见的操作
https://visualgo.net/en/bst原创 2020-04-08 21:37:36 · 184 阅读 · 0 评论 -
图
为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵...原创 2020-03-26 18:32:09 · 153 阅读 · 0 评论 -
二叉树
二叉树.jpg先写一个简单的二叉树的排序算法:package package2;public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类 {...原创 2018-12-12 15:12:34 · 1433 阅读 · 0 评论 -
树结构基础部分
数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节...原创 2020-03-26 13:55:57 · 144 阅读 · 0 评论 -
哈希表
看一个实际需求,google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码...原创 2020-03-26 13:01:22 · 231 阅读 · 0 评论 -
查找算法
在java中,我们常用的查找有四种: 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找线性查找算法 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。 思路:如果查找到全部符合条件的值。[思路分析.]...原创 2020-03-25 17:11:11 · 187 阅读 · 0 评论 -
基数排序(桶排序)介绍:
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是1887年赫尔曼·何乐礼发明的。...原创 2020-03-25 16:49:37 · 189 阅读 · 0 评论 -
归并排序
归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)...原创 2020-03-25 16:32:33 · 202 阅读 · 0 评论 -
快速排序
快速排序法介绍:快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列快速排序法应用实例:要求: 对 [-9,78,0,23,-567,70] 进行从小到大的 排序,要求使用快...原创 2020-03-25 15:54:43 · 193 阅读 · 1 评论 -
希尔排序
简单插入排序存在的问题我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响...原创 2020-03-25 15:36:51 · 161 阅读 · 0 评论 -
插入排序
插入排序法介绍:插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想:插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入...原创 2020-03-24 16:34:25 · 180 阅读 · 0 评论 -
选择排序
基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序思想:选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-...原创 2020-03-24 15:28:44 · 131 阅读 · 0 评论 -
冒泡排序
基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不...原创 2020-03-24 14:19:21 · 210 阅读 · 0 评论 -
排序算法
排序也称排序算法 (Sort Algorithm),排序是将一 组数据,依指定的顺序进行排列 的过程。排序的分类:1) 内部排序:指将需要处理的所有数据都加载 到内部存储器中进行排序。2) 外部排序法:数据量过大,无法全部加载到内 存中,需要借助外部存储进行排序。度量一个程序(算法)执行时间的两种方法事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行...原创 2020-03-24 14:02:52 · 135 阅读 · 0 评论 -
递归
简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。public class RecursionTest { public static void main(String[] args) { // TODO Auto-generated method stub //通过打印问题,回顾递归调用机制 test(...原创 2020-03-24 13:41:30 · 199 阅读 · 0 评论 -
栈
请输入一个表达式计算式:[7*2*2-5+1-5+3-3] 点击计算【如下图】请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈栈的英文为(stack)栈是一个先入后出(FILO-First In Last...原创 2020-03-23 23:12:22 · 218 阅读 · 0 评论 -
链表
链表是有序的列表,但是它在内存中是存储如下小结:链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下使用带head头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作第一...原创 2020-03-23 22:58:47 · 179 阅读 · 0 评论 -
队列
队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图)数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后...原创 2020-03-23 22:29:44 · 178 阅读 · 0 评论 -
稀疏数组
先看一个实际的需求编写的五子棋程序中,有存盘退出和续上盘的功能。分析问题:因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组。基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值 把具有不同值的元素的行列及值记录在一个小规模的数组中,...原创 2020-03-22 21:53:45 · 215 阅读 · 0 评论 -
数据结构
数据结构包括:线性结构和非线性结构。线性结构线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息 线性结构常见的有:数组、队列、链表和栈,后面我们会...原创 2020-03-22 21:32:52 · 114 阅读 · 0 评论 -
Heap
Heap堆是一种特殊的基于树的满足某些特性的数据结构,整个堆中的所有父子节点的键值都会满足相同的排序条件。堆更准确地可以分为最大堆与最小堆,在最大堆中,父节点的键值永远大于或者等于子节点的值,并且整个堆中的最大值存储于根节点;而最小堆中,父节点的键值永远小于或者等于其子节点的键值,并且整个堆中的最小值存储于根节点。 时间复杂度: 访问最大值 / 最小值: O(1) 插入: O(log(...原创 2020-01-15 20:18:40 · 176 阅读 · 0 评论 -
Tree
Tree树是无向、连通的无环图。Binary Tree二叉树即是每个节点最多包含左子节点与右子节点这两个节点的树形数据结构。 满二叉树: 树中的每个节点仅包含 0 或 2 个节点。 完美二叉树(Perfect Binary Tree): 二叉树中的每个叶节点都拥有两个子节点,并且具有相同的高度。 完全二叉树: 除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边...原创 2020-01-14 23:50:33 · 258 阅读 · 0 评论 -
Queue
Queue队列是元素的集合,其包含了两个基本操作:enqueue 操作可以用于将元素插入到队列中,而 dequeue 操作则是将元素从队列中移除。 遵循先入先出原则 (FIFO)。 时间复杂度: 索引: O(n) 搜索: O(n) 插入: O(1) 移除: O(1)...原创 2020-01-14 23:46:50 · 140 阅读 · 0 评论 -
Stack
Stack栈是元素的集合,其包含了两个基本操作:push 操作可以用于将元素压入栈,pop 操作可以将栈顶元素移除。 遵循后入先出(LIFO)原则。 时间复杂度: 索引: O(n) 搜索: O(n) 插入: O(1) 移除: O(1)...原创 2020-01-14 23:46:14 · 156 阅读 · 0 评论 -
Linked List
Linked List链表即是由节点(Node)组成的线性集合,每个节点可以利用指针指向其他节点。它是一种包含了多个节点的、能够用于表示序列的数据结构。 单向链表: 链表中的节点仅指向下一个节点,并且最后一个节点指向空。 双向链表: 其中每个节点具有两个指针 p、n,使得 p 指向先前节点并且 n 指向下一个节点;最后一个节点的 n 指针指向 null。 循环链表:每个节点指向下一个节点...原创 2020-01-14 23:45:36 · 102 阅读 · 0 评论 -
对称加解密算法AES+加解密模式CBC+填充模式PKCS5
目录参考文本前言AES简介前端代码后台代码后台加密解密工具类代码后台接收参数接口代码参考文本前端参考:https://blog.youkuaiyun.com/z834410038/article/details/70231668后端参考:https://blog.youkuaiyun.com/aigoV/article/details/90374838https://bl...转载 2020-01-01 01:15:29 · 1075 阅读 · 0 评论