C/C++中的格式化IO

 PUBLISHED ON April 12, 2015

C/C++中的格式化IO操作(输入、输出)使用非常灵活,但C/C++语言标准中复杂的关于格式化IO的定义也很让人头疼。接下来,将系统地讨论C/C++定义的格式化字符串,以及在使用格式化输出时容易出现错误的地方。

格式化字符串的定义

格式化参数以一个字符串的形式定义了输入/输出的格式,例如类型、宽度、进制,等等,标准格式化字符串的定义:

%[flags][width][.precision][length]specifier


Scala 入门笔记

 PUBLISHED ON March 28, 2015

Scala初学笔记。

Hello World in Scala

学习Scala的语法,还是从Hello World开始吧:

object HelloWorld {
  def main(args: Array[String]) {
    print("Hello World, Scala!")
  }
}


Mathematica 求根与求最值

 PUBLISHED ON March 23, 2015

Mathematica具有强大的数值计算系统,可以用来进行求解方程的根、对函数求最值等数值计算操作。与求根和求最值的相关操作如下:


Java对象初始化机制

 PUBLISHED ON March 23, 2015

在Java里,对象的初始化工作主要由构造函数完成,除此之外,静态初始化和实例初始化会完成另外一部分初始化工作。

构造函数初始化

类的构造函数承担类的实例化工作,Java中,每次使用new来创建一个新的对象时,都会调用对象的对应参数类型的构造函数。

Java中,构造函数的定义如下:

A constructor is used in the creation of an object that is an instance of a class.

文档


Java继承中的小细节

 PUBLISHED ON March 23, 2015

Java继承机制是其Object-Oriented特性之一,使用继承extends时有很多需要注意的容易出错的小细节。例如,构造函数的调用顺序和规则、

构造函数

首先从构造函数说起。

对于一个类,如果没有显式定义构造函数,那么便有一个无参的默认构造函数。但是,一定自己定义了构造函数(无论有没有参数),就都只能使用自己定义的构造函数。

继承时,如果子类没有显式定义构造函数,那么便会去寻找与调用的参数匹配的父类的构造函数。一旦子类定义了一个构造函数,无论参数类型,new构造子类对象时都不会直接匹配父类的同类型参数构造函数。如果不存在调用参数类型的构造函数,编译时会出现错误。需要注意的是,就算子类中没有定义构造函数,子类也没有默认的无参构造函数。


Dive Into Haskell(5) 输入与输出(IO)

 PUBLISHED ON March 22, 2015

Haskell拥有惰性求值和一切皆函数的设计,在Haskell中,函数仅仅负责根据提供的参数返回特定的结果,并且,函数的结果不受外部环境的影响,仅仅与参数有关。但IO却拥有副作用,IO环境的变化使得函数的运行状态不可预测,这对程序的流程造成了严重的潜在影响。在Haskell中,使用了一套Monadic I/O的模型来弱化和解除程序对IO操作的依赖,其基本思想是控制构造具有IO操作的程序和限制IO运算对函数的影响。


Dive Into Haskell(4) 高阶函数

 PUBLISHED ON February 28, 2015

返回函数的函数

以求最大值的函数max'为例,

max' :: (Ord a) => a->a -> a
max' x y
    | x >= y = x
    | x < y  = y

调用该函数时可以这样做:

max' 1 2

也可以这样做:

(max' 1) 2

原因是这个函数的定义也可以看成是


最大流算法

 PUBLISHED ON February 26, 2015

定理

  1. 增广路定理

对于流 f,若残留网络Gf不存在增广路,则 f 为流网络 G 的最大流。

  1. 最大流最小割定理

定义流网络G的切割(cut),为流网络的点集V的一个划分[S, T],且源点source在S中,汇点sink在T中。从S到T的边称为割边。切割的流量即从S到T的边的流量之和。

在网络 G 中 [S, T ] 为最小的切割,f 为最大流,则有 | S | = | f |。


最大公约数算法

 PUBLISHED ON February 25, 2015

关于最大公约数的求解,主要有欧几里得算法和Stein算法两种方法。

欧几里得算法

欧几里得算法的原理为:

$$ a \equiv r(mod\ b) $$

$$ gcd(a,b) = gcd(b,r) $$

算法执行过程为辗转相除法。

算法实现也很简单:


树状数组

 PUBLISHED ON February 24, 2015

树状数组(Binary Index Tree, BIT),是一个查询和修改复杂度都为O(lg(n))的数据结构。

定义

对于序列a,我们设一个数组C定义C[i] = a[i – 2^k + 1] + … + a[i](i从1开始),ki在二进制下末尾0的个数。 k的计算可以这样:

2^k = x and (x xor (x-1))

树状数组的结构如下图所示:

树状数组

在实现时,可以定义宏