自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

QS_Sun_24的博客

爱拼才会赢

  • 博客(57)
  • 收藏
  • 关注

原创 分支限界法

基本思想解空间树:该法和回溯法一样,需要把问题的解空间构造成树结构。搜索方式:该法对树的搜索方式采用广度优先。限界:为了提高搜索效率,在每个节点处进行判断,选择满足要求的最优结点来推进,以求快速达到最优解。辅助“工具”分支限界法的遍历过程,需要把满足要求的活结点(当前结点所连接的所有儿子结点)存储起来,组成活结点表,并且按照一定顺序从表中取出结点。常用队列结构存储活结点表,根据...

2018-08-09 18:05:30 1459

原创 袋鼠过河问题(Java)

从牛客网上看到的这道题;题目如下:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,...

2018-08-08 11:00:09 1527 1

原创 2019阿里校招测评——光明小学接力赛(Java)

合理宣泄下:太久没做题了,脑子锈了~然后拿到题,莫名大脑空白了10分钟,再接着看懂了题目,但就是不晓得怎么下手。所以就计划边写边想(至少把输入,主函数什么的敲进去),但是!!!不晓得是按错了Tab键还是什么,竟然交卷了,心塞的不行~~题目:*光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? *光明小学可以抽象...

2018-08-06 20:44:45 1905

原创 回溯法

基本思想定义:以深度优先方式系统(全面)搜索问题的算法。解空间表示:目的在于直观地看到所有解(包含最优解),把问题的所有可能解通过树或者图的方式列出,这样容易理解,且方便针对性的确定搜索方法。回溯:以树为例,从一个结点出发深度遍历(根左右),每到一个结点就判断是否符合题目要求,若符合就继续,当遍历到叶子节点时就对比并记录下当前最优结果;若不符合,就直接返回上一结点遍历另一分支。剪枝...

2018-08-05 11:21:06 1823

原创 贪心算法

基本思想子问题:同动态规划一样,也是问题能拆成子问题。贪心:即只关注当前这一步,从所有选项里选取使当前最优的那个,不关注整体。自顶向下:该算法是根据当前贪心做出的选择,迭代的来简化,得到规模小的问题。重要性质贪心选择:贪心就是上面的解释,但我们的目的还是能得到整体的最优。所以重点是:证明通过每一步的贪心选择能产生整体的最优解,只有这样才有使用贪心算法的必要。(除了不需要最优解情...

2018-08-03 14:48:53 913

原创 备忘录方法

算法定位该法是动态规划的变形,或者可以理解为动态规划的优化,优化在增强理解和书写简单方面。直接递归如果一个问题可以不断拆分成子问题,然后再由小问题的解,一层层归约回大问题。那么,这种问题可以直接采用递归法求解。以上一篇中的矩阵连乘问题为例,可以得到如下的递归求解套路:public static int recurMatrixChain(int i,int j) { /** ...

2018-08-03 10:56:08 3180 2

原创 动态规划算法

基本思想子问题:动态规划同样是把大问题拆分为小问题,小问题继续拆,直到没得拆(极其容易获得结果)。但这些拆开的小问题之间不是互相独立的,也就是同一层次的子问题之间存在结果的传递利用。同一层次:即由同一个大问题拆分得到的多个小问题; 互相独立:排序如[2,1,4,3,6,5]拆分为A:[2,1,4]和B:[3,6,5],子问题A和B的排序互不影响,各排各的; 结果传递:如0-1背包,容量...

2018-08-02 22:55:43 431

原创 函数crossvalind

搬运(帮助文档)+翻译+学习学习神经网络时知道了“交叉验证”这个名词~然鹅,看懂了原理不会写代码(可能懒),最终,由度娘牵线发现matlab里自带了个相关度十分高的函数“crossvalind”,所以就学习记录一下,看能不能帮到自己~作用:句法:Indices = crossvalind

2017-08-07 16:18:11 2393

原创 分治法

分治是求解问题时的一种解题思想,即把一个难以直接解决的规模为n的大问题,分割成k个规模较小的子问题,以便各个击破,分而治之,这些子问题互相独立且与原问题相同。分治设计出的算法一般都是递归算法,分治是思想,那么递归就是求解最终答案的手段,递归的解这些子问题,然后将各子问题的解合并得到原问题的解,所以说分治与递归像一对孪生兄弟。出于一种平衡子问题的思想,在用分治法设计算法时,最好使子问题的规模

2017-05-23 10:45:55 409

原创 哈希表——实现

根据前文的分析,设计一个哈希表,哈希函数采用除留余数法,解决冲突的函数采用开放定址法中的线性探查法。首先设计哈希表项类:package HashTable;/*** @author sun* 创建时间:2017年5月14日上午11:55:18*//*建立哈希表项类 * 因为不确定数组中某个位置是否保存了数据元素 * 所以,要为每个位置设置一个标志,来表示数组元素的当前状态

2017-05-14 14:53:38 337

原创 哈希表——概念

在之前讨论的各种数据结构中,数据元素的存放位置是人为给定的,和数据元素本身没有直接关系。这种情况下,存取一个元素只有按地址直接存取和遍历查找两种方法。顺序存储结构和链式存储结构是两种基本的存储结构,哈希表是一种特殊类型的存储结构,它是一种数据元素及其在内存中的位置之间存在某种函数关系的存储结构,如果构造合适,时间效率非常高。哈希表主要是构造一个映射函数,该函数以数据元素为自变量,函数值即为

2017-05-14 09:58:51 1488

原创 关键路径

AOE网对工程管理问题的表示:在有向图中,如果顶点表示事件,有向边表示活动,有向边上的权值表示活动持续时间,这样的有向图称“边表示活动的网”即AOE网。如下图AOE网中,有10个事件,15个活动。AOE网对比AOV网:(1)AOV网的有向边不考虑权值,而AOE网的有向边考虑权值;(2)AOV网的入度为0的顶点可以有多个,而AOE网入度为0的顶点只有一个;(3)AOV网的

2017-05-13 16:15:31 3103

原创 拓扑排序

拓扑排序是指由某个集合上的偏序关系得到该集合上的全序关系。若集合X上的关系R是自反的、反对称的和传递的,则称关系R是集合X上的偏序关系(半序关系)。偏序关系和前面在树中讲过的等价类非常相似。集合X上的偏序关系R说明(设关系R为定义在集合X上的二元关系):(1)若对每一个x∈X,都有(x,x)∈R,则称R是自反的

2017-05-13 16:13:01 498

原创 最短路径-Dijkstra

首先,提出两点:一、如果把不带权图上的所有边的权值均定义为1,则该不带权图可以归结为带权图;二、如果把无向图中的每一条边(vi,vj)都定义为弧和弧,则该无向图可以归结为有向图。因此不失一般性,我们只用看有向带权图怎么求解最短路径问题就ok。带权图中,从一个结点到另个一结点存在着多条路径,称每一条路径上所经过边的权值之和为该路径上的带权路径长度,那么在两个结点间的所有路径中,路径长度值最小的称

2017-05-12 15:29:18 423

原创 最小生成树

一个有n个结点的连通图的生成树是原图的极小连通子图,使用不同的寻找方法或从不同的初始结点出发都可以得到不同的生成树。对于n个结点的无向连通图,它的生成树有且只有n-1条边。如果无向连通图是一个带权图,那它的所有生成树中必有一棵边的权值总和最小生成树,那么这棵树就是最小生成树。构造有n个结点的无向连通带权图的最小生成树,必须满足以下条件:(1)构造的最小生成树必须包括n个结点;(2)

2017-05-11 16:04:08 1563

原创 图的遍历

图的遍历方法主要有两种:(1)深度优先遍历,类似于树的先序遍历;(2)广度优先遍历,类似于树的层序遍历。遍历设计三思:(1)图没有首尾之分,所以算法中必须指定访问的第一个结点;(2)图的遍历过程中可能会构成一个回路,造成死循环,所以要考虑到所有的死循环问题;(3)一个结点可能和多个结点都是邻接关系,所以要使一个结点的所有邻接结点按照某种次序被访问。图又分连通图和非连通图,连通图中,从初始结

2017-05-09 10:03:41 4796

原创 图的存储结构

图的信息包括两部分,结点信息和结点间边的信息;结点信息可用线性表(顺序表或单链表)来存储,对于n个结点的图,每个结点都可能与其他n-1个结点成为邻接结点,所以边的信息存储是一个n×n矩阵的存储,主要有邻接矩阵和邻接表两种方法。1、邻接矩阵存储邻接矩阵定义,假设图G=(V,E)有n个结点,即V={v0,v1,...,v(n-1)},E可用矩阵A描述,对于A中的每一个元素aij,满足(1)若(

2017-05-07 15:26:04 391

原创 图的基本概念

图是由结点集合及结点间的关系集合组成的一种数据结构,也可以这么理解,图是这样一种结点集合,若规定了其中某个结点为初始结点,则图中每个结点可以有零至多个直接前驱和零至多个直接后继。图G=(V,E),其中V={x|x∈某个数据元素集合},E={(x,y)|x,y∈V}或E={|x,y∈V并且Path(x,y)}。式中(x,y)表示从x到y的一条双向通路,即(x,y)是无方向的;Path(x,y)表

2017-05-06 12:38:57 521

原创 树与二叉树的转换、树的遍历

树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树。在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左孩子结点指针,右兄弟结点指针是二叉树中右孩子结点指针。树转换为二叉树过程:(1)树中所有相同双亲结点的兄弟结点之间加一条连线;(2)对树中不是双亲结点的第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,

2017-05-05 16:08:08 16441 2

原创 树与等价类

若集合X上的关系R是自反的,对称的和传递的,则称关系R是集合X上的等价关系,等价关系R说明(设R为定义在X上的二元关系):(1)自反:对于每个x∈X,都有(x,x)∈R;(2)对称:对于任意的x,y∈X,若当(x,y)∈R时,有(y,x)∈R;(3)传递:对于任意的x,y,z∈X,当(x,y)∈R且(y,z)∈R时,有(x,z)∈R。等价关系的实质是将集合中的元素分类,按照R将集合

2017-05-05 15:17:54 3222 1

原创 哈夫曼树

基本概念:(1)一棵二叉树中定义,从A结点到B结点所经过的分支序列叫A到B的路径,所经过的分支个数叫路径长度;(2)从二叉树的根结点到二叉树中所有叶结点的路径长度之和称为该二叉树的路径长度。若叶结点带有权值,设二叉树有n个带权值叶结点,定义从根结点到二叉树中所有叶结点的路径长度与相应叶结点权值的乘积之和为该二叉树的带权路径长度(WPL)。那么,对于一组具有确定权值的叶结点,可以构造出多个具有不

2017-05-04 14:38:27 639

原创 线索二叉树

过完五一快拿不起书了~哎~一本数据结构拖了这么久前面说到用游标类来实现分步遍历,那么线索二叉树就是另一种分步遍历方式。区别在于:二叉树游标类只能从前向后分步遍历二叉树,而线索二叉树既可以从前向后也可以从后向前分步遍历。前面提到的所有遍历中,都没有把遍历时得到的结点的后继结点信息和前驱结点信息保存下来,因此,不能像操作双向链表那样操作二叉树。保存这些信息的常用方法就是建立线索二叉树。注意

2017-05-03 14:24:35 288

原创 二叉树的分步遍历

这个名字起的不太能理解!二叉树的分步遍历是指,在规定了一棵二叉树的遍历方法后,每次只访问当前结点的数据元素,然后使当前结点为当前结点的后继结点(我类个去,绕口令啊),直到达到二叉树的最后一个结点为止,就像操作单链表一样。在看概念:二叉树遍历有两种情况,一种是一次性遍历,如之前提到的四种遍历方法一次性遍历显示二叉树结点的数据元素值;另一种是分步遍历。大白话理解:结合上面两个,我认为是可以

2017-04-27 11:21:02 534

原创 二叉树设计(二)

本文学习上文提到的二叉树实现的第二个方法:建立二叉树类。首先补一个知识点:前面我们用递归实现了遍历,那么我们是否能用非递归结构实现遍历呢?答案是:可以的。在递归学习中我们知道转换的方法通常有两种,都要用到堆栈,因此,即便是不分析遍历特点我们也知道是堆栈。分析:前序遍历中,在所有未被访问的结点中,已访问的结点中最后访问(输出)结点的左子树的根结点将最先被访问,因此堆栈设计如下:(1)初始

2017-04-24 15:00:42 617

原创 二叉树设计(一)

二叉树链式存储结构下,有两种基本的实现方法:(1)首先设计二叉树结点类,然后在二叉树结点类的基础上,用static成员函数实现对二叉树的操作,把这些函数封装在一个类中。(2)也是在二叉树结点类的基础上,再设计一个二叉树类来实现。大白话翻译:其实第一种方法就是给一个结点的散点类,给一个对二叉树操作(如遍历)的类,然后你要在主函数中通过结点类把一堆散点拼接成树,再用操作类里的函数对树操作。第二种方

2017-04-24 09:38:47 3477

原创 树和二叉树

树:树是一种结点集合,其中每个结点最多只有一个直接前驱结点,但可以有若干个直接后继结点。树的结构表示了数据元素之间的层次关系。常用术语:结点:由数据元素和构造数据元素之间关系的指针组成;结点的度:即结点拥有的子树的个数;叶结点:度为0的结点;树的度:树种所有结点的度的最大值;结点的层次:根节点的层次为0,然后依次加1;树的深度:树中所有结点的层次的最大值;森林:m(m>=0)棵树的集合称为

2017-04-22 14:25:28 415

原创 递归算法(补)

Java数据结构中有一章来讲递归算法~作为补充。算法存在自调用的情况一般有两种(1)问题的定义是递推的,比如阶乘。(2)问题的解法存在自调用,比如折半查找。递归算法用把问题分解为形式更加简单的子问题的方法来求解问题,它既是一种有效的分析问题的方法,也是一种有效的算法设计方法。适宜用递归算法求解的问题的充分必要条件是(1)问题具有某种可借用的类同自身的子问题描述的性质。(2)某一有限步的子问

2017-04-18 10:04:43 500

原创 特殊矩阵——稀疏矩阵

对于一个m×n的矩阵,设s为矩阵的元素总个数s=m×n,设t为矩阵中非零元素的个数,满足t稀疏矩阵的零元素非常多,且分布无规律,所以稀疏矩阵的压缩存储方法为:只存储矩阵中的非零元素,按照三元组的形式存储。三元组由非零元素,该元素行下标和该元素列下标三个数据构成,放在一个列数为3的数组中。存储结构又分数组结构和链表结构两个大类,其中链表结构又有一般链表、行指针数组链表和行指针的十字链表存储结

2017-04-15 16:26:17 1668

原创 特殊矩阵——n阶对称矩阵

特殊矩阵指:矩阵中有许多值相同的元素(包括0),且这些元素的分布有一定规律。当矩阵的维数比较大时,矩阵占据的内存单元相当多,这时,利用特殊矩阵数据元素的分布规律压缩矩阵的存储空间,对许多应用问题来说有重要是意义。特殊矩阵压缩存储的方法有两种:(1)只存储相同矩阵元素的一个副本;(2)采用不等长的二维数组。方法(1),比如对于n阶对称矩阵,行数和列数都为n,元素以主对角线为中线对称,aij=

2017-04-15 15:33:12 11920

原创 矩阵

矩阵用二维数组来处理最为方便,书上还是采用基于向量类设计矩阵,把一维数组作为对象存放到向量类中,拼接为二维数组。矩阵类:(只实现矩阵加)package ArrayVectorSetMatrix;/*** @author sun* 创建时间:2017年4月13日下午5:10:39*/public class Matrix { private MyVector values;//矩

2017-04-15 11:04:45 232

原创 数据结构——集合

集合是具有某种相似特性的事物的全体。它的重要特点是其中的数据元素无序且不重复,这也就是判断是否使用该容器的依据。集合类既可以基于向量类来实现,也可以用其他方法比如基于哈希表来实现,本文讨论基于向量类。首先我们要在上文建立的向量类中添加四个函数,以方便集合类的设计。四个函数如下:public int indexOf(Object element){ if(element == nul

2017-04-13 16:32:47 315

原创 数组和向量类

数组是n个相同数据类型的数据元素构成的占用一块地址连续的内存单元的有限集合,所以线性结构(包括线性表、堆栈、队列、串、数组和矩阵)的顺序存储结构实际就是使用数组来存储。所以,不像线性表等结构要特意的学习,感觉数组是我们接触程序语言开始就拿来即用的东西。数组的实现机制(内存映像公式):Loc(ai)是ai的内存单元,每个元素的字节数为k。(1)一位数组中Loc(ai) = Loc(a0)+i*k

2017-04-07 14:50:41 1199

原创 串的模式匹配算法

模式匹配是在主串(也称目标串)中,从给定的起始位start开始查找是否存在我们需要的子串(也称模式串),如果查找成功返回模式串的第一个字符在主串中的位置,当模式匹配失败,返回-1。常用的模式匹配算法有Brute_Force算法和KMP算法。Brute_Force算法,从force就可以看出是一种蛮力解决的方法。其模式匹配思想是:(1)将模式串的第一个字符与主串的第一个字符对齐放置,比较第一个字

2017-04-06 19:37:39 1218

原创 串——自定义MyStringBuffer类

上一篇自定义了MyString类,在字符串操作时不会改变原串的值。本文的MyStringBuffer类作为缓冲串类,在字符串操作时可以改变原串的值,所以必须采用可变长的数组存储结构,比如在字符串连接时数组要先加长自己的空间再将字符串拼接到一起。MyStringBuffer类设计如下:(只写了部分方法)package String;/*** @author sun* 创建时间:20

2017-04-05 16:35:41 870 1

原创 串——自定义MyString类

串是一种线性结构,一种特殊的线性表,串的数据元素以及元素间的逻辑关系和线性表完全相同,其差别是:(1)线性表的数据元素可以是任意数据类型,而串的数据元素类型只允许是字符类型;(2)线性表一次操作一个数据元素,而串一次操作若干个数据元素即一个子串。我们把串记作形如s="abcd",其中s称为串名,双引号括起来的字符序列称为串的值,个数称串长度。若两个串相等,则(1)长度相等;(2)各个对应位置字

2017-04-05 15:50:52 964

原创 优先级队列学习及应用

在有些软件系统中,有时要求把进入队列中的数据元素分优先级,这样出队列时就不是把队头数据输出了,而是选择队列中优先级最高的数据元素出队列,当两个数据元素优先级相同时,仍然按照先进先出原则出队列。只讨论顺序优先级队列,它与顺序循环队列的区别:(1)出队列方式,上段已经陈述。具体操作是先遍历队列找出优先级最高的取出,并把其后的所有元素依次向队头移位。因为存在移位,所以避免了假溢出问题,那么顺序优先级

2017-04-04 15:28:50 296

原创 队列应用——回文串判断

队列应用的广泛:操作系统中的各种数据缓冲区的先进先出管理;应用系统中的各种服务请求的排队管理等等。回文串判断可以利用堆栈和队列的配合来解决,具体描述在代码注释中。看代码:(相关类在前文中有定义)package StackAndQueue;/*** @author sun* 创建时间:2017年4月3日下午8:27:42*//*回文串是指一个字符序列以中间字符为基准两边字符完全

2017-04-03 21:31:44 1210

原创 队列学习

队列也是一种线性表,具有两种数据存储结构,队列中只允许在队尾插入和在队头删除,是先进先出表。和堆栈一样我们先定义队列中基本的功能并提供接口:package StackAndQueue;/*** @author sun* 创建时间:2017年4月3日上午10:44:29*//* * 封装队列的常用操作,提供接口: * 入队列append(obj):把数据元素obj插入队尾 *

2017-04-03 21:08:08 336

原创 堆栈应用——表达式计算

简述:表达式在我们人类的眼里很直观简单,但想让机器理解并进行计算就是问题了,书里介绍了堆栈来变换表达式形式让机器理解的方法— —中缀表达式变换为后缀表达式,再翻译后缀表达式进行计算。但代码实现竟然只有后缀表达式到计算的这一部分,真是fuck,我又搞了好久才实现中缀变换后缀。在机器内部,任何表达式都是由操作数、运算符和分解符(括号等)组成。本文只讨论简单的算术表达式,即只有数字和加减乘除括号。我

2017-04-02 17:18:04 3132

原创 递归之整数划分问题和排列问题

整数划分问题:将正整数n表示成一系列正整数之和;将最大加数n1不大于m的划分个数记作q(n,m) 递归式如下:q(n,m) = 1     n=1,m=1 = q(n,n) n = 1+q(n,n-1) n=m   = q(n,m-1)+q(n-m,m)   n>m>1  举例: 6 5+1; 4+2;4+1+1; 3+3;3+2+1;3+1+1+1

2017-03-31 14:59:45 688

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除