自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhanglei8893的专栏

人生能有几回搏

  • 博客(71)
  • 资源 (6)
  • 收藏
  • 关注

翻译 精确测量Direct3D API调用(二)

测量Direct3D状态变化Direct3D使用很多渲染状态来控制管线中的几乎所有方面。导致状态变化的APIs包含除DrawPrimitive之外的任何函数或者方法。 状态变化很复杂因为你不能在渲染外查看状态变化的代价。这是lazy算法的结果,因为驱动和GPU会延迟工作直到必须完成。通常来说,你应该遵循下面的步骤度量一个状态变化。首先测量DrawPrimitive渲染序

2013-10-03 10:55:33 1964 1

翻译 精确测量Direct3D API调用(一)

主要有以下议题: 精确测量Direct3D非常困难如何精确测量Direct3D渲染序列测量Direct3D状态变化小结附录一旦你有一个实用的Mircosoft Direct3D应用,并且你想提高它的性能,你通常会使用一个现成的测量工具或者一些定制的测量技术来度量一个或更多的API调用所花费的时间。如果你成功做到了这一点,但是从不同的渲染序列得到了不同的计时结果或实验

2013-10-03 10:30:19 2258

原创 cocos2d-x源码剖析之精灵对象

在游戏中我们一个非常重要的元素就是图片,给最初的文字Mud游戏带来了多姿多彩。在3D游戏中,一个图片是采用什么结构表示的呢?其实灰常简单,你也能想得到: 1张纹理图,2个三角面片。那接下来就让我们看看cocos2d-x.们带来什么惊喜不?         游戏世界中的数据结构在我看来可以分为两种:一个是资源,另外一个是物理对象。是不是有点不好理解?资源就是一些原材料,比如纹理啊,声音啊,不

2013-08-25 17:13:35 3226 2

原创 cocos2d-x源码剖析之场景管理

cocos2d中采用树形结构来管理场景中的所有对象。所有的对象都是CCNode的子类。那么我们先探探CCNode类的虚实,先上代码:class CC_DLL CCNode : public CCObject{public:    virtual void update(float delta);    virtual void draw(void);    virtua

2013-08-24 23:36:38 2670

原创 cocos2d-x源码剖析之整体框架

刚阅读完了cocos2d-x的大部分源码,感觉受益匪浅,cocos2d-x的代码并不复杂,可读性很强,并且其中一部分精华的部分也可以运用到工作中去,相得益彰。现在看来,阅读源代码的最好方式是top-down的方式,先弄懂整个框架,再重点突破重要和感兴趣的模块。废话少说,先看看coscos2d-x的框架是怎样的,如何运行起来。     先让我们看看测试用例TestCpp中的主函数,也是整个W

2013-08-24 20:46:51 6827 6

原创 并行计算之计算模型

随着海量数据处理的需求增加,并行计算越来越发挥它巨大的作用。通过采用多线程(多进程)的模式对同一任务进行并行处理,可以大大节省处理时间,提高处理效率。并行算法可以通过数据划分,得到相应的任务即,然后映射到多个进程。接下来让我们一窥究竟。   划分数据    我们知道算法就是作用于输入数据,得出一组输出数据。那么进行并行计算的一种模式就是对数据进行划分,包括:划分输入数据、划分输出数

2011-12-13 22:08:49 3986 1

原创 多线程之false sharing问题

在多核快速发展的现在,利用多线程技术提高CPU设备的利用率已经成为一种趋势。然而多核计算机体系架构和单核有了很大的变化,在多线程编程中会碰到一些意想不到的问题,比如多核中非常典型的false sharing问题。下文会非常详细的揭示false sharing产生的根源,以及何如避免来提高程序的性能。        先来了解一下典型的多核架构,每个CPU都有自己的Cache,如果一个内存中的变量

2011-11-12 19:34:34 3854 1

原创 深入理解互斥锁的实现

在实际的软件编程中,经常会遇到资源的争用,比如下面的例子:class Counter{ private: int value; public: Counter(int c) { value = c; } int GetAndIncrement() { int temp = value;

2011-10-12 22:26:48 8340 5

原创 区间树

区间树是在红黑树基础上进行扩展得到的支持以区间为元素的动态集合的操作,其中每个节点的关键值是区间的左端点。通过建立这种特定的结构,可是使区间的元素的查找和插入都可以在O(lgn)的时间内完成。    相比于基础的数据结构,增加了一个max[x],即以x为根的子树中所有区间的断点的最大值。区间树如下图所示:     这里的区间查找的并不是精确查找,而是查找和给定区间重叠的元素,重叠的

2011-06-09 19:45:00 14024 7

原创 顺序统计树

      在包含n个元素的无序集合中,寻找第i个顺序统计量的时间复杂度为O(n)。通过建立一种特定的结构,可以使得任意的顺序统计量都可以在O(lgn)的时间内找到。这就是下面会提到的基于红黑树的顺序统计树。      相比于基础的数据结构,顺序统计树增加了一个域size[x]。这个域包含以x为根的子树的节点数(包含x本身)。size域满足等式:                      

2011-06-06 23:24:00 5991 3

转载 2-3-4 树

2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构,可以在O(lgn)的时间内查找、插入和删除,这里的n是树中元素的数目。2-3-4树和红黑树是等价的,也就是每个红黑树都可以转化为一颗2-3-4树,每个选择操作也和2-3-4树中的分裂操作对应。      2-3-4树是这样一种数据结构,满足如下性质:      1) 每个节点每个节点有1、2或3个key,分别称为2-node,3-n

2011-06-05 23:37:00 3988 4

原创 VC虚函数布局引发的问题

  在网上看到一个非常热的帖子,里面是这样的一个问题:#include using namespace std;class Base { public: int m_base; virtual void f() { cout

2011-04-19 15:44:00 13707 114

原创 透视C++对象模型

 一、c++对象模型   在c++中,有两种类数据成员:静态和非静态,以及三种类成员函数:静态、非静态和虚拟。比如下面的class Point的声明:class Point{  pulic:      Point  (float xval)      virtual  ~point();       float  x() const;       static  int PointCount();   protected:        virtual ostream& print (ostream &os

2011-04-17 22:36:00 2491 2

原创 调整双链表使之紧凑

10.3-5 设L是一长度为m的双链表,存储在长度为n的数组key、next和prev中。假设这些数组由维护双链自由表F的两个过程ALLOCATE-OBJECT和FREE-OBJECT来操纵。进一步假设在数组的n个元素中,有m个在表L和自由表F,移动L中的元素,使他们占有数组中的1, 2, ..., m位置,同时调节自由表F使之保持正确,并占有数组位置m+1, m+2, ..., n。所给出的运行时间应该是Θ(m),且只能使用固定量的额外空间。请仔细论证你所给出的过程的正确性。分析与解答:      如下图

2011-04-12 10:00:00 1909 1

原创 链表在存储器中紧凑地排列

10.3-4  我们常常希望一个双链表中的所有元素在存储器中能够紧凑地排列在一起,例如使用多重数组表示中的前m个下标位置(在一个分页的虚拟计算机环境中情况就是这样)。假设链表以外没有指向链表元素的指针,请说明应如何实现过程ALLOCATE-OBJECT和FREE-OBJECT,才能使这种表示比较紧凑。(提示:使用栈的数组实现。)分析与解答:     假设链表中已有y个元素,并且已经紧凑排列。令top = y +1,表示下一个将要分配的指针位置     在分配空间时很简单:           ALLOCAT

2011-04-11 17:21:00 1912 1

原创 二排序数组中位数

9.3-8 设X[1..n] 和 Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的O(lgn)时间的算法分析与解答:      若中位数位于X中,不妨设为X[k],即在X中有k个元素小于等于中位数,n-k个元素大于等于中位数。由于X[k]为合并后的2n个元素的中位数,则在Y中有n-k个元素小于等于中位数,k个元素大于等于中位数,即                                       Y[n-k] ≤  X[K] ≤ Y[n-k+

2011-04-10 20:19:00 4123

原创 带权中位数

 9-2  带权中位数   对分别具有正的权重w1, w2, ... , wn,所有权重之和为1的n个不同元素x1, x2, ..., xn,带权(下)中位数是满足如下条件的元素xk和   a)论证x1, x2, ..., xn 的中位数即各xi的带权中位数,此处权值 wi=1/n, i=1,2 ..., n   b)如何通过排序,在O(nlgn)的最坏情况时间内求出n个元素的带权中位数。   c)说明如何利用一个线性时间的中位数算法,来在最坏情况Θ(n) 时间内求出n个数的带权中位数。   邮局选址问题(

2011-03-31 23:36:00 8164 5

原创 已排序的i个最大数

<br /><br />9-1  已排序的i个最大数<br />   给定一个含n个元素的集合,我们希望能用一个基于比较的算法来找出按顺序排列的i个最大元素。请找出能实现下列每一种方法的、具有最佳的渐进最坏运行时间的算法,并分析各种方法的运行时间(用n和i表示)。<br />   a)对于输入数排序,并列出i个最大的数。<br />   b)对输入数建立一个优先级队列,并调用EXTRACT-MAX过程i次。<br />   c)利用一个顺序统计量算法来找到第i个最大元素,然后划分输入数组,再对i个最大数排序

2011-03-31 16:19:00 2396

原创 平均排序

8-5 平均排序   假设我们不是要排序一个数组,而只是要求数组中的元素一般情况下都是层递增序的。更准确地说,称一个包含n个元素的数组A为k排序的(k-sorted),如果对所有i=1,2, ..., n-k,有下式成立:    a)给出一个数组是1排序的是什么意思?    b)给出数字1,2, ..., 10的一个排列,它是2排序的,但不是完全排序的。    c)证明:一个n元素的数组是k排序的,当且仅当对所有i=1,2, .... n-k 有 A[i] ≤ A[i+k]。    d)给出一个算法,它能在

2011-03-30 21:19:00 1821

原创 水壶

8-4  水壶   假设给定了n个红色的水壶和n个蓝色的水壶,它们的形状和尺寸都不相同。所有红色水壶中所盛水的量都不一样,蓝色水壶也是一样。此外,对于每个红色的水壶,都有一个对应的蓝色水壶,两者所盛的水量是一样的。反之亦然。  你的任务是将所盛水量一样的红色水壶和蓝色水壶找出来。为了达到这一目的,可以执行如下操作:挑选出一对水壶,其中一个是红色的,另一个是蓝色的:将红色水壶中倒满水;再将水倒入到蓝色的水壶中。通过这个操作,可以判断出来这两只水壶的容量哪一个大,或者是一样大。假设这样的比较需要一个时间单位。你

2011-03-29 15:14:00 2050

原创 排序不同长度的数据项

8-3 排序不同长度的数据项a)给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中的总的数字数为n。说明如何在O(n)的时间内对该数组进行排序。b)给定一个字符串数组,其中不同的串包含的字符数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序。(注意此处的顺序是指标准的字母顺序,例如a 分析与解答:a)如果采用平常的基数排序,从最低位到最高位开始排序,考虑最坏的情况:如果最长的整数的字数为n/2,其他n/2个整数的字数为1,则采用基数排序,时间复杂度

2011-03-29 11:57:00 2090 2

原创 “三数取中“划分

<br />7-3 “三数取中“划分<br />      有一种改进RANDOM-QUICKSORT的方法,就是根据从子数组更仔细地选择的(而不是随机选择的)元素作为主元来划分。常用的做法是三数取中:从子数组中随机选出三个元素,取其中间数作为主元。针对这个问题,假设数组A[1...n]中的元素都不相同,并且有n≥3,用A'[1...n]表示已排好序的数组。用“三数取中"方法来选择主元元素x,并定义pi=Pr{x=A'[i]}。<br />a)对于i=2,3,...,n-1,给出pi的以

2011-03-22 10:00:00 4596 2

原创 Monge矩阵

<br /> <br />4-7 Monge矩阵<br />   一个m x n的实数矩阵A,如果对所有i,j,k和l,1≤ i<k ≤ m和1≤ j<l ≤ n,有<br />             A[i,j]+A[k,l] ≤ A[i,l]+A[k,j]<br />   那么,此矩阵A为Monge矩阵。换句话说,每当我们从Monge矩阵中挑出两行与两列,并且考虑行列交叉处的4个元素,左上角与右下角的和小于或等于左下角与右上角元素的和。<br />a)证明一个矩阵为Monge阵,当且仅当对所有i=1,

2011-03-13 12:06:00 4437 2

原创 对区间的模糊排序

7-6 对区间的模糊排序    考虑这样的一种排序问题,即无法准确地知道待排序的各个数字到底是多少。对于其中的每个数字,我们只知道它落在实轴上的某个区间。亦即,给定的是n个形如[ai,bi]的闭区间,其中ai≤bi。算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生的各区间的一个排列,使得存在一个cj∈[ai, bi],满足c1≤c2≤...≤cn。a)为n个区间的模糊排序设计一个算法。你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各ai),也要能充分利用重叠区间来改善运行时

2011-03-13 10:23:00 3797

原创 快速排序中的堆栈深度

7-4 快速排序中的堆栈深度    7.1节中的QUICKSORT算法包含有两个对自身递归调用。在调用PARTITION后,左边的子数组和右边的子数组分别被递归排序。QUICKSORT中第二次递归调用并不是必须的;可以用迭代控制结构来代替它。这种技术称作尾递归,对多数的编译程序都加以了采用。考虑下面合格快速排序的版本,它模拟了尾递归:QUICKSORT'(A, p, r)1  while p 2        do ▸ Partition and sort left subarray.3          

2011-03-10 11:19:00 7274 7

原创 Stooge排序

7-3 Stooge排序    Howard、Fine等教授提出了下面的“漂亮的”排序算法:STOOGE-SORT(A, i, j)1 ifA[i] >A[j]2      then exchange A[i] ↔A[j]3 ifi + 1 ≥j4      then return5 k←⌊(j - i + 1)/3⌋                ▹ Round down.6 STOOGE-SORT(A, i, j - k)     ▹ First two-thirds.7

2011-03-09 21:47:00 4015 1

原创 Young氏矩阵

6-3 Young氏矩阵    一个m x n的Young氏矩阵(Young tableau)是一个m x n的矩阵,其中每一行的数据都从左到右排序,每一列的数据都从上到下排序。Young氏矩阵中可能会有一些∞数据项,表示不存在的元素。所以,Young氏矩阵可以用来存放r≦mn个有限的数。    a)画一个包含元素{9,6,3,2,4,8,5,14,12}的4 x 4的Young氏矩阵。    b)讨论一个m x n的Young氏矩阵,如果Y[1,1]=∞,则Y为空;如果Y[m,n]    c)给出一个在非

2011-03-09 16:32:00 11362 10

原创 d叉堆

6-2 对d叉堆的分析    d叉堆有与二叉堆很类似,但(一个可能的例外是)其中的每个非叶结点有d个子女,而不是2个。    a)如何在一个数组中表示一个d叉堆?    b)含n个元素的的叉堆的高度是多少?    c)给出d叉最大堆的EXTRACT-MAX的一个有效实现,并用d和n表示出它的运行时间。    d)给出d叉堆的INSERT的一个有效实现,并用d和n表示出它的运行时间。    e)给出INCREASE-KEY(A, i, k)的一个有效实现,该过程首先执行A[i]分析与解答:    类似于二叉堆

2011-03-08 20:57:00 5497 6

原创 逆序对

2-4 逆序对      设A[1...n]是一个包含n个不同数的数组,如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。       a)列出数组的5个逆序对       b)如果数组的元素取自集合{1,2,...,n}, 那么, 怎样的数组含有最多的逆序对?它包含多少个逆序对?       c)插入排序的运行时间与输入数组中逆序对的数量之间有怎样的关系?说明你的理由。       d)给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的个数。(

2011-03-07 22:07:00 9000 7

原创 树消除算法

树消除算法:1)以每个cluster为根,分别进行叶子至根的消息计算2)每条边(C1,C2)上有两个消息:   和  3)消息计算的先后顺序

2011-01-10 17:20:00 1692 2

原创 xv6磁盘驱动及缓存

前面的博文中详细讲述了xv6的文件系统,其中使用位图块来进行磁盘block的 管理,但是对于block内容进行读写则需要更底层的磁盘驱动程序,同时考虑到磁盘读写的速度非常慢(相对于内存读写),因此我们有必要对磁盘的数据块进行缓存。    整个磁盘的缓存是采用类似对象池(object Pool)的框架来实现的。对于每个磁盘block,对应一个对应的数据结构buffer,具体如下:truc

2011-01-03 23:42:00 2482 4

原创 xv6文件系统详解

<br />xv6文件系统由inode组成,每个inode是单个未命名的文件。整个磁盘读写的最小单元为block (xv6为512字节),其中整个磁盘分布如下图<br /> <br />第0个block为启动区,第1个block为超级块 (也是根目录所在的块),接下来是连续分布的dinode,最后是连续分布的BPB(块位图)<br />假设块大小为BSIZE, 则<br />1. 每个块包含的dinode结构体的数量为: IPB = BSIZE/sizeof(dinode)。等价于第i个dinode所在的b

2011-01-03 16:51:00 11810 7

原创 xv6自旋锁

     在多核和多线性的系统中,需要注意访问安全,即需要考虑不同的CPU和多线程之间因竞争而存在的互斥关系。比如下面的例子:1 struct list {2 int data;3 struct list *next;4 };56 struct list *list = 0;78 void9 insert(int data)10 {11 struct list *l;1213 l = malloc(sizeof *l);14 l->data = da

2011-01-02 11:00:00 3005 5

原创 xv6引导及初始化详解

<br />    了解xv6的引导及初始化部分格外重要,因为它奠定了整个xv6操作系统的基础和框架。<br /> <br />按照执行的顺序,整个引导及初始化的基本流程如下:<br /> <br />bootasm.S<br />     处于实模式,设置并加载gdt、使能A20、设置PE,从16bit代码段跳转到32bit保护模式代码段 (bootmain) 开始执行。<br />--------------------------------------------------------------

2010-12-27 17:18:00 4974 1

原创 xv6内存布局详解

  欲了解xv6整个操作系统源码,那么内存布局就是不二法门。在Makefile中涉及到代码链接地址的地方如下:bootblock: bootasm.S bootmain.c $(LD) $(LDFLAGS) -N -e start -Ttext 0x7c00 -o bootblock.o bootasm.o bootmain.o作用:引导代码放在第0扇区,链接到0x7c00。BIOS自检后会跳转到这个地址执行,并将控制权交给操作系统bootother: bootother.S   $(LD) $(LDFLA

2010-12-27 15:42:00 3522

原创 gdb调试命令

start: 启动r: 直接运行break n: 在第n步设置断点n: 下一步(不进入函数)l n: 从第n行开始列出10行代码s:  代码单步(进入函数)si: 指令单步i locals: 查看局部变量i registers: 查看寄存器p $esp: 打印变量disassemble: 反汇编bt:查看各级函数调用及参数

2010-10-24 15:30:00 904

原创 并查集及其链表与不相交集合森林实现

在需要判断两个对象是否属于同一集合的应用时,并查集是一种非常有效的数据结构。并查集具有MAKE-SET,FIND-SET,UNION三个基本操作。定义一个具有m个MAKE-SET,FIND-SET,UNION(其中n个MAKE-SET操作)的操作序列。这个操作序列中UNION的操作次数不多于n-1(因为每次UNION都会使集合数减少1)。      采用链表是实现并查集的一种非常便捷的方式。每

2010-10-13 21:06:00 2806 4

原创 读写U盘(FAT32)引导扇区

<br />       看了《自己动手写操作系统》后,也想自己打造一个迷你操作系统,但是书中使用的软盘现在基本已经绝迹了,而U盘成为一种喜闻乐见的工具。因此想将操作系统写入U盘中,而读写U盘的引导扇区成为成功的关键。<br />       将U盘格式化为FAT32文件系统,要读写U盘的引导扇区,需要首先了解FAT32的格式。它包含四个部分:<br />保留扇区 | FAT1 | FAT2 | 数据区。需要注意的是:保留扇区的第一个扇区是引导扇区(DBR)。<br />其中引导扇区的数据结构为:<br /

2010-09-28 22:31:00 17401 24

原创 DPL,RPL,CPL特权级别

DPL,RPL,CPLDPL放在段/门描述符中,RPL位于选择子中,CPL即装载选择子的CS的可见部分的CS.RPL数据段:数据段总是一致段,访问数据段需要满足max(RPL,CPL)

2010-09-14 11:13:00 1855

原创 搭建android开发环境

<br /><br />第一步,安装java JDK<br />  jdk-6u21-windows-i586.exe<br />  (1)设置JAVA路径<br />       在“我的电脑”上点右键,选“属性”,打开“系统属性”对话框,点“高级”选项卡,再点“环境变量”按钮,在打开的对话框中的“系统变量”下方,点 “新建”       ,然后在对话框中的“变量名”中填JAVA_HOME,在“变量值”中填C:/Java/jdk1.6.0_20,点“确定”。<br /> <br />  (2)设置CLAS

2010-09-04 15:06:00 799

OpenCV2.0开发包

最新的OpenCV2.0开发包,是在SourceForge上下载源代码,采用Cmake亲自编译出来的,包含include、lib、bin目录,并同时有debug、release版本.这个开发库支持VS2005,非常好用,推荐下载!

2010-04-05

OpenCV2.0 最新的opencv开发包

这是最新发布的opencv开发包,包含需要的h,lib,dll文件,并同时含有debug和release版本,推荐下载!

2009-11-09

pcre正则表达式库

著名的pcre正则表达式库,功能非常强大,优化性能好,速度快,推荐使用!

2009-11-09

SDL自由的跨平台的多媒体开发包

包含SDL开发的全套工具包,以及相应的资料,非常好用!

2009-11-09

GMP高精度浮点大数库

高精度数浮点大数库,包含大整数库,任意精度浮点库,效率很高

2009-11-06

fftw快速傅里叶变换库

世界上最快的快速傅里叶变换库,著名的MIT开发的,据说MATLAB 就是采用的这个类库。它包含一维和二维的实数和复数的傅里叶变换,非常好用!

2009-11-05

空空如也

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

TA关注的人

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