算法与数据结构
文章平均质量分 88
WilsonSong1024
这个作者很懒,什么都没留下…
展开
-
动态规划--最大子序列问题
给定一长度为N的整数序列(a1,a2,…,aN),将其划分成多个子序列(此问题中子序列是连续的一段整数),满足每个子序列中整数的和不大于一个数B,设计一种划分方法,最小化所有子序列中最大值的和。说明其具有优化子结构及子问题重叠性质 例如: 序列长度为8的整数序列(2,2,2,8,1,8,2,1),B=17,可将其划分成三个子序列(2,2,2),(8,1,8)以及(2,...原创 2018-03-07 20:10:55 · 6856 阅读 · 0 评论 -
红黑树思想详解及实现
红黑树思想详解及实现从2-3树开始2-3树定义2-3树在《算法4》这本树中的定义是这样子的:一棵2-3查找树或为一棵空树,或由以下节点组成:2-节点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该节点,右链接指向的2-3树中的节点值都大于该节点。3-节点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该节点,中连...原创 2018-09-02 20:07:27 · 1373 阅读 · 1 评论 -
AVL树的思想及实现
AVL树的思想及实现定义AVL树是高度平衡的二叉搜索树,按照二叉搜索树(Binary Search Tree)的性质,AVL首先要满足:若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。AVL树的性质:左子树和右子树的高度之差的绝对值不超过1树中的每个...原创 2018-09-02 20:06:55 · 896 阅读 · 0 评论 -
线段树(segment tree)详解
segment tree(线段树)详解什么是线段树线段树是一棵平衡搜索树,但是不是完全二叉树,其实也是一棵二分搜索树,它储存的是一个区间的信息。每个节点以结构体的方式存储,结构体包含以下几个信息:区间左端点、右端点;(这两者必有)区间内要维护的信息(实际情况而定,数目不等)。一个具体的线段树如下所示,这里是一数组作为底层数据结构来阐述线段树,所以就简单的将线段树看为满二...原创 2018-09-02 20:06:16 · 2443 阅读 · 0 评论 -
并查集详解及底层实现
并查集详解及底层实现定义并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集(Union/Find)从名字可以看出,主要涉及两种基本操作:合并和查找。这说明,初始时并查集中的元素是不相交的,经过一系列的基本操作(Union),最终合并成一个大的集合。...原创 2018-09-02 20:05:43 · 906 阅读 · 0 评论 -
二分搜索树设计思想及实现
二分搜索树定义二分搜索树(Binary Search Tree),也称二叉查找树,有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no duplicate nodes)...原创 2018-09-02 20:05:12 · 2242 阅读 · 0 评论 -
堆树详解及使用最大堆实现优先队列
堆树详解及使用最大堆实现优先队列定义堆树的定义如下:堆树是一颗完全二叉树;堆树中某个节点的值总是不大于或不小于其孩子节点的值;堆树中每个节点的子树都是堆树。当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。构造二叉堆这里是一自定义的动态数组作为底层来实现最大堆这种数据结构,使用数组存...原创 2018-09-02 20:03:43 · 1391 阅读 · 0 评论 -
Map及其底层简单实现
Map数据结构及其底层简单实现其实Java中的map就是映射,叫字典也可以,其实map也是一种容器,在这里为了深入的去理解map这种数据结构,从底层自己简单的实现 一下。使用链表作为底层基础来实现Map其实链表这种数据结构我们知道其一般只包含next和value两个属性,但是其实你也可以多给他添加一个key的属性。这样的话就和我们的map这种数据结构很像了,具体的实现如下:...原创 2018-09-02 20:02:49 · 2163 阅读 · 0 评论 -
判断一个数是否是回文数
自己写了一种笨方法,就是先把数放在ArrayList中,然后一位一位的比较然后看了一下别人的方法,对比下,吸取经验package TestDemo;import java.util.*;public class Test2 { public static void main(String[] args){ Scanner in = new Scanner(System.in); in...原创 2018-03-28 19:44:42 · 447 阅读 · 0 评论 -
有符号整数翻转问题----注意溢出的问题
一个整数翻转问题需要注意溢出的地方描述:其实就是将一个有符号的32位整数进行翻转,例如:123-->321, 120-->21,-123-->-321这种,其实思路很简单,就是用模运算一步一步的将每一位取出,不断的乘10,直至模运算取出的数是0package TestDemo;import java.util.*;public class Test1 { public s...原创 2018-03-28 18:36:06 · 4199 阅读 · 0 评论 -
动态规划--三角数塔问题
1、 三角数塔问题设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示: 要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。解题思路:设状态为 f (i; j ),表示从从位置 (i; j ) 出发,路径的最大和,则状态转移方程为f(i,j)=max{f(i+1,j),f(i+1,j+1)}+(i,j)#include <ios...原创 2018-03-06 15:21:44 · 2958 阅读 · 0 评论 -
贪心算法解决最少圆覆盖最多点问题
贪心算法解决最少圆覆盖最多点问题 海面上有一些船需要与陆地进行通信,需要在海岸线上布置一些基站。现将问题抽象为,在x轴上方,给出N条船的坐标 ,在x轴上安放的基站可以覆盖半径为d的区域内的所有点,问在x轴上至少要安放几个点才可以将x轴上方的点都覆盖起来。试设计一个算法求解该问题,并分析算法的正确性。解: 设计思路:首先...原创 2018-03-05 18:51:40 · 15849 阅读 · 11 评论 -
动态规划之背包问题原理详细推导及其实现
贪心算法:(1) 给定n个物品,物品价值分别为P1,P2,…,Pn,物品重量分别W1,W2, …, Wn,背包容量为M。每种物品可部分装入到背包中。输出X1,X2,…,Xn,0<Xi<1, 使得 最大,且 <M。试设计一个算法求解该问题,分析算法的正确性.解: 设计思路:首先将n个物品按单位价值从大到小排序,每...原创 2018-03-05 18:46:41 · 4264 阅读 · 0 评论 -
不使用 + 运算符实现求两个整数a和b的和
给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。首先肯定要想到用位运算来操作,即用二进制来处理,好,既然想到这里,当然要举个例子来想想,最简单的1+21的二进制 ····00012的二进制 ····00103的二进制 ····0011那a+b不就等于a|b吗?那么,再来验证下1+31的二进制 ····00013的二进制 ····00114的二进制 ····0100发现之前的猜想错...原创 2018-03-05 17:03:32 · 3134 阅读 · 1 评论 -
计算出n阶乘中尾部零的个数
设计一个算法,计算出n阶乘中尾部零的个数考虑到只要有5,或者因子为5的数,就可以产生0的尾部。假如1*2*3*4*...*250,那么250/5=50可以知道,有50个为5的倍数,但是里面有多少个为25的倍数,125的倍数...,50/5=10,可知25的倍数有10个,10/5=2,可知125的倍数有两个,以此类推,代码如下:public class Solution { /* * ...原创 2018-03-05 17:01:54 · 347 阅读 · 0 评论 -
动态规划--找一串数字的最大算式
(1)给出N个1-9的数字 (v1,v2,…,vN),不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。并说明其具有优化子结构性质及子问题重叠性质。例如: N=5,K=2,5个数字分别为1、2、3、4、5,可以加成: 1*2*(3+4+5)=24 1*(2+...原创 2018-03-07 20:21:34 · 3155 阅读 · 0 评论 -
哈希表设计思想及实现
哈希表设计思想及实现定义哈希表在《算法4》这本书中是这么介绍的:哈希表其实又叫散列表,是算法在时间和空间上做出权衡的经典例子。如果一个表所有的键都是小整数,我们就可以用一个数组来实现无序的符号表,将键作为数组的索引而数组中i出存储的值就是它对应的值。其实散列表的思想也是这样的,只不过他的键的类型更加复杂,是这种简易方法的一种扩展。使用散列查找分为两步:用散列函数将被查找的键转...原创 2018-09-02 20:07:53 · 6150 阅读 · 0 评论