Data Structure_JAVA
chenlly99
专注LBS轨迹大数据挖掘,数据仓库建模,基于Hadoop集群的超大规模分布式计算。
展开
-
最优解-背包问题
由dp[i-1][j-weight[i]]推出,dp[i-1][j-weight[i]] 为背包容量为j-weight[i]的时候不放物品i的最大价值,那么dp[i-1][j-weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。:由dp[i-1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。最终,在dp[i][j]最后一个单元格里(即最后一行最后一列所在位置)就存放着该背包所能装下的最大价值。原创 2024-01-19 19:13:31 · 564 阅读 · 0 评论 -
最优解-最长公共子序列
最长公共子序列(Longest Common Subsequence,LCS)即求两个序列最长的公共子序列(可以不连续)。比如3 2 1 4 5和1 2 3 4 5两个序列,最长公共子序列为2 4 5 长度为3。从右下角开始,如果有dp[i][j]==dp[i-1][j-1]+1则往左上走一格。=b[j], 则 L[i][j]=max (L[i][j-1],L[i-1][j])若a[i]=b[j], 则 L[i][j]=L[i-1][j-1] +1。即:相同的取左上加1,不同取上和左中的最大值。原创 2024-01-19 15:24:19 · 441 阅读 · 0 评论 -
最优解-最长递增子序列
找到比3小的数字对应的dp[i]最大值(也就是最长),然后+1,就是dp[5]的值。动态规划的核心:array[i+1] = k,既然是递增子序列,我们只要找到前面那些结尾比k小的子序列,然后把 k 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。定义数组dp,dp[i] 表示以 array[i] 这个数结尾的最长递增子序列的长度。在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。比如数组:1,4,3,4,2。原创 2024-01-16 17:32:29 · 561 阅读 · 0 评论 -
分治法-最大值和最小值
最适合在大数据中,通过这种方法求最大和最小值可以大大减少比较次数,比如一种直接的算法是扫描一遍A序列,用两个标志位max和min分别表示最大值和最小值元素此种方法的元素比较次数是2n-2,但是利用分治策略就可以将元素比较次数减少到(3n)/2-2。3、将所有子数组或子列表的最大值和最小值进行比较,得到整个数组或列表的最大值和最小值。1、将一个数组拆分成左右两个数组,直到分解为不可分的一个数组元素。2、分别找出每个子数组或子列表的最大值和最小值。求最大值和最小值得基本思路和归并排序很相似。原创 2024-01-16 11:13:03 · 1379 阅读 · 0 评论 -
分治法-快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。3、将right指向的数据和key作比较,大于则指针移动,继续比较,小于则将和left指针指向的值进行替换。4、将left指向的数据和key作比较,小于则指针移动,继续比较,大于则将和right指针指向的值进行替换。2、设两个指针left和right,其中left指向数列的左端,right指向数列的右端。原创 2024-01-12 19:21:44 · 532 阅读 · 0 评论 -
分治法-归并排序
基本思路:将待排序元素分成大小大致相同的两个相同子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成要求的排好序的集合。原创 2024-01-12 11:15:10 · 345 阅读 · 0 评论 -
分治法-汉诺塔问题
汉诺塔问题实质是把移动n个盘子的问题转化为移动n-1个盘,依据该原理,层层递推,即可将原问题转化为解决移动n -2、n -3…3、2,直到移动1个盘的操作,而移动一个盘的操作是可以直接完成的。至此任务真正完成了。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。将上面的n-1个盘子从A柱子移动到B柱子(借助C柱子)当只有一个盘子时,直接将盘子从A柱子移动到C柱子即可。将B柱子上的n-1个盘子移动到C柱子(借助A柱子)将最底下的一个盘子从A柱子移动到C柱子;原创 2023-12-20 15:21:18 · 79 阅读 · 0 评论 -
分治法-斐波那契数列
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。原创 2023-12-20 10:35:26 · 230 阅读 · 0 评论 -
分治法-二分查找
二分查找(binary search algorithm)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找。将一个难以直接解决的问题分割成规模小的问题,然后分而治之。Array[N]数组存储N个数,这N个数从小到大排序,一个数,即如果找到该数,则输出位置,否则输出-1。N,表示有N个元素,M,表示要查找的数。原创 2023-12-19 19:05:22 · 96 阅读 · 0 评论 -
5大算法策略
五大算法策略,分治发,动态规划,贪心算法,回溯法,分支限界法原创 2023-12-19 17:28:58 · 395 阅读 · 0 评论 -
排序-基本排序算法
import java.io.InputStreamReader;import java.io.BufferedReader;/*** Class SortDemo* Description 简单排序有insertSort,BubbleSort,SelectSort,ObjectSort* 复杂排序 shellSort,quickSort,base原创 2009-02-18 18:06:00 · 522 阅读 · 0 评论 -
递归-求第N项的值
import java.io.InputStreamReader;import java.io.BufferedReader;/*** Class RecDemo* Description 用递归求数列:1,3,6,10,15,21.... 求第N项的值* 基本思路第N项减掉第N-1项是一个等差数列,差值为1,f(n)=n+f(n-1)和阶乘的区别是f(n)=n*f(n原创 2009-02-18 18:07:00 · 1339 阅读 · 0 评论 -
链表-基本算法(增、删)
import java.io.InputStreamReader;import java.io.BufferedReader;/** Class LinkDemo Description 链表的基本操作,某个位置插入一个新的节点,查看和删除指定节点, Conpany opendata Author Chenlly Version 1.0 Date 09-02-原创 2009-03-04 15:01:00 · 762 阅读 · 0 评论 -
链表-有序链表操作
import java.io.IOException;import java.io.InputStreamReader;import java.io.BufferedReader;/** * Class SortedLink Description 有序链表,首先的搜索链表,直到找到合适的位置,它恰好在第一个比它大的数据项的前面, * 主要是插入是必须使整个链表有序。 Comp原创 2009-03-06 10:33:00 · 649 阅读 · 0 评论 -
链表-双向链表
import java.io.BufferedReader;import java.io.InputStreamReader;/** * Class DoubleLink * Description 双向链表提供了向前遍历和向后遍历的途径。而普通链表只能向后遍历. * Company OpenData * Author Chenlly * Date 09-02-0原创 2009-03-09 23:00:00 · 629 阅读 · 0 评论 -
树-AVL树
AVL 树平衡树最关心的是防止树失衡,如果一个新的元素危机到树的平衡,可以马上纠正。可以有局部重构树(AVL方法) 或者重建整个树(DSW)方法。AVL树是自平衡二叉查找树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。平衡因子bf():右子树的高度-左子树的高度AVL 的平衡因子可以是 0,1,原创 2011-10-19 11:49:26 · 785 阅读 · 0 评论 -
堆-实现优先级队列算法
优先级队列,数值越小,优先级越高。优先级越高的最新被删除,区别于普通的队列先进先出。算法如下:定义结点:class Node { private int iData; public Node(int iData) { this.iData = iData; } public int getIData() { return iData; }原创 2011-10-19 18:26:35 · 1042 阅读 · 0 评论 -
堆-表达式树
创造一个表达式树(expression tree) 来规定操作的执行顺序,比如2-3*4+5 等价2-(3*4)+5。eg:自左向右扫描前缀表达式时。自底向上的创建运算树这一步最关键的是操作的优先顺序于被扫描表达式中的优先顺序保持一致。原创 2011-10-19 18:30:16 · 604 阅读 · 0 评论 -
树-二叉排序树的基本算法
(1)、二叉树(Binary Tree):二叉树的每个结点至多只有二棵子树(不存在度大于2的结点)。满足如下特质:二叉树的第i层至多有2的(k-1)次方个结点;深度为k的二叉树至多有(2的k次方)-1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则。n0 = n2+1(2)、满二叉树(Full Tree):一棵深度为k,且有(2的k次方)-1个节点成为满原创 2009-04-23 17:08:00 · 1112 阅读 · 0 评论 -
数据结构基础
第一章 概述(1)什么是数据结构和算法 数据结构是对内存或者是磁盘上数据的一种安排,算法是对这些数据进行处理。(2)数据结构的应用 1.现实世界数据存储。如档案,航班信息 2.程序员工具。使用堆,栈来优化一些操作 3.建模。图可以模拟城市之间的航线(3)数据结构的特性 1.数组 适合随机存取(根据公式),如果有序,折半查找快。插入,删除效率低,大原创 2009-02-18 17:39:00 · 996 阅读 · 0 评论 -
图论-带权图的最小生成树(Kruskal)算法
Kruskal算法是从边开始着手。寻找最小的边,但必须不能形成回路(环)。当选择的边达到N-1条边的时候,程序结束。原创 2011-11-19 11:24:53 · 2218 阅读 · 0 评论 -
堆栈-通配字符串
import java.io.InputStreamReader;import java.io.BufferedReader;/** Class BracketChecker Description 堆栈实例(二)--通配字符串 分隔符匹配程序每次从字符串中读取一个字符,若发现他是左分隔符,将它压入栈,当从 输入中读到一个右分原创 2009-02-18 18:00:00 · 698 阅读 · 0 评论 -
队列-基本算法
import java.io.InputStreamReader;import java.io.BufferedReader;/*** Class CycQueueDemo* Description 循环队列的基本算法* Company opendata* Author Chenlly* Date:08-12-06* Version 1.0*/publ原创 2009-02-18 18:00:00 · 788 阅读 · 0 评论 -
图论-带权图的最小生成树(Prim)算法
算法设计:Prim算法从顶点开始着手。从一个顶点开始,然后放入到树的集合中,然后重复做如下事情: (1)、找最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中,把这些放入优先级队列。 (2)、找到权值最小的边把它和它所到达的顶点放入树的集合中。重复上述操作直到所有的顶点都在树中,程序结束。Graph_mstw.javapackage com.ma原创 2011-11-19 11:21:25 · 6391 阅读 · 0 评论 -
多分树-B+树
B+树是B-树的变体,也是一种多路搜索树: 1.其定义基本与B-树同,除了: 2.非叶子结点的子树指针与关键字个数相同; 3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间); 5.为所有叶子结点增加一个链指针; 6.所有关键字都在叶子结点出现;B+树的内部节点原创 2011-11-05 11:44:22 · 1131 阅读 · 0 评论 -
多路树-B*树
B* 树,除根节点以外,所有节点至少是三分之二是满的,。B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针; 所以,B*树分配新原创 2011-11-05 12:28:22 · 1092 阅读 · 0 评论 -
多分树-B-树
在B-定义:每个节点有m个子女和m-1个键。每个节点的键值是按从小到大排序前i个子女的键比第i个键小后m-1个子女的键比第i个键大m路查找方法:首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi所指的结点继续查找,原创 2011-11-05 10:52:51 · 1192 阅读 · 0 评论 -
图论-基本概念及算法介绍
(1)、图的定义:图由V(G) 和E(G) 组成,记为G=(V,E)(2)、图的分类连通图 任意两个顶点都相互可以到达的无向图强连通图 任意两个顶点间都是互相可以到达的有向图非连通图 至少两个顶点间是相互不可到达的图完全图 图中n 个顶点与其它n-1个顶点之间都有边 (3)、图的两种存储结构 (a)、邻接表 (b)、邻接矩阵 邻接矩阵(A原创 2011-11-13 11:06:16 · 1109 阅读 · 0 评论 -
图论-有向图的拓扑排序
(1)、有向图,边是有方向的。邻接矩阵表示方法上下三角形是不对称的。在添加一条边是只需要一条语句, //添加一个边 public void addEdge(int start,int end){ adjMat[start][end] = 1; }(2)、有向图的算法-拓扑排序有向图的应用,某些项目或者事件必须按照特定的顺序排序或发生。原创 2011-11-17 14:58:36 · 12991 阅读 · 0 评论 -
图论-邻接矩阵定义及深度和广度遍历
深度优先遍历步骤:(1),访问一个邻接的未访问顶点,标记它,并且把它放入栈中。(2),当不能执行规则1时,如果栈不为空,从栈中弹出一个顶点,重复执行规则1。(3),如果规则1和规则2都不能执行时整个搜索结束。广度优先遍历步骤:(1)、访问一个未来访问的邻接点(如果存在),这个邻接点必须是当前顶点的邻接点,标记它,并且把它插入到队列中。(2)、如果不能执行规则1,那么原创 2011-11-16 11:42:28 · 1827 阅读 · 0 评论 -
图论-最小生成树(MST)算法
最小生成树:E = V - 1无权图的最小生成树不必关心边的长度,而是要找到最少数量的边。最小生成树于搜索算法几乎是相同的,同样可以给予深度优先搜索和广度优先搜索。DFS算法访问所有的顶点,但只访问一次,绝不会两次访问同一个顶点。当看到某条边将要到达一个已访问的顶点,它就不会走这条边。因此DFS算法走过整个图的路径必定是最小生成树。对dfs算法的改进,只是在else 里面输原创 2011-11-16 15:05:08 · 5402 阅读 · 0 评论 -
图论-有向带权图的最短路径(Dijkstra)算法
寻找两个顶点之间的最短路径规则,总是派遣一个代理人到下一个城市,代理人的工作是记录源点到其它城市费用最小信息。计算费用,构造一个数组,保持从源点到其他顶点的最短距离。在算法执行的过程中这个距离是变化的。直到最后,它存储了从源点开始的真正最短距离。package com.mapbar.structure;/** * Class Graph_Dijkstr原创 2011-11-19 11:56:51 · 3846 阅读 · 0 评论 -
堆-大堆算法
堆是特殊的二叉树,有如下特质:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。堆一般使用数组来存储.用数组存储堆的优点:父子关系简单清晰:存放A[i]的是节点i的元素。原创 2009-04-08 13:33:00 · 1800 阅读 · 0 评论 -
哈希表-开发地址法
import java.io.InputStreamReader;import java.io.BufferedReader;/** * @Class HashTableApp * @Description 哈希表,开放地址法的线性探索算法 * @Company OpenData * @author Chenlly * @Date 2009-03-20 * @ver原创 2009-03-23 18:31:00 · 1056 阅读 · 0 评论 -
堆栈-单词逆序
import java.io.InputStreamReader;import java.io.BufferedReader;/** Class Reverse Descripton 堆栈实例-单词逆序 Company opendate Author Chenlly Date 09-2-18 Vesion 1.0 */class StackX{ pr原创 2009-02-18 17:58:00 · 762 阅读 · 0 评论 -
堆栈-基本算法
import java.io.InputStreamReader;import java.io.BufferedReader;/*** Class StackDemo* Description 堆栈的基本算法* Author Chenlly* Date 08-12-06* Version 1.0*/public class StackDemo{ pr原创 2009-02-18 17:53:00 · 871 阅读 · 0 评论 -
数组-合并数组
import java.util.Arrays;/*** Class ArrayUnion* Description 将两个源数组合并成一个目的有序数组。注意一个数组数据项目取完而另一个数组还有数据项的情况* Company opendata* Author Chenlly* Date 08-11-26* Version 1.0* 注意:首先的对两个素组排序。*原创 2009-02-18 17:42:00 · 634 阅读 · 0 评论 -
数组-删除重复数据
/***Class ArrayDelDouble*Description 删除数组中重复的数据,不考虑顺序*Author Chenlly*Company opendata*Date 08-12-05*Vesion 1.0 *思路:把每个数据项和其它的进行比较,如果重复以-1000填充。然后把所有的null都删除,最后缩短数组长度*/public cl原创 2009-02-18 17:47:00 · 637 阅读 · 0 评论 -
数组-二分查找
import java.io.InputStreamReader;import java.io.BufferedReader;import java.io.IOException;import java.util.Arrays;/*** Class BinarySearch* Description find()二分查找,delete() insert(),先通过二分查找原创 2009-02-18 17:50:00 · 601 阅读 · 0 评论 -
堆栈-解析算术表达式
import java.util.Stack;/** * * Class PosfixParser.java * * Description 利用堆栈原理,解析算术表达式求值。 * * Company mapbar * * author Chenll E-mail: * * Version 1.0 * * Date 2012-9-原创 2012-09-28 11:05:14 · 927 阅读 · 0 评论