数据结构(java实现)
文章平均质量分 83
名字到底多长
算法题来自大神的博客:http://blog.csdn.net/v_JULY_v?viewmode=contents
展开
-
图5----某顶点到图中其余各顶点的最小路径算法
1 吐槽:dijkstra算法音译成迪杰斯特拉。。。。。。2算法:某点与其他顶点的最小距离路径要么是与该顶点直接相连,要么经过已经生成的部分最小路径,然后与这个顶点相连。直接相连的路径通过初始化权重数组完成,找到最小的边。用这个路径是去更新权重数组。再次找权重数组中未被选中的最小边,再次更新。。直到所有顶点都加入最小路径图中为止。实际算法代码其实prim算法类似(原理不原创 2012-09-26 22:48:35 · 1153 阅读 · 0 评论 -
图2----拓扑排序
拓扑排序,也就是AOV(activity on vertex),顶点的活动有先后执行顺序,用于有向无环图。基本思路是 1 找到无入度的点,然后去掉这个点和这个点的出度边。2 循环执行1直到再也找不到点3 如果点的个数等于顶点数则生成一个拓扑序列,如果小的话就是有环。邻接矩阵实现方法:用列下标循环,如果列没有访问过,则进入行下标循环,如果该列都为0,则表示该列表示原创 2012-09-23 21:40:49 · 439 阅读 · 0 评论 -
图1---------------图的表示和遍历算法
图的表示方法:邻接矩阵法(太浪费空间,但确实把所有信息都表示了出来,计算度或者各种操作的话很方便,当然用无向图的对称性、只存放非0结点可以优化)邻接表(算比较好的一种方法,但是对于有向图计算入度必须遍历,用逆邻接表、十字链表优化)十字链表(和邻接表太类似)遍历算法:图是标准的多对多结构,因此不构成环并且不重复访问vertex需要一个标志数组visited,循环这原创 2012-09-23 21:40:03 · 1045 阅读 · 0 评论 -
Queue实现
链表实现,插入节点放最后就行了。代码:[java] view plaincopypackage nuaa.ds; import java.util.NoSuchElementException; public class LinkedQueue { private Node head; private Node tail;原创 2012-09-23 21:37:08 · 375 阅读 · 0 评论 -
各种排序算法(4)
[java] view plaincopypackage nuaa.ds; public class Sort{ //插入排序 public void insertionSort(T[] t,Comparator c){ for(int i=1;i//确定有序序列 T temp = t[i];//空出位置原创 2012-09-23 21:35:43 · 568 阅读 · 0 评论 -
各种排序算法(1)
1 冒泡排序 冒泡排序的0(N2)的复杂度中,外层的循环表示有n个数要排,内层从0开始到n-1才是左右交换的实现,造个名字:相邻比较互换法。 代码如下:[java] view plaincopy [java] view plaincopy"font-size:14px;"原创 2012-09-23 21:33:07 · 304 阅读 · 0 评论 -
图3--拓扑排序变体求重要路径
基本思路:最早发生时间是越早越好,但由于前面路径的消耗不得不晚,早了前面就还没有完成最晚发生时间是越晚越好,但由于后面路径的消耗不得不早,晚了后面的路径消耗来不及完成。初始化最早发生时间数组为0,找到排序的下一顶点,用该顶点去更新最早发生时间并入栈,方法是用自身的最早发生时间+路径代价,如果大于连接的下一顶点的最早发生时间就更新一下下一顶点的最早发生时间。一直做到最后一个顶点,最后原创 2012-09-23 21:41:26 · 415 阅读 · 0 评论 -
二叉树
1 递归写法:前序、中序、后序、90度旋转格式化打印二叉树用来熟悉递归算法与二叉树是怎么一回事,求叶子节点、求层数用来熟悉递归时候值传递(传递的值直接应用),值传递稍微有点不同的是用数组加空引用(比如String[] a = {"A","B","D",null,null,"E","G",null,null,null,"C","F"};)生成前序二叉树。2 BST:排序二叉树,左最小根其次右最大原创 2012-09-23 21:38:21 · 657 阅读 · 0 评论 -
各种排序算法(3)
7 堆排序将数组根据下标看成二叉树,写代码的过程中二叉树节点从1开始,数组节点从0开始,然后就被反复的切换搞死了。。。 其实用二叉树节点从0开始标记,根为i时,左子树为2i+1,右子树为2i+2,从子树寻找根时,(i-1)/2也能找到,这样就不用2套下标了。。。思路是首先生成大堆(根大于左子树和右子树),方法是一个循环A从最后一个根也就是下标为n/2的节点开始到第一个根(下标为0),分别与原创 2012-09-23 21:34:46 · 327 阅读 · 0 评论 -
各种排序算法(2)
5归并排序思路就是无限递归对半分一直到1,1可以看成排序好的(也无所谓排序),然后回退到上层时候排序好的左半部分和右半部分依次比大小拷贝到新申请的数组中,然后再用对应的的下标拷贝回原来的位置,复杂度为o(nlogn)。缺点就是空间复杂度为o(n),所以相比快速排序弱爆了。但在外部文件排序中貌似有应用。代码如下:[java] view plaincopy"font原创 2012-09-23 21:33:56 · 354 阅读 · 0 评论 -
Stack实现
链表式:插入头部构造链表代码如下:[java] view plaincopypackage nuaa.ds; import java.util.NoSuchElementException; //插入头部的链表实现Stack public class LinkedStack { private Node top; priva原创 2012-09-23 21:36:27 · 312 阅读 · 0 评论 -
图4---无向图得到最小生成树
prim算法,加点不构成回路其实就是n个顶点寻找n-1条边,设集合为A,初始为空,每次加入一个顶点,并保证加入的顶点与集合A中的某个顶点的路径长度是集合A中的点与不在集合中的顶点构成的所有路径中是最小的。构造2数组:权重数组B和边的另一节点保存数组C,下标都表示节点,长度都为节点个数。权重数组保存对应下标顶点的权重。另一数组保存边的另一个顶点初始化:任取一个顶点加入原创 2012-09-24 18:39:18 · 839 阅读 · 0 评论