自定义博客皮肤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的博客

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

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

原创 数据结构:红黑树java实现

package trees;import list.MyQueue;/** * Left-Leaning Red Black Binary Search Tree * 左倾红黑二叉查找树 * @author earayu * */public class LLRBBST<K extends Comparable<? super K>, V> { public LLRBBST() {

2016-04-18 00:16:02 687

原创 观察者(Observer)模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式包含如下角色:Subject: 目标CSu

2016-03-05 20:42:19 489

原创 基本套接字编程

《UNP》第4到第5章讲解了基本的TCP套接字编程。先介绍了各类套接字的地址结构,然后详述了各个API。 先介绍了一个迭代服务器,但是迭代服务器性能有限,所以提供了一个并发服务器。但是并发服务器需要用信号机制处理结束的子进程,并且会带来中断慢系统调用的问题。 再升级一下,可以预先派生子进程,可以用线程替代进程,可以把服务器改造为守护进程等等。#ifndef UTILS_H#define UTI

2016-02-22 14:21:22 381

原创 C++数据结构: 二叉搜索树 (非递归)

理想情况下BST的插入删除查找花费的时间都是对数级别的,但我们肯定不能依赖“理想情况”。基于下面3个理由: 1. 很多时候输入得序列都是有序或基本有序的 2. 访问一个节点过后很可能再次访问这个节点,或者这个节点附近的节点。 3. 多次删除过后会破坏树的平衡性(可以改变一下删除方式来解决,但是这样的代价比较大)而BST在最差的请况下会退化成一个链表,这显然不是我们想要的结果。所以感觉BST的实

2015-11-17 14:10:00 556

原创 C++数据结构: 链表

我用Java写的链表是带头尾节点的双向链表,这次用C++透彻一点,不带头尾节点的单向链表。 实现了一些常用方法,没顺序表详细。链表的查找、插入、删除的时间复杂度都是O(N)。因为它要遍历到指定位置,如果在原地进行上述操作的话,时间复杂度为O(1)。但总归是比不过顺序表,这大概就是为什么我们总是被教导:大部分时间都只需要vector(ArrayList)!但链表还是有它自己的优势的,以它为基础的高级

2015-11-14 21:15:17 399

原创 C++数据结构: 顺序表 详细实现

相比于我用Java实现的顺序表,用C++实现更加繁复,因为要自己管理内存,但思想还是一样的。代码复杂度的提升也意味着性能上的提升。C++的迭代器跟Java不同,它的底层是个指针。开始喜欢Java迭代器的直白,然后慢慢喜欢上C++迭代器的灵活,各有千秋。以下的CppArrayList,函数的复杂度都写在旁边。#ifndef CPP_ARRAYLIST_H#define CPP_ARRAYLIST_H

2015-11-12 17:47:05 531

原创 Python: 利用163邮箱远程关电脑小脚本

学了一个礼拜Python之后写的,代码很粗糙,只是为了完成功能。直接把代码发上来吧。要执行的话得先安装一些模块,看import语句。十月初写的,写完这个之后就没怎么写python了,忘得厉害。本来想从mail.163.com模拟登录的,但这个网页提交按钮是个, 有点复杂,搞了几个小时搞不定。我就绕了一下,从http://reg.163.com/logins.jsp 登录。这个页面登录会被拦截,还

2015-11-11 23:19:56 1516

原创 C++: 拷贝管理

《C++ Primer》看到这一章我都惊呆了,C++竟然还能有这种功能:类可以控制该类型对象拷贝、赋值、移动和销毁时做什么。 以上操作通过:拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符、以及析构函数构成。拷贝构造函数:定义: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。本质上是个构造函数,所以它出现就会构造新对象,没有新对象它

2015-11-08 04:03:10 453

原创 C++: 类(class) 随笔

随手记录下一些对C++中类的理解,只是当做自己的学习笔记,大致地列举一下知识点,如有错误,还请指正。C++类中可以存在的: 1. 成员变量 2. 成员函数 3. 构造器 4. 友元 5. 类型声明 6. 访问说明符 7. 声明成员变量:C++的类中的成员变量可以在定义的时候初始化,也可以在构造器中初始化。如果都没有的话,会使用默认初始化。这样是非常危险的!如int型就会生成一个随机值

2015-11-03 23:21:32 469

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

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

2015-10-27 12:07:04 2426

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

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

2015-10-26 22:15:58 1285

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

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

2015-10-26 20:39:07 2347

原创 算法:Dijkstra算法

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

2015-10-24 19:38:15 585

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

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

2015-10-22 21:20:52 1231

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

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

2015-10-22 19:11:26 838

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

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

2015-10-22 15:25:38 15263 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 4897

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

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

2015-10-21 00:17:08 2868

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

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

2015-10-11 20:51:39 483

原创 数据结构: AVL树

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

2015-10-11 20:33:20 406

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

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

2015-10-06 00:37:39 529

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

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

2015-10-06 00:35:15 451

原创 简单的shell scripts例子

看了几天的linux,刚开始接触shell脚本的编程。对着书上的课后题,写了几个非常简单的shell脚本,发到博客上来供自己复习思考一下,如有错误,还望指正。编写shell脚本可以用任意文本编辑器,后缀为sh。编写完后并没有执行的权限,所以要给它加上权限。例如刚写完一个命名为sh01.sh的脚本,在此路径的终端下执行chmod 755 sh01.sh,然后再敲击命令./sh01.s

2015-07-10 10:34:19 490

空空如也

空空如也

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

TA关注的人

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