自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 资源 (1)
  • 收藏
  • 关注

原创 欧拉定理与费马小定理

欧拉定理与费马小定理进来回顾了下欧拉定理,笔记整理一下。剩余数系统要讲欧拉定理,我们最好先了解下剩余数系统。完全剩余数系统(Complete residue system (CRS) modulo n: ZnZ_n )的定义是: A set of n integers such that no two are congruent modulo n. 摸n之后结果不同的全部n个值构成了完

2016-02-12 11:23:25 1939 5

原创 PowerPC架构下Linux系统读写PCI设备

最近需要完成一个linux系统下的PCI驱动程序,然而处理器是PowerPC架构,以为在linux用户态就可以实现,但是发现不行。上一篇文章中通过I/O端口访问了PCI设备,但是x86家族之外的的处理器都不为端口提供独立的地址空间,因此PowerPC下无法直接通过地址用in/out方法来访问PCI设备。于是我使用另外一种机制:将PCI设备的空间映射到内存中。实现思路完成PCI驱动代码,确保特定的P

2016-01-21 10:50:56 2511

原创 Linux读取PCI设备的信息

读取PCI信息最近想要在linux系统下用代码读取PCI的设备信息,查看了以下网上的代码,稍微修改就可以了,现在贴出来以备以后使用。当然想要查看PCI的其他信息也只要在此基础继续修改读取更多的PCI信息就行。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/io.h>#define PCI_MAX_BUS 25

2015-12-17 18:57:43 4933

原创 CSAPP——实验三 内存攻击(二)

内存攻击承接上文,本文继续介绍《Hardware/Software Interface》的实验三。Level 2: FirecrackerYour task is to get bufbomb to execute the code for bang() rather than returning to test(). Before this, however, you must set globa

2015-12-09 16:53:43 2232

原创 CSAPP——实验三 内存攻击(一)

《Hardware/Software Interface》实验三 是内存攻击,通过注入多余的数据造成缓存溢出从而改变栈中的数据,进而改变进程的运行轨迹。这个实验能帮助我们加深理解函数间调用的过程以及栈空间的使用,是非常棒的一个实验。实验环境: Ubuntu 64位 操作系统内存攻击实验分为4个level ,每个level的处理过程差不多,难度整体是在上升。为了更好地理解整个实验,我们先看一下相关的

2015-12-09 15:28:06 1763

原创 CSAPP——实验二 拆炸弹

《Hardware/Software Interface》实验二 是拆炸弹,也是实验里面比较有意思的一个实验,实验能帮助我们加深理解函数的调用过程,提升用GDB调试代码的能力,话不多说,把实验内容附上。附实验环境: 64位Linux操作系统拆炸弹实验总共有六个阶段,难度也是在逐步加大,每个阶段都要求你输入一些信息,只有提供恰当合适的正确信息,才会拆炸弹成功进入下一个阶段,那么如何获得正确的信息,就

2015-12-06 21:29:33 14804 1

原创 CSAPP——实验一 位运算

最近学习了Coursera上面的《Hardware/Software Interface》 。该课源自于华盛顿大学计算机专业,华盛顿大学将该课搬到了Coursera,现在已经是公开课性质的,视频完全可以自由下载。课程链接如下:Coursera–Hardware/Software Interface这门课的大部分内容是对应于书《深入理解计算机系统》,该书的英文名称是《Computer Systems:

2015-12-05 21:02:19 6959

原创 Linux下模拟验证NAT功能

Linux下模拟验证NAT功能NAT(网络地址转换)功能能够方便内网与外网(通常是Internet)连接,既减少了有效IP的使用量又保护了内网主机的信息。Linux下的NAT功能嵌入在Linux最新一代防火墙Netfilter中,并提供给用户操作接口Iptables,相关知识可以查看网上资料。最近我通过两台安装了Linux的电脑搭建环境,验证了NAT功能的正确性。(我也是有够无聊的….

2015-12-03 19:00:05 1859

原创 编程珠玑——取样总结

取样问题问题描述:程序的输入包含两个整数m和n,其中m小于n。输出是0~n-1范围内的m个随机整数,要求:每个数选择出现的概率相等,且按序输出。问题中最重要的要求是概率相同。假设m=2,n=5,那么每个数都应该以2/5的概率被选中,直观的会想到用这样的代码实现:if((rand()%5)<2)然而这样做是不对的,编程珠玑12章对这个问题进行了详细的介绍。本文于是总结了编程珠玑中等概率取样问题的几种解

2015-11-09 10:43:22 923

原创 编程珠玑——快速排序总结

快速排序快速排序是二十世纪最伟大的10大算法之一。如何写好一个快速排序通常不是一件容易的事,同时面试中或者实际应用中也经常要用到快速排序。编程珠玑第11章专门介绍了快速排序,涉及到了基本的算法思想实现和一些优化,这里进行简单的总结以便以后快速的回忆。基本思想快速排序用到了分治,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此

2015-11-07 21:35:50 1805

原创 分治算法求子数组的最大和

求最大子数组和也是一个非常经典的题目。此题目在leetcode,《编程之美》,《算法导论》,《编程珠玑》中都提到了,这是一个能显著体现出算法设计重要性的题目。通过不断地优化算法设计,该题目能够不断以更好更快的时间被解决。先看一下题目描述: 题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时

2015-11-03 21:27:00 1233

原创 二分查找

二分查找二分查找是一种用于有序数列的折半查找算法。二分查找优点是比较次数少,查找速度快,平均性能好;时间复杂度为O(lgN)。因此二分查找也成为了面试中的常问问题。但是要写出一个完全正确的二分查找并不容易,下面我们先来看个错误的二分查找。(以下大部分是对编程珠玑章节的总结)错误的二分查找int binarySearch(vector<int> x,int t){ int mid,l=0;

2015-10-28 16:08:31 2987

原创 牛顿迭代法实现平方根函数

牛顿迭代法实现平方根函数平方根函数Sqrt() 用来求一个数的平方根,如何实现这个函数?有多种方法,这里记录一种比较常用的牛顿迭代法。牛顿迭代法 牛顿迭代法(Newton·s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而

2015-10-20 21:15:06 3527

原创 C++的重写和隐藏

C++的重写是指派生类重新定义基类的虚函数;隐藏通常是指的子类隐藏父类的方法,面试中遇到了类似两者结合的问题,特此整理下缕缕思路。背景父类如下:class Tfather{public: Tfather(void); virtual ~Tfather(void); virtual void virFunc(int a,float b);};Tfather::Tfathe

2015-10-18 20:11:59 2092

原创 线段树

线段树本文总结自己学习线段树的一些知识点。我最初是通过区间最值查询问题学习到线段树,查询一个区间的最值可以使用RMQ离线算法,该离线算法需要O(nlgn)的预处理时间和O(1)的查询时间。但是一个区间的某个值修改后,又需要重新计算,对于区间的值频繁的修改的情况,RMQ离线算法并不合适。线段树确是可以针对区间的值频繁的修改的情况作出应对。线段树是用O(lgn)的时间处理修改,用O(lgn)的

2015-10-17 22:09:34 954

原创 找工作总结(一)

实习面试经历从今天年初就开始着手复习CS相关的知识,希望今年校招能找到一个不错的工作,所以在3月4月的时候就开始找实习,面试了几家公司之后,最终因为自己的准备不充分,知识相对匮乏还是没能找到心仪的实习公司,现特此整理一下过去的实习面试经历,为以后自己的道路提供经验借鉴。腾讯腾讯的实习笔试规模很大,考查的知识面还挺广的,然而笔试就挂掉了(依稀记得有个题目是问JavaScript的闭包

2015-10-17 14:39:10 1147

原创 Leetcode题目整理

Leetcode题目整理最近一直在整理之前刷的leetcode的题目,考虑了好久用什么整理,最终选择了gitBook…(当然支持中文不太好),整理的网上链接在这里: Leetcode题目题目是按照leetcode上的分类来分类的,题型相似的题目会尽量放在一起,每个题目尽量整理多个方法。其中的很多方法都是抄子leetcode讨论区(这些方法代码写的好一些),但是作为自己的面试复习材料我就偷懒了(自己

2015-10-14 09:07:45 2261 1

原创 C++中的虚函数

本文虽是起了个想要把C++中虚函数彻底透彻介绍的标题,但实际上只是本人记录虚函数一些要点的文章。最近读了《Effective C++》,里面有几个关于虚函数的条款,以前对于虚函数不太了解,看了条款之后发现需要记录下来加深自己的印象。多态基类的析构函数要为虚函数这一点也正是多态的体现,假设有两个类Father,Son:class Father{string name;

2015-09-17 20:06:23 730

原创 Cache——缓存数据结构实现

Cache——缓存缓存是临时存放数据的区域,缓存的运行速度比内存快得多,设计好一个缓存结构能够帮助我们更快地运行程序。 进来在阿里面试的时候也遇到设计一个缓存的问题,同时leetcode和Hihocoder上都出现了设计缓存的问题,因此特此整理出来以便后续回忆。设计思路本文将最为常见的缓存的设计思路,学习操作系统的时候,我们直到一个内存置换的算法:LRU(Least Recently Used)。

2015-09-16 18:13:49 6548

原创 清华秘籍: android开发者也能发大财—广告收益分析

android开发者也能发大财—广告收益分析最近小学弟问我: ”学长,你们编android应用程序的是不是都是diao丝?” 看着学弟的天真问话, 我竟无言以对, 只好露出一丝微笑。 学弟又说:“iOS编程都是高富帅,我要学iOS,学长你快教iOS编程!!!”。 作为学长一定要告诉学弟,无论是iOS还是android编程都是可以赚大钱的,所以我对小学弟说:“我必须得教你android,然后等你

2015-09-10 01:38:51 4168 2

原创 删除二叉树

删除一个二叉树很简单,但是通常我们是用递归的方式,若用迭代的方式则需要额外的空间来保存信息。如何在O(N)的时间内使用O(1)的空间来完成二叉树空间的释放呢?这是我在面试中遇到的一个问题.Morris中序遍历利用Morris中序遍历可以在O(1)的空间O(N)的时间复杂度内遍历完成二叉树,因此可以在遍历的过程中完成树的空间的释放。我之前转载过Morris遍历二叉树的一篇文章,详细看这里: Morr

2015-09-01 11:53:55 2608

原创 KMP优化

KMP优化KMP算法是有优化版本的,之前写过文章简单的讨论了基本的KMP算法思想,但是对于一些含有连续重复字符的字符串,会出现多次冗余的比较。 例如:字符串S=“aaababa”和模式串P=“aaac”比较时,会出现多次的不必要的比较,这个我会在下面细说。Next数组重定义我们首先要解决的问题就是next数组的意义,之前的我写的KMP文章里面,next数组的意义是:字符串真子串中既是前缀串同时又是

2015-08-30 16:44:02 2125

转载 Morris方法遍历二叉树

本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求:O(1)空间复杂度,即只能使用常数空间;二叉树的形状不能被破坏(中间过程允许改变其形状)。通常,实现二叉树的前序(preorder)、中序(inorder)、后序(postorder)遍历有两个常用的方法:一是递归(recursive),二是使用栈实现的迭代版本(stack+iterative)。这两种方法都是O(n)的空间复杂度

2015-08-29 16:27:40 3612 1

原创 二叉搜索树

二叉搜索树是一种常用的数据结构,其也是面试中常被问到的问题,因此掌握二叉搜索树十分必要。 本文就二叉搜索树上的一些常见操作进行较为详细的介绍。二叉搜索树首先看一下二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序

2015-08-28 21:36:32 891 1

原创 求二叉搜索树任一节点的前驱后继节点

二叉搜索树节点的前驱后继节点之前写过文章介绍了二叉搜索树以及其上的基本操作,但不包括求节点的前驱结点和后继节点。这是一个很老的问题了,首先看下某节点前驱和后继节点的定义。一个节点的 前驱结点:节点val值小于该节点val值并且值最大的节点 后继节点:节点val值大于该节点val值并且值最小的节点算法导论中给出了详细的求前驱结点和后继节点的算法,但是其中的节点数据结构包含了指向父亲节点的指针,但是

2015-08-27 20:55:58 13022 3

原创 LCA-最小公共父节点

有一个普通二叉树,AB分别为两个子节点,求AB最近(深度最浅)的公共父节点。 此题仍然是一个老题,有着多种解决方法,本文针对其中三种方法来进行分析总结。这三种方法分别是:递归法,tarjan离线算法,RMQ在线算法。递归法递归法比较直观简单,思路如下:首先判定当前节点root是否是A节点或者B节点,若是的话直接返回该节点若不是,分别对root节点的左右子树进行递归查找最小公共

2015-07-19 10:37:22 5009

原创 不相交集合-并查集

并查集的定义不相交集合维护了一个不相交动态集的集合。我们用一个代表来标示每个集合,而这个代表是这个集合的某个成员。 该集合中最主要的两个操作Union(合并)与Find(查询),因此该数据结构也叫做并查集。让我们看一下百度百科的介绍: 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个

2015-07-18 17:27:01 1358

原创 RMQ-区间最值问题

区间最值询问是求给定区间最值的问题。若总区间为[1,N],通常是有多次查询,每次查询是不同的总区间的子区间。简单的方法是对每个子区间遍历从而找到最值,时间复杂度是O(N),但是如果有多次的查询,效率就会很低。而解决这个问题的一个很好的在线算法便是ST(Sparse_Table)算法算法思想预处理ST算法在O(nlogn)的预处理以后可以实现O(1)的查询效率。也就是说我们把大量的区间的最值预先求出来

2015-07-15 16:14:44 1281

原创 Leetcode : Regular Expression Matching

对于leetcode上这个题目,我用了不少时间来消化。题目大意如下:实现两个字符串s,t的匹配,其中t字符串中的 ‘.’ 能匹配任何一个字符. ‘*’ 能充当0个或者多个前面一个字符. 匹配结果要覆盖整个字符串几个例子: isMatch(“aa”,”a”) → false isMatch(“aa”,”aa”) → true isMatch(“aaa”,”aa”) → f

2015-07-08 15:45:31 586

原创 最长上升子序列

这是一道老题,有两种思路,时间复杂度分别是O(n^2)和O(nlgn). O(n^2)的方法是典型的DP思路,较为常见,现在整理下O(nlgn)的算法思路。算法思路最长上升子序列的查找用到了多个数组。a数组作为存储原始数据的数组,该算法的实现过程就是将a数组中每个元素插入c数组中的过程,而c数组中最后剩余的a数组中的元素个数即是最长上升序列的长度。原因如下: 最长上升序列中的元素大小一定是递增,利

2015-07-04 09:31:38 441

原创 最长回文子串

最长回文子串题意:给定一个字符串s,找出该字符串中最长的回文子串。字符串如“abcba”,”abbbba”这样呈中心对称的子串称为回文串。该题目是一个老题了,有多种不同的解法,我整理一下方便以后查询。暴力动态规划法这个方法是我们看到这个题目后最容易想到的方法,暴力搜索所有的子串,判断每个子串是否是回文串;我们用一个二维空间记录已计算过的子串是否为回文串,这样之后针对每个新子串进

2015-06-30 19:36:49 699

原创 数组中第K大元素

数组中第K大元素在面试的时候遇到过这个问题,后来在leetcode上也遇到了这个问题,于是记录下来以便以后快速回忆。题目有多种思路,全排序是比较直观的想法,然而最低的时间复杂度为O(nlgn),并且不符合该题目的初衷。题目更多想问的是如何在不进行全排序的条件下找到数组中第K大的元素,个人认为比较被面试官中意的解答有两个(理应也有其他的..),如下:构建最大堆简单分析时间复杂度: 构建堆的时间O(n)

2015-06-27 22:08:50 3272

原创 拓扑排序

拓扑排序拓扑排序的定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列—— [ 百度百科 ]拓扑排序表示了顶点按照边的方向出现的先后顺序。

2015-06-20 16:21:18 1009

原创 Trie——字典树

字典树首先看下百度百科的定义. 字典树 是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 —— [百度百科 ]一个典型的字典树可以如上图所示。字典树的性质字典树主要有以下性质:根结点不包含字符

2015-06-17 09:16:39 548

原创 二叉树的创建

二叉树的创建以前文章里面提到过二叉树的遍历分三种方式,前序遍历,中序遍历和后序遍历,那么二叉树的构建过程也可以分这三种顺序,最常用的应该是先序创建二叉树,比较符合我们的直观想法。 我在实际中遇到的二叉树的创建问题较少,更多的是给定一个二叉树然后对二叉树进行操作。最近遇到了几个题目,跟二叉树的创建有关,也是考验算法的题目,现在记录一下。根据中序和后序遍历顺序构建二叉树这个题目一开始

2015-04-30 22:02:42 733

原创 KMP算法小总结

KMP算法小总结字符串匹配是编程常遇到的一个问题,最朴素简单粗暴的匹配方法需要O(n2)O(n^2)的时间复杂度,这显然满足不了算法大神的要求。KMP算法是一种改进的快速的字符串匹配算法,是由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,算法的时间复杂度只需要O(n)。算法思想其实很简单,但是有时候会被人们解释的很复杂,因此我想根据我的经验来简单的总结一下KMP算法以便我自己

2015-04-30 21:49:57 635

原创 窗口有关算法题目

窗口算法窗口算法是我自己起的不严谨的名字,因为最近做了几个leetcode中几个算法题目,发现其算法的都需要通过维护一个窗口来实现,说到窗口,我们肯定会想到TCP/IP中的滑动窗口协议,其实这类算法题目和这个有点神似的。 滑动窗口协议是用来改善吞吐量的一种技术,TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。——百度百科现在我汇总一下,分析一下这

2015-04-21 22:31:17 619

原创 二叉树的遍历

二叉树的遍历二叉树是一种常用并且重要的数据结构,其是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树中一个比较常用的操作是遍历二叉树。 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。 ———-[百度百科

2015-04-15 19:45:19 645 1

原创 常用位运算算法题目

常用位运算算法题目位运算操作简单,高效,可以提升算法编程的效率,下面让我们讨论几个常用的位运算算法。求二进制中1的个数这个题目有在编程之美里面出现,最基本的思路就是一个数除以2,原来的二进制数目会减少一个,若是除的过程中有余数,那么就表示当前位置有一个1.除以2可以用>>操作,判断是否有余数1可以用&操作。int hammingWeight(uint32_t n) { int num=0

2015-04-14 20:26:36 1258

原创 BigInteger类实例的构造过程——JDK源码解析

最近看了下JDK1.6版本的BigInteger类,仔细研究了下大整数实例的构造过程,现在把自己的所得所想分享给大家.首先,为什么需要大整数类?简单的说就是因为内部的数据类型能表示的最大数是64位长度,当需要更大长度位数的数据时,基本的数据类型无法处理. 跟密码学相关的加密算法常涉及到好几百位的整数的加减乘除,因此需要设计一种数据结构能够满足这样的需求.其实要实现大整数类也不难,简单一想,

2014-02-19 09:56:37 7829 3

判断图片文件的格式

其中封装的方法可以从本质上判断一个图片的类型,是PNG还是JPG还是BMP或是其它

2012-11-21

空空如也

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

TA关注的人

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