C#数据结构---- 数学预备知识

 数学预备知识
    一、集合
1、集合的概念
集合(Set)是由一些确定的、彼此不同的成员(Member)或者元素(Element)构成的一个整体。成员取自一个更大的范围,称为基类型(Base Type)。集合中成员的个数称为集合的基数(Cardinality)。
例如,集合R由整数3、4、5组成,写成R={3,4,5}。此时R的成员是3、4、5,R的基类型是整型,R的基数是3。依赖于集合的基类型,它的成员经常有一个线性顺序。
集合的每个成员或者是基类型的一个基本元素(Base Element),或者它本身也数据结构(C#语言版一个集合。我们把是集合的成员叫做该集合的子集(Subset),子集中的每个成员都属于该集合。没有元素的集合称为空集(Empty Set,又称为Null Set),记作Φ。如上例中,3是R的成员,记为:3∈R,6不是R的成员,记为:6∉R。{3,4}是R的子集。
2、 集合的表示法
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。
3 对数
一般地,如果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⌉。例如,如果要存储1000个不同的编码,至少需要⌈log21000⌉=10位(10位可以产生1024个不同的可用编码)。第二,对数普遍用于分析把问题分解为更小子问题算法。在一个线性表中查找指定值所使用的折半查找算法就是这样一种算法。折半查找算法首先与中间元素进行比较,以确定下一步是在上半部分进行查找还是在下半部分进行查找。然后继续将适当的子表分半,直到找到指定的值(折半查找算法在8.2.3小节有详细的描述)。一个长度为n的线性表被促逐次分半,直到最后的子表中只有一个元素,一共需要进行多少次呢?答案是log2n次。
本书中用到的对数几乎都以2为底,这是因为数据结构和算法总是把事情一数据结构(C#语言版),或者用二进制位来存储编码。
4 递归
一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。
比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于直接递归。
如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。
一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。
函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。
如大家熟悉的阶乘函数,我们可以对n!作如下定义:
根据定义,如要计算n!(factorial(n)),需要先调用factorial(n-1)计算(n-1)!,而要计算(n-1)!需要先调用factorial(n-2)计算(n-2)!,以此类推,最终需要调用factorial(0)计算0!,然后程序逐步返回,即可计算出n!。
阶乘函数的C#语言实现如下。
public static long fact(int n)
{
if(n <= 1)
{
return 1;
}
else
{
return n * fact(n-1);
}
}
把递归作为一种主要用于设计和描述简单算法的工具,对于不熟悉它的编程人员而言是很难接受的。递归算法通常不是解决问题最有效的计算机程序,因为递归包含函数调用,函数调用需要时空开销。所以,递归比其他替代选择诸如
数据结构(C#语言版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值