
算法
paul123456789io
这个作者很懒,什么都没留下…
展开
-
Morris二叉树遍历算法
说到二叉树遍历,通常想到的是递归算法或者通过栈迭代实现,在遍历过程中,每个节点仅访问一次,所以这样遍历的时间复杂度为O(n),空间复杂度为O(n),并且递归的算法易于理解和实现。但是,还有一种更加巧妙的遍历二叉树的算法,Morris算法,其时间复杂度仍然是O(n),但是空间复杂度却只有O(1)。其优点概括来说有两个:1. O(1)空间复杂度,即只能使用常数空间;2. 二叉树的形状不会被破坏(中转载 2016-12-08 10:43:40 · 343 阅读 · 0 评论 -
Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码转载 2017-04-12 11:31:53 · 314 阅读 · 0 评论 -
Linux进程间通信——使用命名管道
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。一、什么是命名管道命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系转载 2017-04-12 11:32:44 · 242 阅读 · 0 评论 -
Linux进程间通信——使用匿名管道
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值。这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据。一、什么是管道如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号“|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通转载 2017-04-12 11:33:59 · 298 阅读 · 0 评论 -
Linux启动新进程的几种方法及比较
有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。一、system函数调用system函数的原型为:[cpp] view plain copy print?#i转载 2017-04-12 11:35:14 · 365 阅读 · 0 评论 -
二叉树常用操作算法集、解释及注意事项
二叉树是一种常用的数据结构,在程序中也经常需要使用二叉树,但是你所使用语言却并不一定提供了二叉树这种数据类型,所以为了方便使用,我们可以自己实现一个二叉树的数据类型。在需要时就像使用其他已定义的类型一样方便。下面给出一些本人写的算法和解释(基于C语言),希望对读者写一个二叉树数据类型有所帮助。0、递归的四条基本法则由于二叉树中的算法大多使用递归来实现,而且使用递归实现也转载 2017-04-12 11:43:11 · 779 阅读 · 0 评论 -
Linux进程间通信——使用信号
一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们转载 2017-04-12 11:44:48 · 226 阅读 · 0 评论 -
Linux进程间通信——信号集函数
我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程。那么我们应该如何设定我们需要处理的信号,我们不需要处理哪些信号等问题呢?信号集函数就是帮助我们解决这些问题的。有关Linux进程间使用信号通信的更多内容,可以参阅我的另一篇文章——Linux进程间通信——使用信转载 2017-04-12 11:46:22 · 235 阅读 · 0 评论 -
二叉树常用操作算法集、解释及注意事项
二叉树是一种常用的数据结构,在程序中也经常需要使用二叉树,但是你所使用语言却并不一定提供了二叉树这种数据类型,所以为了方便使用,我们可以自己实现一个二叉树的数据类型。在需要时就像使用其他已定义的类型一样方便。下面给出一些本人写的算法和解释(基于C语言),希望对读者写一个二叉树数据类型有所帮助。0、递归的四条基本法则由于二叉树中的算法大多使用递归来实现,而且使用递归实现也转载 2017-04-12 13:45:00 · 623 阅读 · 0 评论 -
二叉搜索树转换为有序双向链表
一、问题描述输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。二、实现思路在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种转载 2017-04-12 13:48:43 · 346 阅读 · 0 评论 -
查找文本文件中的关键字
查找文本文件中的关键字,说白了就是以文本文件作为输入,进行字符串匹配,找返回其第一次出现的下标位置。但是由于数据是以文本文件的形式作为输入的,如何存储和进行匹配就成为了一个问题。下面以两种方法来介绍如何操作。注:本文中采用的字符串匹配算法只是普通的字符串匹配算法,重点在对文件处理和分块查找。一、蛮力法这种方法非常简单,把文件中的所有数据输入到一个字符数组中,然后以数组作为主串,关键转载 2017-04-12 13:51:28 · 1153 阅读 · 0 评论 -
Linux进程间通信——使用流套接字
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程。一、什么是socketsocket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作转载 2017-04-12 11:30:06 · 250 阅读 · 0 评论 -
Linux进程间通信——使用数据报套接字
前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用。一、简单回顾——什么是数据报套接字。socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算转载 2017-04-12 11:27:44 · 495 阅读 · 0 评论 -
二叉树神级遍历算法——Morris遍历(C++版)
题目:设计一个算法实现二叉树的三种遍历(前序遍历 中序遍历 后序遍历)。要求时间复杂度为O(n) 空间复杂度为O(1)。 思路:空间复杂度O(1)的要求很严格。常规的递归实现是显然不能满足要求的[其空间复杂度是树的深度O(h) ]。本篇文章介绍著名的Morris遍历,该方法利用了二叉树结点中大量指向null的指针。常规的栈结构遍历方式,遍历到某个节点之后并不能回到上层的结点转载 2016-12-08 10:44:38 · 368 阅读 · 0 评论 -
二叉树遍历之morris traversal
刚开始接触到这个是因为算法导论习题10.4-5,其中有一句话说不能改变二叉树结构,即使临时改变也不行,个人就感觉改变二叉树结构也可以进行遍历。搜索的过程中发现了morris 遍历,刚开始根本不相信如此短的代码可以使用无栈、O(1) 空间进行二叉树遍历,但深入之后才发现这个想法是如此的巧妙,感谢J Morris,不知这个Morris 和KMP中的Morris 是否是同一个人?转载 2016-12-08 10:45:38 · 252 阅读 · 0 评论 -
iconv()函数的用法
linux shell 配置文件中默认的字符集编码为UTF-8 。UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是一个层次上的。在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。 查了下iconv命令用法如下:iconv [选项转载 2017-02-09 10:43:30 · 1856 阅读 · 0 评论 -
设计模式之代理模式
最近《软件体系/设计模式》要汇报代理模式,查找了很多代理模式的资料,整理了下面的一些关于代理模式的文章. (铁血肯德基-Eastmount 制作)一.模式产生的原因 在面向对象系统中,有些对象由于某些原因,比如:对象开销太大、某些操作需要安全控制、或者要访问的对象在远程的机器上,直而采用接访问会给使用者或系统结构带来很多麻烦。 现在,我们可转载 2017-02-09 11:30:00 · 419 阅读 · 0 评论 -
2016届360公司PHP服务端开发笔试和面试之所得所感
这是一篇叙述自己在360公司参加笔试和面试的过程,可能面试的职位并不是你所学的方向,但是如果你能从中学到些什么或者吸取我的教训,那么作者就非常知足了。本着"学习别人是怎么失败的,活着出来的人才能成功"的目标,我从三个方面进行叙述: 第一部分:360公司笔试题 第二部分:面试过程 第三部分:注意事项及心得体会 同时,真心感谢36转载 2017-02-09 11:43:57 · 1793 阅读 · 0 评论 -
IP分片重组的问题
在IP层协议处理IP分片重组时,会调用ip_defrag() -> ip_frag_queue()在ip_frag_queue函数中有关于分片与前个分片或后个分片重叠的情形,比如与前个分片重叠的处理:C/C++ code?123456789101112转载 2017-02-13 13:41:21 · 1206 阅读 · 0 评论 -
计算机网络IP数据包的3个标志位以及IP数据报的分片和重组过程
1.3个标志位是哪3位?目前只有两位有意义标志位中的最低位记为MF(More Fragment)。MF=1即表示后面"还有分片"的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的以为记为DF(Don't Fragment)。意思是"不能分片"的数据报。只有当DF=0是才允许分片。2.描述数据报的分片和组装过程分片和重新组转载 2017-02-13 13:42:31 · 9359 阅读 · 0 评论 -
TCP/IP协议中分包与重组原理介绍
TCP/IP协议中分包与重组原理介绍引言分片是分组交换的思想体现,也是IP协议解决的两个主要问题之一。在IP协议中的分片算法主要解决不同物理网络最大传输单元(MTU) 的不同造成的传输问题。但是分组在传输过程中不断地分片和重组会带来很大的工作量还会增加一些不安全的因素。我们将在这篇小论文中讨论IP分片的原因、原理、实现以及引起的安全问题。一、什么是IP分片转载 2017-02-13 13:44:11 · 637 阅读 · 0 评论 -
Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一转载 2017-04-12 11:24:33 · 360 阅读 · 0 评论 -
Linux进程间通信——使用消息队列
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消转载 2017-04-12 11:26:02 · 438 阅读 · 0 评论 -
python_1 matplotlib 例子
# coding=UTF-8import numpy as npimport matplotlib as mplimport matplotlib.pyplot as plt# 通过rcParams设置全局横纵轴字体大小mpl.rcParams['xtick.labelsize'] = 24mpl.rcParams['ytick.labelsize'] = 24np.rando...原创 2018-02-17 10:54:43 · 345 阅读 · 0 评论