存档

‘计算机’ 分类的存档

《编程之美》2.20程序理解和时间分析

2010年9月1日 madongfly 1 条评论

最近在看《编程之美》,为找工作面试做准备。该书中2.20程序理解和时间分析一题没有给出解答,所以简单写一下我自己的答案。

题目如下:
阅读以下C#代码,回答问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Text;
 
namespace FindTheNumber
{
     class Program
     {
          static void Main(string[] args)
          {
               int [] rg =
               {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
               18,19,20,21,22,23,24,25,26,27,28,29,30,31};
 
               for(Int64 i = 1; i < Int64.MaxValue; i++)
               {
                    int hit = 0;
                    int hit1 = -1;
                    int hit2 = -1;
                    for (int j = 0; (j < rg.Length) && (hit <= 2); j++)
                    {
                          if((i % rg[j]) != 0)
                          {
                               hit++;
                               if(hit == 1)
                               {
                                    hit1 = j;
                               }
                               else if (hit == 2)
                               {
                                    hit2 = j;
                               }
                               else
                                    break; 
 
                          }
                    }
 
                    if((hit == 2) && (hit1 + 1 == hit2))
                    {
                          Console.WriteLine("found {0}", i);
                    }
 
               }
          }
     }
}

1> 这个程序要找的是符合什么条件的数?
2> 这样的数存在么?符合这一条件的最小的数是什么?
3> 在电脑上运行这一程序,你估计要多长时间才能输出第一个结果?时间精确到分钟(电脑配置:单核CPU2.0GHz,内存和硬盘资源充足)

我的解答:

阅读全文…

《CSAPP深入理解计算机系统》读后标记

2010年8月30日 madongfly 5 条评论

陆陆续续花了一个月的时间,终于看完了CSAPP(Computer System:A programmer‘s perspective 注:第二版已出:英文版 中文版),头一次看那么厚(900页)的原版书,看完还是有一点点成就感的。

从同宿舍的鲁博士那里第一次听说这本书,了解到该书从一个程序员的视角详细剖析了整个计算机系统,涵盖了组成原理、汇编语言、体系结构、操作系统、网络等计算机基础知识,当时就决定找工作之前一定要看看这本书,现在终于搞定,也算是间接复习了一下前述几门课程。

这次阅读用的是鲁博士的书,再次印证了买来的书没有借来的书看得彻底的“真理”……

在阅读过程中,对该书的各个章节做了一些标注,以备将来重新翻阅的时候参考。这些标注主要从两个角度进行,一是对我找工作应试(包括笔试和面试)有没有用,二是对我自身的技术提高有没有用,所以分为应试和修炼两个指标,参照流行的打分标准将其分为从★到★★★★★五个等级。现记录如下:
阅读全文…

计算机中浮点数的舍入

2010年8月6日 madongfly 2 条评论

学过计算机组成原理的同学都知道在计算机中,浮点数是通过3个部分来表征的,1个bit的符号位,k个bit的指数位和n个bit的有效数位,对于C语言中的float和double,k、n值分别是8、23和11、52。

我们可以想象一下,表征浮点数的bit是有限的,因而其组合也是有限的,是无法完全表征所有实数的,事实上,连一些10进制下看上去很简单的数也都无法精确表示。比如,你可以试一下下面几行代码:

1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
	double a = 0.1;
	printf("%.20lf",a);
	return 0;
}

你会看到输出的其实是0.10000000000000001000。

正是由于很多实数无法精确表示,所以在计算机处理浮点数的时候,需要进行大量的舍入操作,那么计算机默认是采用什么样的舍入策略呢?

以前我一直以为计算机采用的就是人们日常所熟悉的“四舍五入”法则,因为在printf函数中,如果指定输出精度小于实际精度的话,输出的结果就是按四舍五入产生的。其实这是printf函数故意设计成这样以符合人们的日常习惯的。

实际计算机中,当需要进行舍入操作时,运用是一种叫“round-to-even”的策略,即“向偶数舍入”,举个简单的例子就可以明白了,比如1.235和1.245,舍入后都是1.24, 也就是说要使得舍入后的最后一位有效数字是偶数。

为什么要采用这样的策略,而不直接使用我们已经习惯的“四舍五入”呢。原因在于,在进行舍入的时候,最后一位数字从1到9, 舍去的有1,2,3,4;正好可以和进位的9,8,7,6相对应,而5却被单独出来了,如果我们采用四舍五入每次都将5进位的话,在进行一些大量数据的统计时,就会累积比较大的偏差,而如果采用”round-to-even”的策略,在巨大多数情况下,5舍去还是进位的几率差不多,统计时产生的偏差也就相应要少一些了。

快速看懂简单perl代码

2010年7月28日 madongfly 没有评论

最近在实现PLSV,写了一个matlab的版本,效果却远没有原作者论文上说的好。

给作者发信索要代码,答曰:本人已在公司工作,出于保密,不能给你代码,不过在这个网页(需翻墙)上有别人写的代码,你可以看一看。

看了那个blog上的代码,是一个日本人写的perl代码,一看代码风格很严谨,遂认为是精品,于是慢慢品读,但因为我是头一次读perl的代码,所以边看边查,做了一点记录。

代码太长,附在文章最后吧,先是我做的一点记录:


#!/usr/bin/perl
这一行是Linux类系统下脚本的第一行,指定脚本执行环境,python也有。

use
导入模块,类似java的import

定义变量,直接使用一个$符号,比如$a,就表示定义了一个名为a的标量。这个不管是int,float,string,char……一律使用这个表示。
定义数组,直接使用符号@,比如@array,表示定义一个名为array的数组。基本上和上面的差不多,但是perl中好像是没有直接的二维数组的定义。
定义Hash,使用符号%,比如%hash,表示定义一个名为hash的哈希结构。哈希结构基本上在前期用的不多,在后面的时候,可以和数组组合成比较强大的结构体。
阅读全文…

用Java自己实现链表

2010年4月22日 madongfly 1 条评论

先再次感叹一下自己的Java没学好……

以前本科上Java课的时候,记得最清楚地一件事就是Java里没有指针,当时曾经疑惑过,那怎么用Java写链表呢。但是也没有深想,后来要用到也是一直用像List,vector这样的现成结构。

直到最近用Java用得比较多,才逐渐搞清楚了Java中对象引用的概念,于是想到其实可以通过对象引用实现链表。写了个小程序测试一下,果然OK。
阅读全文…

分类: 程序设计 标签: ,

JDOM操作xml以及Java中的动态类加载

2010年3月25日 madongfly 没有评论

这是最近的一个需求:

有一个算法库,里边的每一个算法是一个类,并且都有公共的入口函数,需要根据一个定义好的xml文档,依次执行指定的算法。

这里用到了两个以前不会的知识,一个是xml文档的处理,另一个是类的动态加载。

通过搜索,最后采用JDOM对xml进行操作,通过Java的reflect机制进行动态类加载,现记录如下:

xml的文档定义如下:

< ?xml version="1.0" encoding="gb2312"?>
<jobs>
	<algorithm name = "pdm.filters.PDAttributeExchange">
		<setting>
			<set name="jobPriorityType"></set>
			<set name="numOfMapTasks"></set>
			<set name="numOfReduceTasks"></set>
		</setting>
		<input />
			<header>/home/maxd/data/3d.header.arff</header>
			<data>maxd/input</data>
 
		<output>
			<header>maxd/xmloutputheader/3d.header.arff</header>
			<data>maxd/xmloutput</data>
		</output>
		<arguments>
			<arg name="attributeField1">A1</arg>
			<arg name="attributeField2">A3</arg>
		</arguments>
	</algorithm>
</jobs>

处理代码如下:
阅读全文…

分类: 程序设计 标签: ,

Hadoop部署

2010年1月19日 madongfly 没有评论

最近在自己的机器上部署了Hadoop0.18,在这里记录一下过程:

操作系统使用CentOS 5

每一步后面括号中标明操作的对象,“对所有节点”是在所有节点上都执行一次。“对主节点”只需按要求在主节点执行即可。

1.安装JDK(对所有节点)

在网上下载JDK程序包。
这里以jdk1.5.0_14为例,并安装在/home目录下。

2 安装Hadoop(对主节点)

在http://www.apache.org/dist/hadoop/core下载Hadoop,选择一个版本,例如:hadoop-0.18.3.tar.gz,安装至/home目录下。

3配置Hadoop配置文件(对主节点)

这里假设有三台机器,主节点10.63.0.51,从节点10.63.0.52和10.63.0.53。多台机器的配置可依此类推。
在/home/hadoop-0.18.3/conf下,配置hadoop-site.xml文件如下:
阅读全文…

分类: 并行化 标签: , ,

Linux下安装部署CVS服务器

2010年1月15日 madongfly 没有评论

最近在CentOS5.0下安装配置好了CVS,在这里记录一下。

很多用户在装Linux的时候可能已经装上了CVS,可以直接跳到第二步。通过命令:
#rmp -qa | grep cvs
如果有cvs的版本信息的话,就表明已经装上了。否则先安装CVS

1.安装CVS

到CVS官方站点下载安装包,如cvs-1.11.18-cvshome.org.9x.1.i386.rpm

安装之:rpm -ivh cvs-1.11.18-cvshome.org.9x.1.i386.rpm

2.检查/etc/services文件
确保该文件中有如下两行,没有就加上:
cvspserver 2401/tcp # cvs client/server operations
cvspserver 2401/udp # cvs client/server operations
阅读全文…

分类: 操作系统 标签: ,

putty 中文乱码问题

2010年1月12日 madongfly 没有评论

其实很久以前就发现这个问题了,用putty访问远程主机的时候中文会显示乱码,但是一直将就着用,最近因为用的次数太多,实在是忍受不了了,才找了一下,原来还是很好设置的,记录一下:

在 window – appearance -font settings -change中选择一种中文字体,比如新宋体,字符集选CHINESE_GB2312,在 window – translation-Received data assumed to be in which character set ,设置为UTF-8。

另外,关于putty的粘贴复制,在putty中鼠标右键就是粘贴,用鼠标拖选之后就已经复制了。

分类: 操作系统 标签:

MapReduce入门程序WordCount增强版

2009年12月19日 madongfly 2 条评论

WordCount程序应该是学习MapReduce编程最经典的样例程序了,小小一段程序就基本概括了MapReduce编程模型的核心思想。

现在考虑实现一个增强版的WordCount程序,要求:

  • 提供大小写忽略的选项。
  • 在原始串中,过滤掉一些内容,例如要过滤hexie,那么单词hexieshehui就作为shehui统计。第一个很好实现,只需要在map函 数里判断一下要不要toLowerCase()即可。第二个也很好实现,将需要过滤的内容组合成一个长字符串,通过JobConf设置即可,但是如果需要 过滤的参数很多,多到需要从DFS上的文件里读取呢。显然,我们可以在map函数里直接读取DFS上的文件,但是这并不是最优的办法,Hadoop的官方 文档提供的WordCount2.0给了一个很好的办法。该代码还包括了其他一些很有用的技巧,让我们来好好分析一下吧。:)

阅读全文…

分类: 并行化 标签: ,