4.0更新—webcast听课笔记
一步一步从头学吧,听课记笔记!
一基础类增加 base class libraries
1.Biginterger ----system.number
2.Complex numbers(复数)
回忆复数和实数
数学概念
复数
1、基本概念
复数是指能写成如下形式的数a+bi,这里a和b是实数,i是虚数单位(即-1开根)。 由意大利米兰学者卡当在十六世纪首次引入,经过达朗贝尔、棣莫弗、欧拉、高斯等人的工作,此概念逐渐为数学家所接受。 复数有多种表示法,诸如向量表示、三角表示,指数表示等。它满足四则运算等性质。它是复变函数论、解析数论、傅里叶分析、分形、流体力学、相对论、量子力学等学科中最基础的对象和工具。
数集拓展到实数范围内,仍有些运算无法进行。比如判别式小于0的一元二次方程仍无解。因此将数集再次扩充,达到复数范围。
我们定义,形如z=a+bi的数称为复数,其中规定i为虚数单位,且i^2=i*i=-1(a与b是任意实数)
我们将复数z=a+bi中的实数a称为虚数z的实部(real part)记作Rez=a
实数b称为虚数z的虚部(imaginary part)记作 Imz=b.
当a=0且b≠0时z=a+bi=0+bi我们就将其称为纯虚数。
设z=a+bi是一个复数,则称复数z'=a-bi为z的共轭复数。
定义:复数的模(绝对值)=√(a^2+b^2)(定义原因见下述内容)
复数是无序的,因为在复平面上可以很容易看出来复数不光有长度还有方向(可类比矢量)
(a+bi)•(c+di)=(ac-bd)+(bc+ad)i,
(a+bi)÷(c+di)=[(ac+bd) / (c^2+d^2)]+[(bc-ad) / (c^2+d^2)] i,
16世纪意大利米兰学者卡当(Jerome Cardan1501—1576)在1545年发表的《重要的艺术》一书中,公布了三次方程的一般解法,被后人称之为"卡当公式"。他是第一个把负数的平方根写到公式中的数学家,并且在讨论是否可能把10分成两部分,使它们的乘积等于40时,他把答案写成=40,尽管他认为和这两个表示式是没有意义的、想象的、虚无飘渺的,但他还是把10分成了两部分,并使它们的乘积等于40。给出"虚数"这一名称的是法国数学家笛卡尔(1596—1650),他在《几何学》(1637年发表)中使"虚的数"与"实的数"相对应,从此,虚数才流传开来。
数系中发现一颗新星——虚数,于是引起了数学界的一片困惑,很多大数学家都不承认虚数。德国数学家莱布尼茨(1646—1716)在1702年说:"虚数是神灵遁迹的精微而奇异的隐避所,它大概是存在和虚妄两界中的两栖物"。瑞士数学大师欧拉(1707—1783)说;"一切形如,习的数学式子都是不可能有的,想象的数,因为它们所表示的是负数的平方根。对于这类数,我们只能断言,它们既不是什么都不是,也不比什么都不是多些什么,更不比什么都不是少些什么,它们纯属虚幻。"然而,真理性的东西一定可以经得住时间和空间的考验,最终占有自己的一席之地。法国数学家达朗贝尔(1717—1783)在1747年指出,如果按照多项式的四则运算规则对虚数进行运算,那么它的结果总是的形式(a、b都是实数)(说明:现行教科书中没有使用记号=-i,而使用=-1)。法国数学家棣莫佛(1667—1754)在1730年发现公式了,这就是著名的棣莫佛定理。欧拉在1748年发现了有名的关系式,并且是他在《微分公式》(1777年)一文中第一次用i来表示一1的平方根,首创了用符号i作为虚数的单位。"虚数"实际上不是想象出来的,而它是确实存在的。挪威的测量学家成塞尔(1745—1818)在1779年试图给于这种虚数以直观的几何解释,并首先发表其作法,然而没有得到学术界的重视。
德国数学家阿甘得(1777—1855)在1806年公布了虚数的图象表示法,即所有实数能用一条数轴表示,同样,虚数也能用一个平面上的点来表示。在直角坐标系中,横轴上取对应实数a的点A,纵轴上取对应实数b的点B,并过这两点引平行于坐标轴的直线,它们的交点C就表示复数a+bi。象这样,由各点都对应复数的平面叫做"复平面",后来又称"阿甘得平面"。高斯在1831年,用实数组(a,b)代表复数a+bi,并建立了复数的某些运算,使得复数的某些运算也象实数一样地"代数化"。他又在1832年第一次提出了"复数"这个名词,还将表示平面上同一点的两种不同方法——直角坐标法和极坐标法加以综合。统一于表示同一复数的代数式和三角式两种形式中,并把数轴上的点与实数—一对应,扩展为平面上的点与复数—一对应。高斯不仅把复数看作平面上的点,而且还看作是一种向量,并利用复数与向量之间—一对应的关系,阐述了复数的几何加法与乘法。至此,复数理论才比较完整和系统地建立起来了。
经过许多数学家长期不懈的努力,深刻探讨并发展了复数理论,才使得在数学领域游荡了200年的幽灵——虚数揭去了神秘的面纱,显现出它的本来面目,原来虚数不虚呵。虚数成为了数系大家庭中一员,从而实数集才扩充到了复数集。
随着科学和技术的进步,复数理论已越来越显出它的重要性,它不但对于数学本身的发展有着极其重要的意义,而且为证明机翼上升力的基本定理起到了重要作用,并在解决堤坝渗水的问题中显示了它的威力,也为建立巨大水电站提供了重要的理论依据。
实数
1、基本概念
包括有理数和无理数。其中无理数就是无限不循环小数,有理数就包括整数和分数。
数学上,实数直观地定义为和数轴上的点一一对应的数。本来实数仅称作数,后来引入了虚数概念,原本的数称作"实数"——意义是"实在的数"。
实数可以分为有理数和无理数两类,或代数数和超越数两类,或正数,负数和零三类。实数集合通常用字母 R 或 R^n 表示。而 R^n 表示 n 维实数空间。实数是不可数的。实数是实分析的核心研究对象。
实数可以用来测量连续的量。理论上,任何实数都可以用无限小数的方式表示,小数点的右边是一个无穷的数列(可以是循环的,也可以是非循环的)。在实际运用中,实数经常被近似成一个有限小数(保留小数点后 n 位,n 为正整数)。在计算机领域,由于计算机只能存储有限的小数位数,实数经常用浮点数来表示。
①相反数(只有符号不同的两个数,我们就说其中一个是另一个的相反数) 实数a的相反数是-a
②绝对值(在数轴上一个数所对应的点与原点0的距离) 实数a的绝对值是:
|a|= ①a为正数时,|a|=a
②a为0时, |a|=0
③a为负数时,|a|=-a
③倒数 (两个实数的乘积是1,则这两个数互为倒数) 实数a的倒数是:1/a (a≠0)
埃及人早在大约公元前1000年就开始运用分数了。在公元前500年左右,以毕达哥拉斯为首的希腊数学家们意识到了无理数存在的必要性。印度人于公元600年左右发明了负数,据说中国也曾发明负数,但稍晚于印度。
直到17世纪,实数才在欧洲被广泛接受。18世纪,微积分学在实数的基础上发展起来。直到1871年,德国数学家康托尔第一次提出了实数的严格定义。
实数
.net部分
定义2维
Var z1=new Complex(2,4) [2是x,4是y]
Var z2=new Complex(3,5)
直接进行虚数运算
Complex.Add(z1,z2)
Complex.Subtract(z1,z2)
Complex.Multiply(z1,z2)
Complex.Divide(z1,z2)
数据结构部分
1.Tuple---元组【有序的数据集合】--泛型表现
Var primes=Tuple.Create(2,3,5,7,11)
--数据类型不同,可以定义复杂信息,实现复杂信息的定义
Tuple.Create<string,uri,DateTime>("",new uri("http://www.baidu.com"),DateTime.now)
2.SortedSet<T>----(自平衡红黑树)
唯一元素组成的集合
与HashSet区别,前者是元素是顺序排列的。
有增加删改等,支持排序,可以认为是一个排序的hashSet
代码示例:
自平衡红黑树---【不为平衡二叉树】--性能有提升。
【扩展:二叉搜索树,自平衡红黑树】
【扩展:内存—硬盘文件映射内存,system.io.memery.mapfile 好处,避免频繁io,大文件处理,内存分享,避免抢io通道】
【扩展:托管代码中的并行计算】
自平衡红黑树:
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质3. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
An example of a red-black tree
红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。所有数据块都存储在节点中。这些节点中的某一个节点总是担当启始位置的功能,它不是任何节点的儿子;我们称之为根节点或根。它有最多两个"儿子",都是它连接到的其他节点。所有这些儿子都可以有自己的儿子,以此类推。这样根节点就有了把它连接到在树中任何其他节点的路径。
如果一个节点没有儿子,我们称之为叶子节点,因为在直觉上它是在树的边缘上。子树是从特定节点可以延伸到的树的某一部分,其自身被当作一个树。在红黑树中,叶子被假定为 null 或空。
由于红黑树也是二叉查找树,它们当中每一个节点的比较值都必须大于或等于在它的左子树中的所有节点,并且小于或等于在它的右子树中的所有节点。这确保红黑树运作时能够快速的在树中查找给定的值。
用途和好处
红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如即时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。
红黑树在函数式编程中也特别有用,在这里它们是最常用的持久数据结构之一,它们用来构造关联数组和集合,在突变之后它们能保持为以前的版本。除了O(log n)的时间之外,红黑树的持久版本对每次插入或删除需要O(log n)的空间。
红黑树是 2-3-4树的一种等同。换句话说,对于每个 2-3-4 树,都存在至少一个数据元素是同样次序的红黑树。在 2-3-4 树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得 2-3-4 树成为理解红黑树背后的逻辑的重要工具,这也是很多介绍算法的教科书在红黑树之前介绍 2-3-4 树的原因,尽管 2-3-4 树在实践中不经常使用。
Code contracts-契约式编程[结果为真的表达式]
2.假设行契约---contract.assume【验证已经添加的事实】
3.前置条件契约---contract.requires—方法被调用时候的验证(一般为参数)
Contract 运行完方法后 中断[避免注释过多的描述,比debug更柔性]
Primary Interop Assemblies【com组件封装定义】
-------缺点:部署比较困难,严重依赖于.NET FRAMWORK,无法修改,pia比较庞大1m,2m或者更大,兼容升级问题。
Host Process(i.e. Outlook—启动最新的.netFramework)
In-Process Side-By-Side【4.0 一个进程可以加载不同的CLR,之前的不可以