自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (3)
  • 收藏
  • 关注

原创 穷竭搜索

穷极搜索主要包括两个方面:1.深度优先搜索2.广度优先搜索一些基本的思想1.递归函数在函数中调用自己的函数就是递归函数,例如阶乘函数可以定义为:int fact(int n){if (n == 0) return 1;return n * fact(n - 1);}递归最重要的一点就是函数的停止条件,在上面的例子中,当传入的参

2013-11-20 20:06:15 1274

原创 编译与链接的简单过程小结

一些集成IDE隐藏了处理的细节,其实一个程序的编译大体上可以分为如下几个步骤:预处理->编译->汇编->链接预处理:产生.i文件gcc -E hello.c -o hello.icpp hello.c > hello.i1。展开所有的宏定义2。处理所有的条件编译指令3。处理#include指令,将文件包含进去4。删除所有的注释5。添加行号和文件标识6

2013-11-13 22:57:14 838

原创 gdb的简单使用

gdb是GNU debuger的缩写,在使用gcc生成目标代码文件后,可以使用gdb对其进行调试。gdb的功能1.随心所欲的运行程序2.设置断点,断点可以是某一行或是某一个函数的入口,甚至是条件表示3.每一步执行可以查看当前的所有信息,例如变量的值4.动态的改变程序的执行环境gcc -Wall -g hello.c -o hello.o     gdb就是对生成

2013-11-06 21:25:04 926

原创 gcc的简单使用

gcc是一系列的软件的组合首先,gcc通过cpp预处理器将源程序进行扩展,包括头文件的展开和宏的展开,形成.i文件,然后,gcc通过cc1编译器进行编译,生成汇编程序,通过汇编器as产生可重定位的目标程序,可重定位表示代码段、数据段的开始地址为0,没有根据机器生成实际的地址。最后,通过链接器ld生成可执行目标程序,链接器不仅要完成物理地址的翻译,还要和其他调用的库链接,最终生成可执行文件。

2013-11-05 13:40:13 1009

原创 Dijkstra in python

下面是一段由python实现的Dijkstra算法,一些地方的处理实在非常棒,相比于C,代码的数量已经缩减到了60行,所以我想通过本文

2013-10-10 20:29:39 1643

原创 Python字典处理技巧

从字典中取值(不想由于搜索的键不存在而异常)解决方法:使用字典的get方法 (get方法只读取字典的值而不会去修改字典)d={'key':'value'}print d.get('key','not found')print d.get('keys','not found')假如键key存在,那么get方法就会返回相应的值,否则,返回第二个参数给字典添加一个条目

2013-09-15 16:35:09 1411

原创 Python文件处理(1)

读取文件解决方案:最简单的就是一次性读取所有的内容放在一个大字符串中 all_the_text=open('thefile.txt').read()all_the_data=open('abinfile','rb').read()为了安全起见,最好将打开的文件对象指定一个名字,这样操作完成后可以迅速关闭文件 file_object=open('thefile.txt')

2013-09-12 19:27:30 905

原创 Python文本处理(2)

访问子字符串(获取记录中某些字段的数据)解决方法:切片,但只能取得一个字段 theline='I Love Python'afield=theline[2:6]print afield结果Love如果需要考虑字段的长度,使用struct.unpack # -*- coding:gb2312 -*-import structbaseformat='1s 6x 6s'#首先,b

2013-09-12 13:34:31 754

原创 Python文本处理(1)

每次处理一个字符解决方法:创建列表 thestring='abcdefg'thelist=list(thestring)print thelist结果['a', 'b', 'c', 'd', 'e', 'f', 'g']使用for语句循环遍历 thestring='abcdefg'for c in thestring: print c使用列表推导式 (注意这里使用or

2013-09-11 16:06:47 1300

原创 三行快排

Beautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability

2013-09-08 14:18:12 1125

原创 UNIX I/O

文件描述符:文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。文件描述符 0、1、2 (通常使用中定义的 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO) 则用作进程的标准输入文件、标准输出文件和标准出错文件。虚拟目录/proc/self/fd 中记录了当前进程所打开的文件描述符。open 函数:

2013-08-26 22:10:10 739

原创 动态规划概述

在之前http://blog.csdn.net/yettocome/article/details/9840539问题上,

2013-08-11 16:19:49 1545

原创 动态规划之 矩阵链乘法

承接着上一篇的装配线调度问题,下一个要解决的问题是矩阵链乘法问题:给定n个要相乘的矩阵构成序列,

2013-08-10 12:54:27 3011

原创 动态规划之 装配线调度问题

从之前提到的最长公共子序列的问题中已经可以看到动态规划的应用之处,但是对于这种算法,或者说是一种思想,该在什么地方使用,哪些问题的解决可以使用动态规划,可能并不清晰。下文所讲述的内容就是可用动态规划解决问题的两个要素:最优子结构和重叠子问题。在分析这两个要素之前,先以两个例子引入:装配线调度假设一个汽车底盘加工有两个装配线,如下如所示,每个装配线都有n个配件站,用于给底盘安装不同的零件

2013-08-08 15:47:39 7977 1

原创 最长公共子序列(LCS问题)

先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序

2013-08-06 20:51:47 4323 1

原创 现代操作系统笔记之 进程间通信(上)

进程间的通信其实就是要解决3个问题1、一个进程如何把信息传递给另一个进程2、怎么处理多个进程在关键活动中不出现交叉3、确保进程处理的顺序性。当然,进程间的通信同样也是适合线程,对于第一个问题,由于线程是共享同一个地址空间,通信比较容易,要处理的其实就是后两个问题,解决方法与进程的方法一致。竞争条件在一些操作系统中,写作的进程可能拥有一些共享区,现考虑一个例子,一个脱机打印程序,当一个进程需

2013-08-03 13:57:13 1211

原创 现代操作系统笔记之 线程

线程其实就像是对进程的进一步划分,每个进程都拥有自己的地址空间,而在这一个地址空间中可能存在多个控制线程。线程的使用为什么需要线程?以下是几点原因1、许多应用中同时有多个活动,某些活动可能会阻塞,将这些活动分配到不同的线程可以使程序设计模型更加简单。2、线程更加轻量级,创建和撤销比进程更快。3、如果存在大量计算和大量I/O处理,多线程允许活动重叠进行(流水线),加快活动执行。

2013-08-02 15:26:57 1408

原创 C++编程技术之 异常处理(下)

标准异常:使用标准库定义的异常要比先前的自己创建异常类方便得多,当然,也可以从标准异常类中派生出自己的类。所有的标准异常都是从exception类派生的,该类定义在中,主要的两个派生类为logic_error和runtime_error,这两个类定义在中(这个头文件包含exception)。logic_error描述程序中出现的逻辑错误,如传递无效的参数。runtime_error描述无法

2013-08-01 14:59:26 836

原创 现代操作系统笔记之 进程

进程:对正在运行程序的一个抽象对于只有一个用户的PC,当启动系统时,会同时启动许多进程,而CPU则在这些进程之间进行切换。严格的说,在某一瞬间,CPU只能运行一个进程,而在1秒内,它可以运行多个进程,这就造成了并行的错觉,称为伪并行。用于描述并行的概念模型称为顺序模型。1.进程模型计算机上所有可运行的软件,包括操作系统,被组织成若干顺序进程。一个进程就是一个正在执行程序的实例,包括程序

2013-08-01 12:27:52 1070

原创 C++编程技术之 异常处理(上)

增强错误恢复能力是提高代码健壮性的最有力途径之一之所以平时编写代码的时候不愿意去写错误处理,主要是由于这项工作及其无聊并可能导致代码膨胀,导致的结果就是本来就比较复杂的程序变得更加复杂。当然了,前面的缘由主要是针对C语言的,原因就在于C语言的‘紧耦合’性,必须在接近函数调用的地方使用错误处理,当然会增加复杂性了。1.传统的错误处理(主要是针对C语言的方法)1)函数中返回错误信息,或者设

2013-07-23 15:32:51 1084

原创 现代操作系统笔记2(操作系统概念和系统调用)

操作系统概念:1.进程本质上是正在执行的一个程序,进程在其地址空间内读写,该地址空间存放有可执行程序、程序的数据以及程序的堆栈,进程的资源集包括寄存器、打开文件的清单、突出的报警、有关进程的清单。进程基本上是容纳一个程序所需要所有信息的容器。操作系统周期性的挂起一个进程然后运行另一个进程。进程被挂起后,当需要再次启动时,状态需要完全相同,这意味着挂起时进程所有的信息都要被保存下来。与一

2013-07-20 11:19:03 2184

原创 动态顺序统计

在之前的随机选择算法中,我们可以很快的在集合中寻找到第i小的元素,然而,这样的集合并不支持动态的扩充。这一节里,将介绍通过红黑树(具体可参考红黑树1,红黑树2两篇文章)的扩充,使得任意的顺序统计量都可以在短时间内查找到,而这样的数据结构同时也支持数据的更新。这样的数据结构称为顺序统计树,如下图。树的节点大致上与红黑树的类似,但增加了一个记录子树大小的域size[x],定义哨兵Nil的子树大小为

2013-07-19 16:57:54 1571

原创 现代操作系统笔记 1

操作系统的任务是为用户程序提供一个更好、更简单、更清晰的计算机模型,管理计算机硬件设备。用户与操作系统之间进行交互的程序,基于文本的称为shell,基于图形的称为GUI,他们实际上并不是操作系统的一部分。操作系统的简化视图如下:多数计算机拥有两种运行模式:内核态和用户态。操作系统运行在内核态,对硬件具有完全的访问权,其余软件运行在用户态,使用机器指令的一个子集,那些会影响机

2013-07-19 13:08:03 1622

原创 红黑树(删除操作)

上一篇文章主要讲到了红黑树的基本性质以及插入节点的操作,有了上面的基础后,今天就把红黑树剩余的一个难点也就是删除节点的操作详细的讲一下。红黑树节点的删除方法一开始的操作和二叉搜索树差不多,都是首先判断需要删除的节点,分为三种情况,一是如果这个节点没有子女的话,那么直接修改父节点的值,断开他们之间的关系即可。如果这个节点只有一个子女,那么修改它的父节点,使父节点直接连接其子节点。如果该节点有两个

2013-07-18 13:03:04 1697 1

原创 红黑树(基本性质及插入操作)

从二叉查找树中我们可以看到,一些基本的动态操作如查询,求后继、前驱,插入,删除等,其时间复杂度都与树的高度有关,当树的高度较低,也就是二叉树比较平衡的时候,这些操作执行的就会很快;但当树的高度较高时,例如每次向二叉树插入节点都一直向右,那么将会造成树的不平衡,这样的操作还不如直接使用链表方便。而为了保证树的平衡,这里就引入了红黑树的概念,他保证在最坏的情况下,树的高度总是log(n)。1.红黑

2013-07-17 17:08:26 1791 2

原创 二叉查找树

二叉查找树是按二叉树的结构组织的,节点用链表表示,除了表示数据的key域和一些卫星数据外,还包含域left,right和p,分别指向左孩子,右孩子和父节点。如果孩子节点或者父节点不存在,那就用NULL表示。根节点是树中唯一一个父节点为NULL的节点。那么,二叉查找树满足什么性质呢?其实就一句话,左孩子的值总是不大于父节点的值,右孩子的值总是不小于父节点的值。为了将二叉树中的值按照顺序输

2013-07-16 12:20:39 1150

原创 随机选择算法

之所以需要随机选择算法,是为了克服一般查找时的从左向右一个个查找的缺点,其思想非常类似于快速排序,还记得快排第一步是干什么吗?就是分割原数组,分割的那个点其实在数组中已经“归位”了,就是摆放在了正确的位置上,分割点左边的元素都是小于它,而右边的都大于它。随机选择算法就是利用了这一点,每次分割完后,算法就查找分割点是不是要找的那个数,如果是的话,那就直接返回,如果要找的比分割点大的话,那就在分割

2013-07-15 16:49:31 1180

原创 计数排序(BitMap实现)

计数排序:计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,对每一个输入元素x,确定出小于x的元素的个数,就可以把x直接放到最终输出数组的位置上。例如有17个元素小于x,那么x位于第18个输出位置。而当有几个元素相同时,方案需要修改,不能把他们放在同一个输出位置上。也就是说,计数排序比较适合元素之间没有重复的情况。就时间效率来看,计数排序几乎是只需要扫描一遍数组就可以将数

2013-07-15 15:43:33 1261

原创 快速排序

和归并排序一样,快速排序也是基于分治法的。下面是对一个典型的子数组A[p..r]排序的分治过程的步骤:1.分解:将数组数组A[p..r]划分成两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于A(q),且A[q+1..r]大于等于元素A(q)。总之,就是以A[q]为分界点进行划分,具体的步骤稍后说明。2.解决:通过递归调用快速排序算法,

2013-07-15 13:41:21 728

原创 优先级队列(大顶堆实现)

使用大顶堆可以高效的实现优先级队列,具体大顶堆的用法,可参考:堆排序优先级队列是用来维护一组元素构成的集合S 的数据结构,每一个元素都含有一个关键字key。一个最大优先级队列支持一下操作:Insert(S,x):把元素x插入到队列中,与一般队列不同的是,优先级队列入队的操作总和队列中已有的元素进行比较,找到适当的位置进行插入,本例中,入队的操作总是能使优先级队列保持有序状态。Maxim

2013-07-14 16:11:46 2178 1

原创 堆排序

堆:可以被视为一个完全二叉树,树的每一层都是填满的,除最后一层外。表示堆的数组A具有两个属性:length[A]是数组中元素的个数,heap_size[A]是存放在A中的堆的元素的个数。就是说,A[heap_size[A]]之后的元素都不属于相应的堆,heap_size[A]length[A]。树的根为A[1],给定节点下标,可以很快算出它的父节点,左孩子和右孩子节点。PARENT(i)=i/

2013-07-14 15:00:39 945

原创 归并排序

在介绍归并排序之前,首先需要介绍一下分治法的思想很多算法在结构上是递归的,算法需要一次或多次调用自身来解决相应的子问题,即将原问题划分成n个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后合并其结果,就得到原问题的解。分解:将原问题分解为一系列子问题解决:递归解决各个子问题。若子问题足够小,则直接解决合并:将子问题结果合并成原问题的解。归并排序其实就是应用

2013-07-14 13:39:13 1001

原创 插入排序

插入排序是对少量元素进行排序的有效算法。其工作原理与打牌类似,开始摸牌时,我们的左手是空的,一次从桌上摸起一张牌,插入到左手牌中正确的位置上。为了找到这个正确的位置,需要将它与手中已有的每一张牌从右到左进行比较。无论什么时候,左手的牌总是已经排好序的。具体的方法是通过一个数组A[1..n],包含了n个待排序的数,这些数组在数组A中就地排序,不需要添加额外的空间。以下是代码:

2013-07-14 09:52:06 690

原创 链表

链表:顺序由各对象的指针决定,可以灵活的表示动态集合,但效率不及数组高,形式如下图所示:next[x]指向链表中x的下一个元素,prev[x]指向上一个元素,head[L]指向第一个元素,若head[L]=NULL,则该链表为空。程序中使用的是双向链表。#include #include //链表中的每一个元素,包含一个值x,一个指向前驱的指针prev以及指向后继的指

2013-07-13 20:18:58 719

原创 栈和队列

栈:先进后出的动态结构,也就是说可以去掉的元素是最近插入的那一个用一个数组S[1..n]实现一个至多有n个元素的栈,top[S]指向最近插入的元素,S[1]表示栈底元素,S[top[S]]表示栈顶元素,如下图所示:以下是栈所支持的操作://该代码不考虑栈的溢出情况,使用int数组实现#include #include //假设栈所支持的元素最大个数是10个#de

2013-07-13 17:44:16 662

artoolkit中文教程

要使用 ARToolKit 开发应用有两个部分:编写应用程序,以及训练对增强现实应用中所用到的真实世界标志的图像处理例程。

2013-07-06

用Virtools_SDK

使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法.

2013-07-06

空空如也

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

TA关注的人

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