• 博客开通了,标记一个:) a new start [2007-12-29 13:53]
    共1页 1
  • 不用临时变量,交换两个数的值

    2009-04-19 16:15:01 by deepblue

    有两个整型变量a,b,如何在不使用其他临时变量的情况下交换a,b的值?可能这个问题大家都非常熟悉了吧。

    以前我用的是这个方法:

    a=a+b;
    b=a-b;
    a=a-b;

    其实下面这种方法由于是用的位运算,因此效率更高:

    a=a^b; (1)
    b=b^a; (2)
    a=a^b; (3)

    其中,^为位运算的异或运算。证明这个结论也很简单,为了表述得清楚,我们令原始值分别为a,b,计算过程中产生的新值为a_new,b_new。

    由(1)得:a_new=a^b,即此时变量a中的值等于a_new。而(2)中,等式右边的a的值实际上已经等于a_new了,因此,由(2)得b_new=b^a_new=b^a^b。我们知道,异或运算满足交换律和结合律,因此进一步可以得到:b_new=b^a_new=b^a^b=b^b^a=0^a=a,即变量b的值变成了b_new,也就是变量a的原始值。在(3)中,等式左边变量a和b的值实际上已经等于a_new和b_new了,令等式左边的a为a_final,因此可以得到a_fianl=a_new^b_new=a^b^a=a^a^b=0^b=b,即变量a的值最终等于a_final,也就是变量b的原始值。至此,变量a,b的原始值完成了交换。

  • Catalan数

    2009-04-15 13:48:31 by deepblue

    今天才知道Catalan数这个东西。。。汗~,赶紧在网上查了资料补补课。

    令h(1)=1,catalan数满足递归式:

    h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2)

    即:

    Catalan数递推公式

    Catalan数的通项公式为:

    Catalan数通项公式

    该公式的推导过程可以看参考资料[2]的内容,在此不再累述。

    我还看到有人争论Catalan数的通项公式应该是这样的:

    Catalan数通项公式2

    其实这两个公式本质是一样的,公式(1)是以h(1)=1为起始项,而公式(2)是以h(0)=1为起始项。

    关于Catalan数的应用可以参考这里

    这里举个应用Catalan数的例子:n个节点能组成多少种形态的二叉树?(注:每个节点相同;形态不同的左右子树对调后形成的二叉树算新的形态的二叉树)

    可以分析,当n=1时,只有1个根节点,则只能组成1种形态的二叉树,令n个节点可组成的二叉树数量表示为h(n),则h(1)=1;

    当n=2时,1个根节点固定,还有n-1个节点,可以作为左子树,也可以作为右子树,即:h(2)=h(0)*h(1)+h(1)*h(0)=2,则能组成2种形态的二叉树。这里h(0)表示空,所以只能算一种形态,即h(0)=1;

    当n=3时,1个根节点固定,还有n-1=2个节点,可以在左子树或右子树,即h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=5,则能组成5种形态的二叉树。

    以此类推,当n>=2时,可组成的二叉树数量为h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)种,即符合Catalan数的定义,可直接利用通项公式(2)得出结果。

     

    参考资料:
    1.Catalan数,http://baike.baidu.com/view/1163998.htm
    2.Catalan数的分析和应用,http://blog.csdn.net/dlyme/archive/2008/06/10/2532831.aspx

  • 后台无界面启动VMWare中的虚拟系统

    2009-03-19 15:05:24 by deepblue

    我现在用的VMWare版本是Workstation 6.5,安装了一个虚拟系统Ubuntu8.04,寄主系统是WinXP SP3。由于现在的任务不需要在图像界面下工作,我每次启动后都选择关闭Workstation的图形界面,并保持虚拟系统在后台运行,然后在寄主系统上通过Putty连接到Ubuntu。尽管VMWare已经提供了使客户系统在后台运行的功能,可每次打开图形界面再关闭的过程很烦很无聊,于是想要找到一种直接在后台启动客户系统的方法。

    查了查资料,发现原来VMWare Workstation6.5已经提供了一个命令行工具:VMRun,可以通过给它一定的参数实现指定虚拟系统的后台启动。

    将该命令写入一个批处理文件,点击运行即可实现虚拟系统的后台启动。批处理命令如下:

    "C:\Program Files\VMware\VMware VIX\vmrun.exe" start "G:\VirtualOS\Ubuntu.vmx" nogui

    其中红色部分为命令行工具vmrun.exe,蓝色的start为vmrun.exe的参数,这里表示启动系统;"G:\VirtualOS\Ubuntu.vmx"则为我的虚拟系统在寄主系统上的vmx文件路径;最后的nogui表明不启动图形界面。

    若希望虚拟系统在寄主系统启动后自动启动,可将该批处理文件加入寄主系统的启动选项中或添加为计划任务。

    通过为vmrun.exe传递不同的参数可以实现不同的功能,如关闭系统、运行程序等。在命令行中直接输入vmrun,不带参数,即可查看其帮助文档。

  • Linux高级权限管理:ACL用法简介

    2009-03-18 23:11:22 by deepblue

    前段时间,在Linux上设置一个目录的访问权限时,发现通过简单的chmod操作不能满足自己的需求,

    问题:如果用root帐号创建了一个目录DIR,有A,B,C,D四组用户,我想给A组用户读写执行的权限(rwx),给B组用户读写的权限(rw-),给C组用户读的权限(r--),不给D任何权限(---),要如何实现?

    UGO的局限性

    通常大家熟悉的是UGO的权限管理方式(User, Group, Other),即对一个文件的所有者,所属组和其他用户来分别设置该文件的读写执行权限。对于简单应用来说,这种粗粒度的权限管理方式已经够用了,设置起 来也很方便。然而,当我们需要对某个文件进行较复杂详细的权限设置时,UGO方式就显示出了其局限性。

    如,对于本文开始所提出的问题,需要为四组不同用户设置对目录DIR的不同访问权限,而UGO方式只能对目录的所有者,所属组,以及其他用户设置不同权限,即最多只能设置3种不同权限,还不能对多个不同用户分别设置。

    ACL则很好的满足了这样的需求。

    ACL简介

    ACL,全称Access Control List,即文件/目录的访问控制列表,可以针对任意指定的用户/组分配rwx权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对 ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL[1]。顾名思义,ACL将用户对一个文件访问权限就像是放在了一个列表里,列表的每一项分别对应了一个或一组具体用户对该文件的特定访问权限。这就使任意的访问权限管理成为了可能。

    下面我们来看看如何通过ACL进行详细的文件访问权限管理......

  • 数据标准化方法总结 [Data Normalization]

    2009-03-04 14:19:40 by deepblue

    在分析实验数据的时候,往往需要对数据进行标准化[normalization],即将实验数据的取值转换到某一指定的范围,如[-1,+1], [0,1]等,以便进一步分析数据的特性。

    下面对数据标准化的常用方法进行了介绍:

    Min-max normalization

    min-max标准化方法是对原始数据的线性变换。设minA和maxA分别为属性A的原始值中的最小值和最大值,将属性A的一个原始值v通过min-max标准化映射成在区间[new_minA, new_maxA]中的值v'的计算方法是:

    若新的取值区间是[0,1],则公式可简化为:

    min-max标准化方法保留了原始数据之间的相互关系,但是如果标准化后,新输入的数据超过了原始数据的取值范围,即不在原始区间[minA, maxA]中,则会产生越界错误。因此这种方法适用于原始数据的取值范围已经确定的情况。

    z-score normalization(zero-mean normalization)

    这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。将属性A的原始值v使用z-score标准化到v'的计算方法是:

    其中是属性A原始值得均值,是属性A原始值的标准差。标准差即为方差的平方根。方差的计算公式如下:

    z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。

    Decimal scaling

    这种方法通过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。将属性A的原始值v使用decimal scaling标准化到v'的计算方法是:

    其中,j是满足条件的最小整数。

    注意,标准化会对原始数据做出改变,因此需要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化。

    参考资料:
    1. Data Mining: Concepts and Techniques, Jiawei Han and Micheline Kamber, 2006

  • TIOBE编程语言2008年5月排名

    2008-05-18 01:12:27 by deepblue

    TIOBE编程语言排名基于世界范围内使用该语言的技术人员数量、进程和第三方支持,并使用主流搜索引擎如Google、MSN、Yahoo和YouTube等来计算出该语言的rating。该排名每个月更新一次。

    2008年5月各主流编程语言排名如下:

    编程语言排名

  • 编程语言类型划分

    2008-04-16 00:49:03 by deepblue

    看到《Dive Into Python》中提到的编程语言类型划分,解释得很清楚:

    静态类型语言

       一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C是静态类型语言。

    动态类型语言

       一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。

    强类型语言

       一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。

    弱类型语言

       一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在VBScript 中,您可以将字符串 '12' 和整数 3 进行连接得到字符串'123',然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。

     

  • Ruby的单态方法

    2008-01-18 01:24:29 by deepblue

    今天在看Ruby的一个教程的时候,看到了Ruby的一个比较特别的地方,即单态方法。

    所谓单态方法,其实是对类方法的重载,但与Java,C++重载不同的是,Ruby这种重载是面向具体对象的,也就是说对某一个对象的方法进行重载,而该类的其他对象相同的方法不变。

    class Test

      def say

        print "I'm old test\n"

      end

    end

    test1=Test.new

    test2=Test.new

    def test2.say

      print "I'm new test\n"

    end

    test1.say

    test2.say

    运行结果为:

    I'm old test

    I'm new test

    由上面的例子可以看到,虽然test1和test2是同一个类的对象,但由于对test2的say方法进行了重载,导致test1和test2的say方法执行结果完全不同。

    教程中说“单态方法常常用于图形用户界面(GUI)的元素的设计,在那里当不同的按钮被压下时将会激发不同的事件” ,但是单态的方法是否会破坏类的一致性呢?OO思想强调的就是封装性和一致性,而Ruby这种单态的方法导致类的每个对象对于同一个方法,都可以自己定义不同的实现,这会不会造成类的混乱?用参数来控制方法的执行是否更好?或者是通过派生子类的方法来重载父类的方法,从而实现子类的特殊功能,而不是对具体对象进行改变?

    以上都是我对单态方法的一些疑问,不过Ruby的这个特性到底有多大用处,还得在实际应用中验证。