集合(Set)
由一些确定的、彼此不同的成员(Member)或者元素(Element)构成的一个整体。成员取自一个更大的范围,称为基类型(Base Type)。集合中成员的个数称为集合的基数(Cardinality)。
例如,集合 R 由整数 3、 4、 5 组成,写成 R={3, 4, 5}。
此时R的成员是 3、4、 5, R 的基类型是整型,R的基数是3。
依赖于集合的基类型,它的成员经常有一个线性顺序。
集合的成员叫做该集合的子集(Subset),子集中的每个成员都属于该集合。
没有元素的集合称为空集(Empty Set,又称为 Null Set), 记作Φ。
如上例中, 3 是R 的成员,记为: 3∈R, 6不是R的成员,记为: 6∉R。 {3, 4}是 R 的子集。
集合的表示法
1) 穷举法: S={2, 4, 6, 8, 10};
2) 描述法: S={x|x 是偶数,且 0≤x≤10}。
3、 集合的特性
1) 确定性:任何一个对象都能被确切地判断是集合中的元素或不是;
2) 互异性:集合中的元素不能重复;
3) 无序性:集合中元素与顺序无关。
计量单位(Unit): 按照IEEE规定的表示法标准,字节缩写为“ B”,位缩写为“ b”,兆字节(220字节)缩写为缩写为“ MB”,千字节(210字节)缩写为“ KB”。
阶乘函数Factorial Function
阶乘函数 n!是指从 1 到 n 之间所有整数的连乘,其中 n 为大于 0 的整数。因此, 5!=1*2*3*4*5=120。特别地, 0!=1。
取下整和取上整(Floor and Ceiling):
实数 x 的取下整函数(Floor)记为⌊x⌋,返回不超过 x 的最大整数。例如, ⌊3.4⌋=3,与⌊3.0⌋的结果相同。
实数 x 的取上整函数(Ceiling)记为⌈x⌉,返回不小于 x 的最小整数。例如, ⌈3.4⌉=4,与⌈4.0⌉的结果相同。
取模操作符( Modulus):
取模函数返回整除后的余数,有时称为求余。在 C#语言中取模操作符的表示为 n%m。从余数的定义可知, n%m 得到一个整数,满足 n=qm+r,其中 q 为一个整数,且 0≤r<m。
对数:
如果a(a>0,a≠1)的b次幂等于N,就是ab=N,那么数b叫做以a为底N的对数(Logarithm),记作logaN=b,其中a叫做对数的底数,N叫做真数。
从定义可知,负数和零没有对数。事实上,因为 a>0,所以不论 b 是什么实数,都有 ab>0,这就是说不论 b 是什么数,N 永远是正数,因此负数和零没有对数。
在一个线性表中查找指定值所使用的折半查找算法:首先与中间元素进行比较,以确定下一步是在上半部分进行查找还是在下半部分进行查找。然后继续将适当的子表分半,直到找到指定的值。一个长度为n的线性表被促逐次分半,直到最后的子表中只有一个元素,一共需要进行多少次呢?答案是log2n次。
本书中用到的对数几乎都以 2 为底,这是因为数据结构和算法总是把事情一分为二,或者用二进制位来存储编码。
递归:
一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。
有很多数学函数是以递归来定义的。
如大家熟悉的阶乘函数,我们可以对n!作如下定义:
阶乘函数的C#语言实现如下。
public static long fact(int n)
{
if(n <= 1)
return 1;
else
return n * fact(n-1);
}
递归算法通常不是解决问题最有效的计算机程序,因为递归包含函数调用,函数调用需要时空开销。所以,递归比其他替代选择诸如while 循环等,所花费的代价更大。