编程珠玑笔记(12)-节省空间

  本章涉及到两个问题,其一是数据空间技术,目标是减少程序所需数据的存储空间;其二是代码空间技术,目标是减少执行期间保存程序时所用的内存。

数据空间技术

  不存储,重新计算。 如果我们在需要某一给定对象的任何时候,都对其进行重新计算而不保存,那么保存该对象所需的空间就可以急剧地减少。此方法牺牲更多的运行时间来换取更少的空间。这种方法只适用于需要“存储”的对象可以根据其描述重新计算得到的情况。

  对于许多跨网络运行的程序来说,在数据规模方面我们最关心的是传输数据需要花费的时间。有时我们会采纳“保存、不进行重新传输”的建议,通过本地缓存的方式减少需要传输的数据量。

  稀疏数据结[……]

Read more

在Linux系统下建立文件系统并挂载

  好多同学都在自己的电脑上使用Linux+Windows的双系统组合,在安装新Linux系统的时候,如何给新的系统分区,每个分区多大空间是个让人纠结的问题。我通常的做法是给Linux一个20GB的分区挂载根目录,对于Home的位置,则一起设置在里面。但常见的用户文件则另外建立一个文件系统存放,并将这个系统挂载在某一目录下(如/home/linhan/share)。这样每次因为特殊的原因重装系统时这些个人文件就可以保存下来,只需要进行一次挂载操作就可以了,还是十分方便的。而且因为这个文件系统实际上是一个大文件,所以在不同电脑间迁移也不麻烦。接下来我就这一做法稍作总结。

1.创建文件

dd[......]

Read more

OpenGL编程学习(3)-多边形填充函数和顶点数组

  • OpenGL多边形填充函数

矩形函数

  glRect* (x1, y1, x2, y2);

  星号(*)代表的后缀可以是i(整数)、s(短整数)、f(浮点型)、d(双精度浮点)、v(向量)。矩形的边平行于坐标轴,多边形的边按照顶点序列(x1, y1)、(x2, y1)、(x2, y2)、(x1,y2)来形成,然后返回到第一顶点(x1, y1)。

6种不同的符号常量下的图元填充函数
  GL_POLYGON可以产生单个多边形,一个多边形的顶点集至少包含三个顶点,否则什么也不显示。
  GL_TRIANGLES可以显示分开的三角形区域:最开始的3个坐标定义第一个三角形的[……]

Read more

OpenGL编程学习(2)-画点画线函数

  • OpenGL画点函数

  OpenGL图元默认大小为一个像素单位,默认颜色为白色。画点函数为:
  

glVertex* ();

  星号(*)说明该函数要有后缀码。一般来说,会有2到3个后缀码。第一个后缀码代表维数,二维、三维、四维坐标分别用2、3、4等数字表示。第二个后缀码代表坐标的数值类型,如i(整数)、s(短整数)、f(浮点)、d(双精度浮点)等。glVertex中可以使用显式的坐标值或引入矩阵形式坐标位置的单个变量,此时需要第三个后缀:v(向量)。

  下面例子在斜率为2的直线上绘出了三个等距离的点。

  glBegin(GL_POINTS);
  [......]

Read more

编程珠玑笔记(11)-代码调优

  在本章的第一部分,作者通过一个具体事例引出了代码调优的主题,也交代了调优的基本步骤:监视程序的性能-研究时间占用最多的代码段/函数-针对具体的代码段进行改进。在这个事例中,占用运行时间最多的是malloc函数,最终的改进方法是利用高速缓存优化。

  在第二部分,作者通过连续4个问题进一步阐述了代码调优的具体做法。

  问题1——整数取模。 这个问题来自第2章向量旋转的“杂技”算法:

  k = ( j + rotdist ) % n;

C语言中取模运算开销较大,下面的代码可能会减少程序的运行时间:

  k = j + rotdiat;
  if (k > n)
  [......]

Read more

清除Linux用户密码

  本文介绍两种方法清除Linux用户的密码。清除密码的前提是,机器就在你手边,可以随意重启。文中介绍的方法都经过测试,但随着操作系统的发展,具体的操作方式可能会发生变化,所以重要的是提供两种思路供参考。

  • 利用单用户模式

1.进入root shell,有两种方法。其一是在GRUB选项中选择Recovery Mode(恢复模式),进入子菜单后选择“root”项启动root shell。其二是在GRUB相应选项上按e键进入编辑界面,在“linux /boot/… … root=… quite …”一行(有的是“kernel”一行)中加入“single”选项,也可以用数字“1[……]

Read more

C语言中常见的随机函数和计时函数

  本来想系统地总结一下C语言中随机函数和计时函数的使用,因为在平时测试算法时经常用到。但简单调研之后发现水还是有点深度,所以就只把我用过证明可行的整理一下。在大多数情况下,我想这也一定足够了。

  • rand()函数产生随机数

  rand()函数产生的实际上是“伪随机数”(我没有听说迄今有哪个算法能产生真正的随机数),这个数是一个在区间[0, RAND_MAX]之间的整数,其中的上界是一个宏定义,其与rand()函数都定义在“stdlib.h”中。

  stdlib中随机数的一个可能实现如下:

#define RAND_MAX 0x7fff 
unsigned long int n[......]

Read more

OpenGL编程学习(1)-引言

  已经是第二个学期学习计算机图形学了,本科的时候叫“计算机图形学”,现在叫“高级计算机图形学”。但由于学习态度不甚端正,加上本人实在是才疏学浅,所以对OpenGL编程的理解总是局限于细枝末节,每次要写程序实验才搬起书来一个一个找函数,凑成一个“紧急集合”似的程序。

  由于本人也在渐渐领悟“知行合一”的珍贵教诲,也希望能在研究生阶段多多总结自己的学习之路,以期有更多的收获并发扬光大之。今天开始整理OpenGL的学习内容,以后还可能整理一些其他的东西(比如CUDA编程,我也已经在写《编程珠玑》的读书总结)。

  主要参考书是 计算机图形学(第三版)(豆瓣)

  闲话少表,下面就开始。本[……]

Read more

编程珠玑笔记(10)-算法设计技术

  在这一章中,作者对同一个问题依次介绍了4种不同时间复杂度的算法,算法的执行速度依次变得更快。据此阐述了作者的(其实也是被普遍认同的)一个观点:复杂深奥的算法有时可以极大地提高程序性能。(纵然在体系结构领域结论往往是相反的。)

  • 问题

  来自一维模式识别的问题。问题的输入是具有n个浮点数的向量x, 输出是输入向量的任何连续子向量中的最大和。(返回的是和的值,不必返回起始下标值。)
  当所有数都是正数时,最大的子向量就是整个输入;当所有输入都是负数时,总和最大的子向量为空向量,其总和为0。

  • 简单算法

  对所有满足0 ≤ i ≤ j ≤ n 的 (i,[……]

Read more

专业摄影师的人像拍摄秘诀

  • 先对人物的眼睛锁定对焦,然后构图
  •   如果你想在拍摄人像的时候锁定对焦,那人物眼睛的对焦应该是绝对清晰的。如果没有对焦到眼睛上,画面中的其他元素都会失色不少,所以要把好钢用在刀刃上。
      使用技巧是:(1)把液晶显示屏上的对焦点直接对准最靠近相机的那只眼睛。(2)半按快门,把对焦锁定在眼睛上。(3)保持半按快门,按需要重新构图。现在,当完全按下快门后,焦点就会落到刀刃上了。
      但如果用超大光圈(f/1.4或f/1.8)拍摄,就不要这样做,因为景深太浅的缘故,重新构图也会失焦。此时应先构图,然后手动对焦到人的眼睛上。
      

  • 只有摄影师才会在乎的眼神光
  •   眼神光就是光源在拍摄对象眼睛上形[……]

    Read more