数据结构
GM.
这个作者很懒,什么都没留下…
展开
-
Java数据结构学习笔记——22 哈夫曼树
哈夫曼树定义给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树又称为最优树.路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点...原创 2019-11-27 16:50:02 · 175 阅读 · 0 评论 -
Java数据结构学习笔记—— 21堆排序
堆排序堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值总是小于(或者大于)它的父节点。子结点的键值总是小于或等于父节点的堆为大顶堆子结点的键值总是大于或等于父节点的堆为小顶堆一般采用大顶堆做升序排序,小顶堆做降序排序,下文以升序为例,下面画个排序流程图举个简单的例子{3,7,9,6,10}总体思路:先构建大顶堆,即...原创 2019-11-26 17:56:05 · 193 阅读 · 0 评论 -
Java数据结构学习笔记——20 树
树定义:树是一个n(n>=0)个结点的有序合集名词理解:结点:指树中的一个元素;结点的度:指结点拥有的子树的个数,二叉树的度不大于2;数的度:指树中的最大结点度数;叶子:度为0的结点,也称为终端结点;高度:叶子节点的高度为1,根节点高度最高;层:根在第一层,以此类推;二叉树定义:由一个结点和两颗互不相交、分别称为这个根的左子树和右子树的二叉树构成(递归定义)二叉树的性...转载 2019-11-26 15:27:51 · 145 阅读 · 0 评论 -
Java数据结构学习笔记—— 18 斐波那契查找
斐波那契查找斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n] (如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。算法实现要点:...原创 2019-11-21 14:00:59 · 113 阅读 · 0 评论 -
Java数据结构学习笔记——19 哈希表(散列)
哈希表(散列)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(k...原创 2019-11-21 13:41:03 · 117 阅读 · 0 评论 -
Java数据结构学习笔记—— 17 插值查找法
插值查找法插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。插值查找法与二分法的基本实现逻辑相同,只是取中间值不同,二分法是从中间取值,那么要查找的值越靠近前或尾就越慢,而插值查找法根据值所在位置选取中间值判断。具体代码实现如下:public class InsertVa...原创 2019-11-20 15:45:32 · 125 阅读 · 0 评论 -
Java数据结构学习笔记——16二分查找
二分查找二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到...原创 2019-11-19 12:46:42 · 105 阅读 · 0 评论 -
Java数据结构学习笔记——15 基数排序
基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。...原创 2019-11-18 13:14:01 · 111 阅读 · 0 评论 -
Java数据结构学习笔记——14 归并排序
归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列...原创 2019-11-17 17:42:57 · 164 阅读 · 0 评论 -
Java数据结构学习笔记——13 快排
快排快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:...原创 2019-11-16 14:10:28 · 120 阅读 · 0 评论 -
Java数据结构学习笔记—— 12 希尔排序
希尔排序希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰...原创 2019-11-15 14:32:52 · 111 阅读 · 0 评论 -
Java数据结构学习笔记——11 插入排序
插入排序插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方...原创 2019-11-14 12:13:43 · 90 阅读 · 0 评论 -
Java数据结构学习笔记——10 选择排序
选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。下面举个例子:下面是选择排序代码实现:public class Sel...原创 2019-11-13 12:08:47 · 92 阅读 · 0 评论 -
Java数据结构学习笔记——09 冒泡排序及优化
冒泡排序冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的...原创 2019-11-12 16:30:56 · 91 阅读 · 0 评论 -
Java数据结构学习笔记——08 递归(迷宫回溯&&八皇后问题)
递归递归就是方法对自身的调用,每次调用时传递不同的变量,方便复杂问题解决迷宫回溯实现代码如下:public class labyrinth { public static void main(String[] args) { int[][] labyrinthArray = new int[8][7]; for (int i = 0; i < 7; i++) { ...原创 2019-11-11 15:23:18 · 242 阅读 · 0 评论 -
Java数据结构与算法——07 逆波兰表达式计算
逆波兰逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。波兰即前缀表达式,逆波兰即后缀表达式,中缀表达式是最常见的即平时我们所见的表达式:下面是三种表达式样式中缀表达式:10+ (5 + ...原创 2019-11-09 18:58:02 · 169 阅读 · 0 评论 -
Java数据结构与算法——06栈实现与简单加减运算式计算
栈栈是一个先入后出的有序列表元素入栈和出栈在同一端,最先放入栈中的元素在栈底最后出栈,最后放入的元素在栈顶最先出栈。下面的代码完成的是一个简单的运算时运算,例如:700x2+6000/10+19的结果下面画下分析:首先计划将数字和运算符号分别存放到两个栈中,然后按顺序压入栈中,在压入运算符时需要进行判断处理,分为以下三种:1 当存放运算符的栈中没有数据时,直接将当前运算符压入栈中2 当...原创 2019-11-08 22:50:39 · 189 阅读 · 0 评论 -
Java数据结构——05 约瑟夫问题打印顺序实现
约瑟夫问题打印顺序实现先介绍一下约瑟夫问题:N个人围成一圈,从第x个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。下面的实现为描述上述过程打印出圈顺序。先画个简单的流程看下出圈顺序:几个人围成一圈可以看做一个单向循环链表,先思路为采用无头结点单向循环链表代表几个人围一圈将几个人插入单向循环链表后,开始下面从x个人开始报数,数到第m个...原创 2019-11-07 18:53:19 · 351 阅读 · 0 评论 -
Java数据结构——04 双向链表的增删改
双向链表的增删改双链表同单链表相比多了前驱节点,相比单链表插入删除更容易,可以随时调用当前节点的前节点,但同时增加了前驱节点,增删两项与单链表有点区别,修改遍历原来的单链表方法一样适用。增加方法过程如下:删除方法:实现如下:class DoubleNode { // id和name是data域 private int id; private String name; p...原创 2019-11-07 16:00:31 · 144 阅读 · 0 评论 -
Java数据结构——03 单链表的增删改遍历
链表链表是有序的,但内存存放地址是不连续的,说它连续是指逻辑上连续,也就是每个元素知道后面是谁或者前后都知道,是按照顺序排列的。链表的每个节点包含一个data域,一个next域。链表分别带头结点的链表和不带头结点的链表。下文介绍的是带头结点的,头结点不存储数据。下面实现的是单链表:说下单链表增加元素的思路,如下图:删除元素思路:修改和遍历很简单,所以不画图了,大概就是遍历链表找...原创 2019-11-05 14:26:09 · 131 阅读 · 0 评论 -
Java数据结构与算法——02环形队列实现
环形队列队列,是一个序列表,遵循先进先出原则,这边文章使用数组实现。既然是先进的先出去后进的后出去,这个实现应该大致包括以下方法://初始化创建队列isEmpty()//判断是否为空isFull()//队列是否已满addData();//向队列添加元素takeData();//从队列取元素showQueue();//显示队列(按顺序)下面来分析下队列存取过程,先画个示意图:此...原创 2019-11-04 17:40:33 · 178 阅读 · 0 评论 -
Java数据结构与算法——01 数据结构概述与稀疏数组实现
数据结构概述数据结构包括线性结构与非线性结构。线性结构的两种不同的存储结构:顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表为顺序表,即存储地址连续。链式存储的线性表成为链表,存储地址不一定连续,元素节点中存放该节点数据以及相邻的节点存储地址。线性结构常见的有:数组、链表、队列、栈非线性结构:二维数组、多维数组、广义表、树结构、图结构稀疏数组如果一个原有数组中大部分是相...原创 2019-11-03 15:15:22 · 130 阅读 · 0 评论