自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

earayu的博客

记录数据结构与算法学习过程

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

原创 分治算法: 归并排序(详解)

分治算法:分治算法和冒泡排序一样有着好听的名字。工作方案如下: 1. 将一个问题划分为同一类型的若干子问题,子问题最好规模相同。 2. 对这些子问题求解(一般用递归) 3. 有必要的话,合并这些子问题,得到原始问题的答案。归并排序:根据分治思想,我们可以实现归并排序:要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。这个算法的基本操作是合并两个已排序的表,因为这两个表

2015-10-27 12:07:04 2468

原创 减治算法: 插入排序和希尔排序(详解)

减治法:减治(decrease-and-conquer)法利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系解决问题。我们既可以自顶向下(导致递归),也可以自底向上(导致迭代)地运用该关系解决问题。插入排序:想象一下整理扑克牌的情景,我们将每一张牌插入到其他已经有序的牌中的适当位置。在数组中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位,这种算法叫做插入排序

2015-10-26 22:15:58 1311

原创 蛮力算法: 选择排序 冒泡排序(详解)

蛮力法:蛮力法(brute force)是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。 虽然巧妙而高效的算法很少来自于蛮力法,但它还是具有重要地位。因为它能解决几乎任何问题,如果要解决的问题的规模不大,或者对性能没有很高的要求,那么花大工夫涉及复杂的算法显然是不值得的。 下面就来介绍一下2大蛮力排序算法,然后是它们的分析。框架介绍:在介绍算法之前,有必要介绍一些以后会

2015-10-26 20:39:07 2402

原创 算法:Dijkstra算法

算法概要: 解决(不含负权边的加权有向图的)单点最短路径问题。计算的结果是一棵最短路径树(SPT,最短路径树)。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。维基百科的描述: 这个算法是通过为每个顶点 v 保留目前为止所找到的从s到v的最短路径来工作的。初始时,原点 s 的路径长度值被赋为 0 (d[s] = 0),若存在能直接到达的边(s,m),则把d[m]设为w(s,m),同时把

2015-10-24 19:38:15 599

原创 算法: Prim算法的延时和即时实现

定义: 生成树:图的生成树是它的一棵含有其所有顶点的无环连同子图。 最小生成树:一幅加权图的最小生成树(MST)是它的一棵权值最小的生成树。切分定理:在一幅加权图中,给定任意的切分,它的横切边中的权值最小者必然属于图的最小生成树。 切分定理是解决最小生成树问题的基础,将它和贪心算法结合起来,可以不断重复直到找到最小生成树的所有边。Prim算法的延时实现:先把一个顶点加入最小生成树中。再把它

2015-10-22 21:20:52 1255

原创 数据结构:加权图的API

加权图是一种为每条边关联一个权值或者成本的图模型在之前的例子中,邻接表取得了很好的效果。要表示加权图,我们只需要扩展一下之前的代码即可。之前我们直接在邻接表中存放顶点信息,现在我们改为存放Edge对象。package MST;public class Edge implements Comparable<Edge>{ private final int v;//己方顶点 privat

2015-10-22 19:11:26 878

原创 算法: 有向无环图(DAG)的拓扑排序

定义: 拓扑排序是对有向无环图(DAG)的顶点的一种排序, 使得如果存在一条从v到w的路径,那么在排序中w就出现在v的后面。 如果图含有环,那么拓扑排序是不可能的。试想有3个正整数,a比b大,b比c大,c比a大,我们无法对abc排序。算法: 1. 一个简单的求拓扑排序的算法是先找出任意一个没有入边的顶点,然后将它和它的边从图中删除。然后对剩余部分使用同样的操作。 2. 另一种不那么直观,却更

2015-10-22 15:25:38 15378 1

原创 算法: 无向图的深度优先搜索(dfs)和广度优先搜索(bfs)

深度优先搜索(dfs)为了方便,假设处理的图都是简单图。 深度优先可以使用递归实现,对 树的前、中、后序遍历都可以看成是深度优先搜索。 使用深度优先搜索还可以轻松寻找从顶点v到顶点w的路径。(见代码中的pathTo()方法)package Graphs;import java.util.Stack;public class DFS { private Graph g;// unDirect

2015-10-21 23:06:39 4918

原创 数据结构: 无向图和有向图的API

图是由一组顶点(vertex)和一组能够将两个顶点相连的边(edge)组成的。 无向图的边没有方向,这意味着一条边两边的顶点是平等的。可以有多种方式表示无向图:邻接矩阵、边的数组、邻接表数组。邻接矩阵需要的空间为V^2,对于稀疏图(大部分情况下都是)太浪费了。 边的数组使用起来十分不方便,不能快速得到顶点v的邻接顶点。所以邻接表数组脱颖而出了,我使用MyArrayList数组来表示。每个数组元素

2015-10-21 00:17:08 2903

原创 数据结构: 二叉查找树(BST)

二叉查找树是一种很有意思的数据结构, 比根节点小的元素将被存储在左子树中,比根节点大的元素被存储在右子树中。这就保证了中序遍历该二叉查找树时必然是升序排序的。平均情况下: 二分查找的时间复杂度为O(logN) 二叉查找树 查找操作 花费的时间是二分查找的1.39倍但这些开销是值得的,因为二分查找的存储依靠有序数组。有序数组 插入操作 的时间复杂度为O(N),而二叉查找树的 插入操

2015-10-11 20:51:39 506

原创 数据结构: AVL树

平衡树出现的原因: 1. 二叉查找树(BST)在最坏的情况下会退化成链表。 2. 二叉查找树的remove操作(如果按上一篇文章中那样实现),可能会使得左子树比右子树深。因为每删除一个元素,它都会用该元素右子树中的最小元素替代。当然我们也可以通过随机选取右子树的最小元素或左子树的最大元素删除来保持平衡,但是没人证明过这点。AVL树是一种自平衡的二叉查找树,AVL树要求它的每个节点

2015-10-11 20:33:20 422

原创 数据结构: Java中LinkedList的简单实现

下面是LinkedList的简单实现。LinkedList的优点: 新项的插入和现有项的删除花费常数时间。 LinkedList的缺点: 很难索引现有项,对get操作的调用花费很多时间。MyLinkedList作为双向链表,get()方法可以从头结点或者尾节点开始。所以最坏的情况下需要遍历 【N/2】 个元素。代码中changedTimes和itChangedTimes的作用: 如果获取了一个迭代

2015-10-06 00:37:39 543

原创 数据结构: Java中ArrayList的简单实现

上学期的数据结构这门课学到了图。用C语言把书上介绍的内容都实现了一遍,但感觉学校教的都太基础了。这个学期准备先重温一下,然后再深入一点学习算法和数据结构。 语言使用Java, 目前买了3本书《Algorithms (4th edition)》、《数据结构预算法 Java语言描述》、《算法分析与设计基础》下面是我自己实现的简单版本的支持泛型的线性表。 ArrayList的优点: get和set方法

2015-10-06 00:35:15 463

空空如也

空空如也

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

TA关注的人

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