算法储干
A. 一致性hash算法,采用哪种算法实现比较好,比如MD5,CRC32,或者其它
环割法(一致性 hash)环割法的原理如下:
1. 初始化的时候生成分片数量 X × 环割数量 N 的固定方式编号的字符串,例如 SHARD-1-NODE-1,并计算所有 X×N 个字符串的所有 hash 值。
2. 将所有计算出来的 hash 值放到一个排序的 Map 中,并将其中的所有元素进行排序。
3. 输入字符串的时候计算输入字符串的 hash 值,查看 hash 值介于哪两个元素之间,取小于 hash 值的那个元素对应的分片为数据的分片。
数据比较
下面将通过测试对环割法和跳跃法的性能及均衡性进行对比,说明 DBLE 为何使用跳跃法代替了环割法。
数据源:现场数据 350595 条
测试经过:
1. 通过各自的测试方法执行对于测试数据的分片任务。
2. 测试方法:记录分片结果的方差;记录从开始分片至分片结束的时间;记录分片结果与平均数的最大差值。
3. 由于在求模法 PartitionByString 的方法中要求分片的数量是 1024 的因数,所以测试过程只能使用 2 的指数形式进行测试,并在 PartitionByString 方法进行测试的时候不对于 MAC 地址进行截断,取全量长度进行测试。
B. 为什么一线互联网公司的校招高薪都是算法类
高端工程类岗位所需要的能力,高校很难培养出来。中低端工程类岗位,可能确实不太值钱。
。算法类因为一些历史遗留问题,大公司之前懂得人不多,而学校确实有些老师是行家里手,学生也可以在某一个小领域,做到精通。
这推高了前两年算法领域的校招价。然而,随着公司相关人才越来越多,算法类的稀缺性也在下降。另外,现在很多技术比较好的组也比较认清了,高端算法类毕业生已经不能靠论文数量,甚至已经不能靠发的会议质量了。
C. 最短路径算法
Dijkstra算法,A*算法和D*算法
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的 A* 算法和 D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。
大概过程:
创建两个表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
1. 访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。
4. 重复2,3,步。直到OPEN表为空,或找到目标点。
提高Dijkstra搜索速度的方法很多,常用的有数据结构采用Binary heap的方法,和用Dijkstra从起始点和终点同时搜索的方法。
A*(A-Star)算法是一种启发式算法,是静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索过程:
创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->
While(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点) break;
else
{
if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于OPEN表的估价值 )
更新OPEN表中的估价值; //取最小路径的估价值
if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于CLOSE表的估价值 )
更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
if(X not in both)
求X的估价值;
并将X插入OPEN表中; //还没有排序
}
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}
A*算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A*算法中估价值为0的情况。
动态路网,最短路算法 D*A* 在静态路网中非常有效(very efficient for static worlds),但不适于在动态路网,环境如权重等不断变化的动态环境下。
D*是动态A*(D-Star,Dynamic A*) 卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。是火星探测器采用的寻路算法。
主要方法:
1.先用Dijstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h。每个节点包含上一节点到目标点的最短路信息1(2),2(5),5(4),4(7)。则1到4的最短路为1-2-5-4。
原OPEN和CLOSE中节点信息保存。
2.机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值c(X,Y)+X的原实际值h(X).X为下一节点(到目标点方向Y->X->G),Y是当前点。k值取h值变化前后的最小。
3.用A*或其它算法计算,这里假设用A*算法,遍历Y的子节点,点放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:
while()
{
从OPEN表中取k值最小的节点Y;
遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a)
{
if(a in OPEN) 比较两个a的h值
if( a的h值小于OPEN表a的h值 )
{ 更新OPEN表中a的h值;k值取最小的h值
有未受影响的最短路经存在
break;
}
if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值
if( a的h值小于CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表
有未受影响的最短路经存在
break;
}
if(a not in both)
将a插入OPEN表中; //还没有排序
}
放Y到CLOSE表;
OPEN表比较k值大小进行排序;
}
机器人利用第一步Dijstra计算出的最短路信息从a点到目标点的最短路经进行。
D*算法在动态环境中寻路非常有效,向目标点移动中,只检查最短路径上下一节点或临近节点的变化情况,如机器人寻路等情况。对于距离远的最短路径上发生的变化,则感觉不太适用。
D. 都快2021年了,算法岗位应该怎样准备面试
说到算法岗位,现在网上的第一反应可能就是内卷,算法岗位也号称是内卷最严重的岗位。针对这个问题,其实之前我也有写过相关的文章。这个岗位竞争激烈不假,但我个人觉得称作内卷有些过了。就我个人的感觉,这几年的一个大趋势是从迷茫走向清晰。
早在2015年我在阿里妈妈实习的时候,那个时候我觉得其实对于算法工程师这个岗位的招聘要求甚至包括工作内容其实业内是没有一个统一的标准的。可以认为包括各大公司其实对这个岗位具体的工作内容以及需要的候选人的能力要求都不太一致,不同的面试官有不同的风格,也有不同的标准。
我举几个例子,第一个例子是我当初实习面试的时候,因为是本科生,的确对机器学习这个领域了解非常非常少,可以说是几乎没有。但是我依然通过了,通过的原因也很简单,因为有acm的获奖背景,面试的过程当中主要也都是一些算法题,都还算是答得不错。但是在交叉面试的时候,一位另一个部门的总监就问我有没有这块的经验?我很明确地说了,没有,但是我愿意学。
接着他告诉我,算法工程师的工作内容主要和机器学习相关,因此机器学习是基本的。当时我就觉得我凉了,然而很意外地是还是通过了面试。
核心能力
由于我已经很久没有接触校招了,所以也很难说校招面试应该怎么样准备,只能说说如果是我来招聘,我会喜欢什么样的学生。也可以理解成我理解的一个合格优秀的算法工程师应该有的能力。
模型理解
算法工程师和模型打交道,那么理解模型是必须的。其实不用说每一个模型都精通,这没有必要,面试的时候问的模型也不一定用得到。但更多地是看重这个人在学习的时候的习惯,他是浅尝辄止呢,还是会刨根究底,究竟能够学到怎样的地步。
在实际的工作当中我们可能会面临各种各样的情况,比如说新加了特征但是没有效果,比如升级了模型效果反而变差了等等,这些情况都是有可能发生的。当我们遇到这些情况之后,需要我们根据已知的信息来推理和猜测导致的原因从而针对性的采取相应的手段。因此这就需要我们对当前的模型有比较深入地了解,否则推导原因做出改进也就无从谈起。
所以面试的时候问起哪个模型都不重要,重要的是你能不能体现出你有过深入的研究和理解。
数据分析
算法工程师一直和数据打交道,那么分析数据、清洗数据、做数据的能力也必不可少。说起来简单的数据分析,这当中其实牵扯很多,简单来说至少有两个关键点。
第一个关键点是处理数据的能力,比如SQL、hive、spark、MapRece这些常用的数据处理的工具会不会,会多少?是一个都不会呢,还是至少会一点。由于各个公司的技术栈不同,一般不会抱着候选人必须刚好会和我们一样的期待去招人,但是候选人如果一无所知肯定也是不行的。由于学生时代其实很少接触这种实践的内容,很多人对这些都一无所知,如果你会一两个,其实就是加分项。
第二个关键点是对数据的理解力,举个简单的例子,比如说现在的样本训练了模型之后效果不好,我们要分析它的原因,你该怎么下手?这个问题日常当中经常遇到,也非常考验算法工程师对数据的分析能力以及他的经验。数据是水,模型是船,我们要把船驶向远方,只懂船只构造是不行的,还需要对水文、天象也有了解。这样才能从数据当中捕捉到trick,对一些现象有更深入的看法和理解。
工程能力
虽然是算法工程师,但是并不代表工程能力不重要,相反工程能力也很重要。当然这往往不会成为招聘的硬性指标, 比如考察你之前做过什么工程项目之类的。但是会在你的代码测试环节有所体现,你的代码风格,你的编码能力都是你面试的考察点之一。
并不只是在面试当中如此,在实际工作当中,工程能力也很关键。往小了说可以开发一些工具、脚本方便自己或者是团队当中其他人的日常工作,往大了说,你也可以成为团队当中的开发担当,负责其团队当中最工程的工作。比如说复现一篇paper,或者是从头撸一个模型。这其实也是一种差异化竞争的手段,你合理地负担起别人负担不了的工作,那么自然就会成为你的业绩。
时代在变化,行业在发展,如今的校招会问些什么早已经和当年不同了。但不管怎么说,这个岗位以及面试官对于人才的核心诉求几乎是没有变过的,我们从核心出发去构建简历、准备面试,相信一定可以有所收获。
E. 高中数学必修三知识点
一个人的知识面是一个圆圈,知识储备越多,圆圈越大,接触到的面积便越广阔,便能掌握和窥视更多的机会。下面是由我为大家整理的高中数学必修三知识点,仅供参考,欢迎大家阅读。
高中数学必修三知识点1
算法初步
1:算法的概念
(1)算法概念:在数学上,现代意义上的“算法”通常是指可以用计算机来解决的某一类问题是程序或步骤,这些程序或步骤必须是明确和有效的,而且能够在有限步之内完成.
(2)算法的特点:
图片有限性:一个算法的步骤序列是有限的,必须在有限操作之后停止,不能是无限的.
图片确定性:算法中的每一步应该是确定的并且能有效地执行且得到确定的结果,而不应当是模棱两可.
图片顺序性与正确性:算法从初始步骤开始,分为若干明确的步骤,每一个步骤只能有一个确定的后继步骤,前一步是后一步的前提,只有执行完前一步才能进行下一步,并且每一步都准确无误,才能完成问题.
图片不唯一性:求解某一个问题的解法不一定是唯一的,对于一个问题可以有不同的算法.
图片普遍性:很多具体的问题,都可以设计合理的算法去解决,如心算、计算器计算都要经过有限、事先设计好的步骤加以解决.
2: 程序框图
(1)程序框图基本概念:
图片程序构图的概念:程序框图又称流程图,是一种用规定的图形、指向线及文字说明来准确、直观地表示算法的图形。
一个程序框图包括以下几部分:表示相应操作的程序框;带箭头的流程线;程序框外必要文字说明。
图片构成程序框的图形符号及其作用
程序框
名称
功能
图片
起止框
表示一个算法的起始和结束,是任何流程图不可少的。
图片
输入、输出框
表示一个算法输入和输出的信息,可用在算法中任何需要输入、输出的位置。
图片
图片
处理框
赋值、计算,算法中处理数据需要的算式、公式等分别写在不同的用以处理数据的处理框内。
判断框
判断某一条件是否成立,成立时在出口处标明“是”或“Y”;不成立时标明“否”或“N”。
3:算法的三种基本逻辑结构:顺序结构、条件结构、循环结构。
(1)顺序结构:顺序结构是最简单的算法结构,语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
(2)条件结构:条件结构是指在算法中通过对条件的判断根据条件是否成立而选择不同流向的
算法结构。
(3)循环结构:在一些算法中,经常会出现从某处开始,按照一定条件,反复执行某一处理步骤的情况,这就是循环结构,反复执行的处理步骤为循环体,显然,循环结构中一定包含条件结构。
高中数学必修三知识点2
统计
2.1.1简单随机抽样
1.总体和样本
在统计学中,把研究对象的全体叫做总体.把每个研究对象叫做个体.把总体中个体的总数叫做总体容量.为了研究总体 的有关性质,一般从总体中随机抽取一部分: 研究,我们称它为样本.其中个体的个数称为样本容量.
2.简单随机抽样,也叫纯随机抽样。
就是从总体中不加任何分组、划类、排队等,完全随机地抽取调查单位。特点是:每个样本单位被抽中的可能性相同(概率相等),样本的每个单位完全独立,彼此间无一定的关联性和排斥性。简单随机抽样是 其它 各种抽样形式的基础。通常只是在总体单位之间差异程度较小和数目较少时,才采用这种 方法 。
3.简单随机抽样常用的方法:
(1)抽签法;⑵随机数表法;⑶计算机模拟法;⑷使用统计软件直接抽取。
在简单随机抽样的样本容量设计中,主要考虑:①总体变异情况;②允许误差范围;③概率保证程度。
4.抽签法:
(1)给调查对象群体中的每一个对象编号;
(2)准备抽签的工具,实施抽签
(3)对样本中的每一个个体进行测量或调查
例:请调查你所在的学校的学生做喜欢的体育活动情况。
5.随机数表法:
例:利用随机数表在所在的班级中抽取10位同学参加某项活动。
2.1.2系统抽样
1.系统抽样(等距抽样或机械抽样):
把总体的单位进行排序,再计算出抽样距离,然后按照这一固定的抽样距离抽取样本。第一个样本采用简单随机抽样的办法抽取。
K(抽样距离)=N(总体规模)/n(样本规模)
前提条件:总体中个体的排列对于研究的变量来说,应是随机的,即不存在某种与研究变量相关的规则分布。可以在调查允许的条件下,从不同的样本开始抽样,对比几次样本的特点。如果有明显差别,说明样本在总体中的分布承某种循环性规律,且这种循环和抽样距离重合。
2.系统抽样,即等距抽样是实际中最为常用的抽样方法之一。因为它对抽样框的要求较低,实施也比较简单。更为重要的是,如果有某种与调查指标相关的辅助变量可供使用,总体单元按辅助变量的大小顺序排队的话,使用系统抽样可以大大提高估计精度。
2.1.3分层抽样
1.分层抽样(类型抽样):
先将总体中的所有单位按照某种特征或标志(性别、年龄等)划分成若干类型或层次,然后再在各个类型或层次中采用简单随机抽样或系用抽样的办法抽取一个子样本,最后,将这些子样本合起来构成总体的样本。
两种方法:
1.先以分层变量将总体划分为若干层,再按照各层在总体中的比例从各层中抽取。
2.先以分层变量将总体划分为若干层,再将各层中的元素按分层的顺序整齐排列,最后用系统抽样的方法抽取样本。
2.分层抽样是把异质性较强的总体分成一个个同质性较强的子总体,再抽取不同的子总体中的样本分别代表该子总体,所有的样本进而代表总体。
分层标准:
(1)以调查所要分析和研究的主要变量或相关的变量作为分层的标准。
(2)以保证各层内部同质性强、各层之间异质性强、突出总体内在结构的变量作为分层变量。
(3)以那些有明显分层区分的变量作为分层变量。
3.分层的比例问题:
(1)按比例分层抽样:根据各种类型或层次中的单位数目占总体单位数目的比重来抽取子样本的方法。
(2)不按比例分层抽样:有的层次在总体中的比重太小,其样本量就会非常少,此时采用该方法,主要是便于对不同层次的子总体进行专门研究或进行相互比较。如果要用样本资料推断总体时,则需要先对各层的数据资料进行加权处理,调整样本中各层的比例,使数据恢复到总体中各层实际的比例结构。
2.2.2用样本的数字特征估计总体的数字特征
1、本均值:
2、样本标准差:
3.用样本估计总体时,如果抽样的方法比较合理,那么样本可以反映总体的信息,但从样本得到的信息会有偏差。在随机抽样中,这种偏差是不可避免的。
虽然我们用样本数据得到的分布、均值和标准差并不是总体的真正的分布、均值和标准差,而只是一个估计,但这种估计是合理的,特别是当样本量很大时,它们确实反映了总体的信息。
4.(1)如果把一组数据中的每一个数据都加上或减去同一个共同的常数,标准差不变
(2)如果把一组数据中的每一个数据乘以一个共同的常数k,标准差变为原来的k倍
(3)一组数据中的最大值和最小值对标准差的影响,区间 的应用;
“去掉一个最高分,去掉一个最低分”中的科学道理
2.3.2两个变量的线性相关
1、概念:
(1)回归直线方程
(2)回归系数
2.最小二乘法
3.直线回归方程的应用
(1)描述两变量之间的依存关系;利用直线回归方程即可定量描述两个变量间依存的数量关系
(2)利用回归方程进行预测;把预报因子(即自变量x)代入回归方程对预报量(即因变量Y)进行估计,即可得到个体Y值的容许区间。
(3)利用回归方程进行统计控制规定Y值的变化,通过控制x的范围来实现统计控制的目标。如已经得到了空气中NO2的浓度和汽车流量间的回归方程,即可通过控制汽车流量来控制空气中NO2的浓度。
4.应用直线回归的注意事项
(1)做回归分析要有实际意义;
(2)回归分析前,最好先作出散点图;
(3)回归直线不要外延。
高中数学必修三知识点3
概 率
3.1.1 —3.1.2随机事件的概率及概率的意义
1、基本概念:
(1)必然事件:在条件S下,一定会发生的事件,叫相对于条件S的必然事件;
(2)不可能事件:在条件S下,一定不会发生的事件,叫相对于条件S的不可能事件;
(3)确定事件:必然事件和不可能事件统称为相对于条件S的确定事件;
(4)随机事件:在条件S下可能发生也可能不发生的事件,叫相对于条件S的随机事件;
(5)频数与频率:在相同的条件S下重复n次试验,观察某一事件A是否出现,称n次试验中事件A出现的次数nA为事件A出现的频数;称事件A出现的比例fn(A)=为事件A出现的概率:对于给定的随机事件A,如果随着试验次数的增加,事件A发生的频率fn(A)稳定在某个常数上,把这个常数记作P(A),称为事件A的概率。
(6)频率与概率的区别与联系:随机事件的频率,指此事件发生的次数nA与试验总次数n的比值 ,它具有一定的稳定性,总在某个常数附近摆动,且随着试验次数的不断增多,这种摆动幅度越来越小。我们把这个常数叫做随机事件的概率,概率从数量上反映了随机事件发生的可能性的大小。频率在大量重复试验的前提下可以近似地作为这个事件的概率
3.1.3概率的基本性质
1、基本概念:
(1)事件的包含、并事件、交事件、相等事件
(2)若A∩B为不可能事件,即A∩B=ф,那么称事件A与事件B互斥;
(3)若A∩B为不可能事件,A∪B为必然事件,那么称事件A与事件B互为对立事件;
(4)当事件A与B互斥时,满足加法公式:P(A∪B)= P(A)+ P(B);若事件A与B为对立事件,则A∪B为必然事件,所以P(A∪B)= P(A)+ P(B)=1,于是有P(A)=1—P(B)
2、概率的基本性质:
1)必然事件概率为1,不可能事件概率为0,因此0≤P(A)≤1;
2)当事件A与B互斥时,满足加法公式:P(A∪B)= P(A)+ P(B);
3)若事件A与B为对立事件,则A∪B为必然事件,所以P(A∪B)= P(A)+ P(B)=1,于是有P(A)=1—P(B);
4)互斥事件与对立事件的区别与联系,互斥事件是指事件A与事件B在一次试验中不会同时发生,其具体包括三种不同的情形:(1)事件A发生且事件B不发生;(2)事件A不发生且事件B发生;(3)事件A与事件B同时不发生,而对立事件是指事件A与事件B有且仅有一个发生,其包括两种情形;(1)事件A发生B不发生;(2)事件B发生事件A不发生,对立事件互斥事件的特殊情形。
3.2.1 —3.2.2古典概型及随机数的产生
1、(1)古典概型的使用条件:试验结果的有限性和所有结果的等可能性。
(2)古典概型的解题步骤;
①求出总的基本事件数;
②求出事件A所包含的基本事件数,然后利用公式P(A)=
3.3.1—3.3.2几何概型及均匀随机数的产生
1、基本概念:
(1)几何概率模型:如果每个事件发生的概率只与构成该事件区域的长度(面积或体积)成比例,则称这样的概率模型为几何概率模型;
(2)几何概型的概率公式:
P(A)=;
(3)几何概型的特点:1)试验中所有可能出现的结果(基本事件)有无限多个;2)每个基本事件出现的可能性相等。
高中数学必修三知识点相关 文章 :
★ 高中数学必修三重点知识点复习
★ 高一数学必修3各章知识点总结
★ 高中数学必修三目录人教版
★ 高中数学必修三公式汇总
★ 高中数学必修3随机抽样知识点
★ 高三数学必修三知识点总复习资料
★ 高中必修三数学知识点
★ 高二数学必修三第三章知识点总结
★ 北师大高中数学必修3知识点
var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm..com/hm.js?"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();F. 金融学专业与建筑学专业比较
在我看来,两个专业都好,就业前景都不错的,至于建筑学需要数理知识多一些,偏理工科,金融学则偏文科多一些,但是数理知识也不能少,像利率,股票,债券等等计算也要会,就看你个人喜欢。至于薪酬,我觉得要看你以后进的公司,银行,以及你的就职的职位,金融学如果之后在银行的话工资稳定,保险也好,不过学建筑的话学好了一张设计图也很值钱。你喜欢什么就学什么,兴趣最好,学好了就下定决心去学,我也是理工科的但是目前学的是金融学,我喜欢和人打交道,专业也不差,加油!
G. 算法与逻辑这2个重要概念究竟是哪一门学科领域专门学习的内容
1.问:做哲学为什么需要学习逻辑?答:简单地说,哲学是一门学科,它提供的是理论,它要通过说理、通过论证使人接受或者反驳某种观点、理论,这就需要有正确的论证。逻辑研究有效推理,就是提供正确论证的基础。实际上,凡是理论,用推理,讲论证,都离不开逻辑。从这点看,哲学与其他“学”相同,所以逻辑是基础学科。但是哲学与其他学科相比,有两个特点,这使得这哲学中论证更为重要,因而逻辑的作用也更为重要。第一个特点,哲学不是经验科学。尽管经验可以给我们提供某些启示,来自于经验的知识可以作为哲学思考的某种根据,但是哲学命题不能通过经验来验证,不能做实验,所以,一个哲学理论的“正确性”(是否可接受),几乎只能靠论证来显示。历史上,一些哲学理论后来不被接受了,以另外的形式出现了,是因为发现原来论证有问题,对原来的理论有修正,有新的论证;也有一些理论一开始人们不喜欢,如休谟的经验论,后来却不得不接受(当然不是所有人都接受),因为它的论证没法反驳,有人甚至是乐于接受,因为认为它的论证好。第二个特点,哲学与其他学科不同,它要思考“终极”问题,即各门具体学科都不研究或无法研究的问题,比如什么是物质,什么是实在,什么是精神等本体论和认识论的问题。对这类问题的思考,会使论证更加困难。学过亚里斯多德逻辑,我们知道,有属加种差的定义。例如,人是某种动物,动物是某种生物,这就是属加种差的定义对什么是人和动物的回答。如果继续追问,什么是生物,大概还可以说,生物是某种物质,但是如果再问什么是物质?至少按这种方式已不能回答,需要有上一层的概念体系。一般来说,探求这样的终极问题,概念体系不容易建立,而且容易出现某种循环,比如康德二律背反那样的东西。在对这样的问题进行思考时,在对这些问题的观点论证、提出相应理论时,我们应该遵从什么法则?有什么规律?这些都对论证,也是对逻辑,提出了更高的要求。我们知道,现在我们所说的逻辑学产生于古希腊,始于亚里斯多德。为什么逻辑学产生于古希腊,有几个原因。一是民主政治,导致论辩风盛行。要辩论,要说理,就要讲逻辑。二是欧几里得几何学,提供了一个理论应该如何应用逻辑的典范。还有一个非常重要的原因,就是哲学研究。我认为是亚里斯多德主要是在其哲学研究中,也是为了更好地研究哲学,建立了逻辑学。他对于(事物)本质问题的思考等,使他提出上面提到的定义理论,建立了三段论逻辑。从这段历史来看,可以说,因为哲学和论证的关系,对逻辑提出了更高的要求,所以逻辑学才如此这般地产生了。所以,逻辑从一开始,就和哲学有密不可分的关系。以上所说的中心意思是,哲学的生命力在于论证,我们的哲学观点和理论可以不同,但是论证方法必须是相同的,不论自己思考问题还是与人交流,都需要有公共的论证平台,而这个平台应该、也只能由逻辑来搭建。在今天,哲学已经大大发展,但是哲学和逻辑的基本关系没有改变。只是今天的哲学需要什么样的逻辑?这是个有意思的问题,亚里斯多德逻辑显然完全不够了,需要今天的哲学家和逻辑学家共同关注。关于逻辑和哲学的关系,当年王浩来北大讲学时还提出一种观点。大意是,关于哲学问题的基本观点,大家很难统一。对此我们可以采取公理化的方法,各自从自己的基本观点出发,建立相应的理论系统,类似于古典数学和直觉主义数学。我认为这当然不是哲学研究的全部,但应该也是哲学研究的一个重要方面。如何使自己的理论更严密,需要有公理化的思想和方法。历史上斯宾诺莎曾经做过伦理学的公理化研究,大概不是很成功。今天逻辑学的发展是否对此提供了新的基础?这就需要学习现代逻辑。2.问:中国哲学也需要逻辑吗?答:回答这个问题,首先要对“逻辑”这个概念作点说明。我们现在所说的逻辑,指的是上面提到的产生于古希腊的逻辑。就连“逻辑”一词都是从古希腊语到英语、再到汉语译音而来。为什么要这样,因为中国自己的文化中没有产生出西方逻辑学意义上的逻辑学。中国古代有名辨学等一些在今天被人们作为中国逻辑史研究对象的理论或学说。从哲学和逻辑的关系看,如果说古希腊哲学有亚里斯多德逻辑与之对应,那么中国哲学是否也可以说有名辨学这样的学说与之对应?有这个背景,再看我们的问题,“中国哲学也需要逻辑吗”,应该是,研究中国哲学或中国哲学研究需要西方的逻辑学吗?这里有两个问题。如果是研究中国哲学,即以中国哲学为研究的对象,提出自己的研究成果,提出相应的理论和观点,那么,与其他研究类似,也要分析、推理、论证,当然也离不开西方的逻辑学。因为只有西方传统的逻辑学才在今天成为各学科的基础。但是,如果是做中国哲学研究,或中国哲学式的研究,即用中国哲学的方法研究中国哲学的问题,比如类似于老子,孔子的研究,是否要用西方的逻辑学,我还看不出有这个必要。从西方逻辑学的观点看,今天仍然难以完全说清中国的古代哲人究竟是用什么逻辑思考问题的。这个说法需要作点解释。中国哲学和西方哲学有很大的区别。这一点,从各自关心的问题和研究问题的方式可以看出来。西方哲学开始关心的问题是世界的本源是什么,这个关心的目的是要把面对的万事万物拆开,找基本的组成部分,或面对复杂纷呈的世界找出基本的性质,再将它们的组合起来,希望从这里说明一切现象,同时也获得了改造自然的手段。从简单的、基本的部分或性质开始,通过组合,到说明各种复杂现象,解决复杂问题,这就是西方哲学的精神,也是西方逻辑的精神,他们在这个探讨过程中建立了逻辑学,而且也是在这个过程中建立了西方科学。西方的哲学、逻辑学、科学属于同一个文化体系。中国哲学也有关心世界本源的部分,但地是从社会的角度考虑问题,探讨社会的秩序、和谐,讲究天人合一,同时也是为个人的自我修养和人生指导提供依据。从世界和社会的宏观出发到个人的修养,从个人的修养再到社会的和谐和秩序,这里面有许多非组合的东西,与西方逻辑的精神从文化渊源上看有根本的区别。所以,在这个问题上,我倒是不觉得中国哲学式的研究要用到西方的逻辑学。说到这里,插一句,我想中国哲学的逻辑是什么,这也许是个更有趣的问题。显然这需要中国哲学和逻辑学两方面的结合才有可能研究。当然,今天也很难有人还会按古人的方式去思考他们的哲学问题。不论从学习阶段就受到的训练,还是到后来的学术规范和科研体制,都决定了不会再出老子和孔子那样的思想家。现在作为学术的最基本要求是要说理,要论证,要交流,还是上面说到的,要有公共的论证平台。从这个意义上说,中国哲学大概也需要西方的逻辑学。3.问:传统逻辑和现代逻辑的区别是什么?答:我注意到你们的几个类似问法或问题,因为你们的采访在我们中心(北京大学逻辑、语言与认知研究中心)的网上登了出来,而且有了一段时间。这些问题是:(1)普通逻辑和现代逻辑的区别是什么?(2)数理逻辑和普通逻辑有什么区别?(3)逻辑学导论和一阶逻辑的区别是什么?还有现在的问题,(4)传统逻辑和现代逻辑的区别是什么?我想先做一点说明,也是澄清。这里涉及到关于逻辑的一些名词。首先,逻辑是一种客观对象,逻辑学是关于这个对象的科学,就像力是一种客观对象,力学是关于力这种对象的科学一样。“逻辑”有时也指逻辑学。逻辑本身没有现代和传统之分,也没有普通和不普通之分,只是逻辑学,作为人们对逻辑这个对象研究的成果,受到历史条件的限制,才有传统和现代之分,有不同的历史形态。“现代逻辑”和“传统逻辑”指的就是这种意义上的逻辑学。关于“普通逻辑”。首先,从对象的层次看,刚才说了,没有普通和不普通之分,也就是说没有普通逻辑这种逻辑,其次,从研究的角度看,也没有对逻辑这种对象的“普通”的研究,所以,是既没有普通逻辑(这种逻辑),也没有普通逻辑学。“普通逻辑”只能是课程的名称,类似于“普通物理”。这一点也是王宪钧先生当年一再强调的。拿“普通逻辑”和“普通物理”相比,也是王先生举的例子。为什么要强调这一点,因为“普通逻辑”叫得多了,有一种误解,把普通逻辑也当成了一种逻辑或一种逻辑学,其实,这只是一门课。关于“一阶逻辑”,从对象的层次看,有这样一种逻辑。关于这种逻辑的理论等是一阶逻辑学,通常也称为“一阶逻辑”。此外,还有专门的课程讲授一阶逻辑学,所以它还可以是课程的名称。“数理逻辑”与此类似。在上面提到的这些名称中,“传统逻辑”,“现代逻辑”,指的是某种逻辑学,在一些情况下,“现代逻辑”也可以是某类课程的名称;“普通逻辑”,“逻辑导论”或“逻辑学导论”只能是课程的名称;“一阶逻辑”,“数理逻辑”指的可以是一个或一种逻辑,也可以是这个或这种逻辑的学,还可以指讲授这个或这种逻辑的课程。这里我们涉及到三种名称:逻辑,逻辑学和逻辑课。有这个说明后再来看这些问题。在这些问题中,问题(4)是一个合理的问题,也没有什么歧义,因为在这个问题中,“传统逻辑”和“现代逻辑”只能做逻辑学的理解,问的是两种逻辑学之间的区别,现代的逻辑学究竟比过去的逻辑学有那些发展等。问题(3)的意思应该是比较两门课程,因为“逻辑学导论”是课程的名称,我们也有一阶逻辑的课。如果这么看,这也合理。问题(2)的初衷大概类似于问题(3),但是问题(2)容易引起误解。因为“数理逻辑”可以指一种逻辑,将它与普通逻辑相比,容易使人误解,把普通逻辑也当成了一种逻辑。最不合理的是问题(1)。“普通逻辑”只能是某门课程的名称,现代逻辑是一种逻辑学,这两个“逻辑”不可比。如果把“现代逻辑”理解为课程的名称,那么,它指的不是一门课,凡讲授现代逻辑学知识的课都可以称为现代逻辑课,而普通逻辑只能是一门课。将一门课与一类课相比,这应该也不可比。所以怎么都说不通。现在可以回答你们的问题,即问题(4)。一般认为,从亚里士多德到弗雷格以前的是传统逻辑,从弗雷格开始,产生了现代逻辑。当然在弗雷格之前,也有莱布尼茨、布尔这些现代逻辑的先驱。现代逻辑与传统逻辑的不同首先是产生的原因或动因不同。传统逻辑产生的原因主要是哲学上论证,也包括日常生活中的一些论辩。现代逻辑产生于数学研究,主要为了找出数学中的逻辑。其次是方法的不同,这是主要的不同。学过一点现代逻辑都知道,现代逻辑的基本方法是形式化方法。从根本上说,形式化方法就是数学的方法。因为是一些数学家研究数学中的推理,找数学中的逻辑,所以很自然地引用了数学的方法。从莱布尼茨开始就提出了把推理当作数学演算的想法。这个想法到弗雷格才在一定范围里得以实现。可以实现的原因之一,是弗雷格研究的是数学中的推理,这是我们各种推理中最严格的推理,但同时也是最简单的一种推理。可以实现的原因之二,就是他用到了数学的方法,把数学用到推理的研究中。现在数学(古典数学)中推理的规律已经都找出来了,这就是一阶逻辑。在这个过程中,产生了很多新的思想,建立了许多新的技术,逻辑学的内容大大丰富。如果说过去我们只能靠肉眼观察,那么,现在因为有了新的方法,我们已经知道如何去造显微镜,而且是电子显微镜。与传统逻辑相比,因为有了观察逻辑关系的“电子显微镜”,现代逻辑打开了一个全新的天地,范围大大拓宽。这个天地是传统逻辑用“肉眼”所不可能看见的。因为方法和动因的不同,导致了传统逻辑和现代逻辑其他的一些不同。比如,同是研究日常推理,传统逻辑总结一些方法,教我们这些方法,现代逻辑则要把其中的规律用数学的方法精确地刻画出来,其目的不是教我们人如何正确地进行日常思维,而是“教”计算机去做这样的的推理。现代逻辑的这种发展,使得逻辑学真正成为其他一些学科的基础,比如计算机科学,语言学等,包括哲学方面的分析哲学,语言哲学等。这里所谓的基础,意思是,如果没有现代逻辑的知识,要进行这方面的有关研究是不可能的。这个基础的作用是传统逻辑做不到也不可能做到的。人们一般认为学习逻辑会使人逻辑性强,提高思维能力,表现在头脑清楚,说话有条理,能言善辩等。这被称为逻辑的教导作用。应该说这是逻辑学产生的初衷之一。但在今天看来,如果说,传统逻辑还有一定的教导作用,那么现代逻辑则基本没有这个作用。现代逻辑使得逻辑学越来越像数学,成为专门的基础知识。如果说现代逻辑也有一些教导作用,那么它并也不比数学强。换言之,要想从学习现代逻辑中得到思维能力的提高,更好的法是去学数学。总之,逻辑学的这种教导作用,至少从现代逻辑的内容上看,已经不是今天逻辑学的主要功能。4.问:您认为哲学系本科生应该学普通逻辑课还是现代逻辑的课程?答:关于这个问题,我可能会说得多一些。因为即使在我们北大哲学系,这个问题也是从我的上一代老师、我的前辈们开始就一直在讨论、争论、甚至激烈争论的问题。我认为,应该学什么课,普通逻辑课还是现代逻辑课,取决于两个因素:一个是课程的内容、性质;一个是学习的目的。这是从学生选课的角度说的。换一角度,可以问,哲学系应该对本科生开普通逻辑课还是现代逻辑课?也有两个类似的因素,前一个因素没变,后一个因素是,开什么课取决于培养学生的目标。这是受教育者和教育者都关心的同一个问题,但角度不同。我想我还是从教育者的角度来谈这个问题。现在本科生教育可以说有两个目标,一个是素质教育,一个是专门人才培养。说白了,前者就是毕业后找工作,后者是读研究生,准备走学术的道路。从社会需求的角度看,大部分人是要从事实际工作的,学者总是少数。因此现在比较强调素质教育,淡化专业,所以本科生阶段取消了一些专业,比如我们系的本科生逻辑学专业就取消了。专门人才培养一般要到研究生阶段才真正开始。尽管学生自己可以早早为自己定位,但是从教育者的角度说,并不一开始就把谁定在什么方向。这增加了学生的自主性、能动性,同时也增加了学生自己的责任,学生也要为自己的将来负责。这是社会的进步。与强调素质教育相对应,另一方面,对准备走学术路的人也提出了更高的要求,要求有扎实的基础,有出色的科研能力。这是一种两极分化。一个本科生,刚进大学,很难说将来毕业后的去向,是做实际工作,还是读研究生,最终走学术研究的路。从教育者的角度看,也只能是同时提供各种条件、环境,让受教育者能走更适合自己发展的道路。一个好的大学,就是能提供好的这样的条件和环境,比如开出各种课程和提供好的指导等。现在可以谈谈普通逻辑课和现代逻辑课的问题。简单地说,现代逻辑的课程是为专门人才培养开设的。一个学生如果毕业后从事实际工作,在这方面他所需要的主要是素质教育,我认为不用学现代逻辑,但同时也不用学普通逻辑,倒是可以学学批判性思维这样的课。为什么这么说,我们可以先看看普通逻辑的性质和内容。普通逻辑是我国大学的逻辑知识普及课,内容大体上是亚里斯多德逻辑,即亚里斯多德的三段论、定义理论等,一些简单的命题逻辑知识,再加一些归纳推理的内容,关于论证的常识等,从知识的组成看,基本上是传统逻辑的东西。普通逻辑有一个基本考虑,就是围绕思维来讲。根据这个考虑,它把内容又分为概念,判断,推理,论证几个部分。近二十多年来,随着现代逻辑影响不断增加,普通逻辑课中也逐渐增加了一些现代逻辑的内容,课程的名称也改成逻辑导论,内容和重点有了很大甚至是重要的改变,但普及逻辑知识的课程性质没有变。这样的一门课程,我认为有一些缺点。首先我们可以看一下经过这样的普及课学习,会有什么收获,有什么效果。从课程设置的角度说,不外是希望学生有这几个方面的收获:(1)获得一定的逻辑学知识;(2)掌握一些方法,受到一定的训练,思维能力有某些提高;(3)有了一定的基础,便于继续学习逻辑;(4)以逻辑为基础去进行其他的课程的学习或研究。其中(1)和(2)合起来可以在素质教育方面起到一定的作用。(3)和(4)看起来是可以起到专门人才培养方面的作用。但实际情况究竟怎样,是否可以达到这样的效果,我们可以做一些分析。先看后两条,即人才培养方面的(3)和(4)。首先,传统逻辑和现代逻辑是逻辑学发展的两个阶段。现代逻辑不是从传统逻辑的基础上发展而来的,上面也谈到,完全是新的问题,新的起点,新的方法。现代逻辑对传统逻辑有种跳跃性,而没有什么继承性。从我们的教学实践看,学习传统逻辑对学现代逻辑没有什么帮助,反而可能会有某些误导。如果是为了要继续学习逻辑,这个继续被学的,只能是现代逻辑,所以不如一开始就学现代逻辑。(3)说的是普通逻辑课或逻辑导论课可以作为现代逻辑课的基础,但从这个分析看,情况并非如此。不说有可能误导,至少学习的效率不高。再看(4)。现代逻辑是像数学这样的专门的基础知识,需要按学数学那样方式才能真正掌握,才可能成为用来学习和研究如计算机科学、语言学甚至哲学的知识基础,不能只是停留在普及知识的层次上,浅显地讲讲,象征性地做些习题,而需要详细地讲解,严格地证明,严格地做习题,有些甚至是比较难的习题。这些即使在逻辑导论课上,也不可能做到。所以,希望达到(4)的效果,只能是一个愿望,实际上根本达不到。这两个方面说明,普通逻辑或逻辑导论在逻辑学研究或应用逻辑的专门人才培养方面起不到什么作用。事实上,我们这些年的教学实践上也证明了这一点。就我校来说,这二十多年来上过普通逻辑或逻辑导论课的学生应该达到数以万计,但没有一个学生由此而成为研究逻辑或者应用逻辑去研究其他领域问题的专门人才。这说明什么问题?当然是我们作为教育者一方应该深刻反省的。说到底,主要是课程的性质,普及逻辑知识,这决定了这门课只能是作为文化素养提高的一个方面来教和学,而不是也不能作为其他知识和课程的基础来教和学。说到这里,涉及到这门课的素质教育方面的意义。上面说了它在专门人才培养方面起不到什么作用,现在我们可以就此再看它素质教育的作用方面。前面说到逻辑有教导作用,在这里对应到所希望达到的效果(2)。看起来普通逻辑所讲的问题简单、常见,与实际生活更接近,所以它更具有教导作用,但其实这里有些误解。普通逻辑或逻辑导论都是传统逻辑和现代逻辑的某种结合。关于现代逻辑,前面已经说了,它完全远离了逻辑的教导作用,不是为日常思维服务的,而是一种基础知识。再看传统逻辑部分。这部分中确实有些内容是讲思维方法,讲有关的一些道理。但是在这方面,它有两个不足:一是先天不足,一是后天不足。一般都不否认亚里斯多德逻辑是传统逻辑的核心部分。亚里斯多德逻辑中的核心部分又是三段论。我们可以看看三段论在讲什么。它在讲我们几乎天生就会的三段论推理,比如“所有的A是B,所有的B是C,所以,所有的A是C”,讲这样的的推理为什么是正确的,这样的推理多少种格与式,哪些格式是正确的推理形式,可以如何变形,道理何在等等。这些细致的甚至显得繁琐的分析和证明主要不是为了日常思维的需要,而是为了哲学研究。我想说的是,逻辑学从一开始,就是一种学院派式的理论,这是它的精神实质,而且这种精神一直在延续。应该说,这是真正的逻辑学的精神。所以,亚里斯多德是逻辑学之父,他不仅从问题、对象,而且从方式和精神,都奠定了这门学科的基础。关于日常思维的思维方法等只是这种理论的一些延伸,不是本质的部分。有了理论,可以在思维方法的方面做很多推广。只是方法方面谈多了,谈泛了,实际上就出了这种学的圈。这就是传统逻辑对日常思维方面作用的“先天不足”。作为一门课程,当然可以按照需要设计它的内容,没有必要一定按某种学理精神来讲授。但是,在思维能力提高和训练方面,普通逻辑并没有给我们提供的内容和训练的手段。这是它的“后天不足”。如果要讲思维方法,注重日常思维能力提高,有比普通逻辑更合适的课程,这就是批判性思维。实际上,批判性思维并不是一门逻辑课,但是它的问题更集中,目的也更明确,所以更专业。总体上看,对普通逻辑课,包括逻辑导论,在思想方法和思维能力训练方面,如果是讲思维的严格性,精确性,那不如去学数学。如果是讲思维的敏捷、机智,善抓问题实质的准确性、尖锐性等,不如去学批判性思维。最后,再看希望达到的效果(1),即这门课对逻辑知识的了解和掌握方面的作用。作为知识上的修养,这当然也是一种素质的提高。特别地,对什么是逻辑的精神,通过普通逻辑课或逻辑导论课多少可以了解一些,这应该是一个人知识组成中的重要部分。但是,知识普及性的课不能提供真正实用的技术和理论,这一点应该没什么疑问。我们只要看看逻辑学今天的发展和这些课程所讲授的内容就不难得出这个结论。当然,不论怎样,最后总会对逻辑的精神有一定程度的了解,有一定的逻辑的知识素养,这是大概是这门课最后的收获。对此我想指出一点,从今天的角度看,这也是一种多少有点养尊处优的知识素养,因为它主要不解决实用问题,基本上是精神层面的东西。过去我国大学教育属于计划经济体系,毕业生是国家干部。什么是国家干部,就是国家的管理人员,当然不是人人最后都走上了管理岗位,但首先他们都属于干部体系,有干部级别。大学的一个主要功能是为国家提供干部储备。作为这样的教育,当然要使受教育者除了专门的知识、技能外,还要有一定的知识素养。比如,要知道一点逻辑,讲点逻辑。在这种情况下,逻辑知识普及课对我国干部队伍素质的总体提高,还是起到一定的作用的。从这个意义上说,这门课也还是有功绩的。但是,现在的情况已经有了根本的改变。一个受教育者不再是计划经济下教育生产线出产的一个产品,不再是一个干部或储备干部,国家的干部体制现在也转变成了公务员体制,这不仅仅是名称的改变。在现在的情况下,一个大学生首先是一个将来要参与社会竞争的主体。我们的教育体制已发生了根本的变化,教育也地具有了人本精神,教育者要地从受教育者的立场出发考虑问题。面对这样的教育形势和被教育者,我们应该教什么?他们所面对的将是严酷的竞争和挑战,已经没有时间和条件再去接受那种养尊处优式的知识素养教育。所以我认为,如果说普通逻辑或逻辑导论这种逻辑知识普及课在过去时代条件下还有一些积极作用,那么现在这些作用早已淡出,所以这样的课已经不合时代要求,应该淘汰。取而代之的也是两极分化:彻底讲实用性,学批判性思维;真正学逻辑,学现代逻辑。这也是一种“与时俱进”吧。有一种观点认为,一个大学毕业生,受过高等教育的人,不学普通逻辑或逻辑导论,不知道什么是逻辑,不懂一点逻辑怎么行。我认为这种观点没有建立在将逻辑学、逻辑课以及它们的历史和社会时代背景等因素加以综合和仔细分析的基础上,没有充分的根据。如果有我们这里的分析,那就不仅是“怎么不行”,而且是势在必行。至于哲学系开什么课,不同的哲学系当然只能根据自己的情况量力而行。北大哲学系是按专门人才培养的方向来开课的,也有这个条件,所以当然应该开现代逻辑课,取消普通逻辑或逻辑导论课。我们实际上也是这么做的。目前只是对外系或校公共课还开逻辑导论,这是因为某种历史的惯性吧,迟早也是要取消的。在我系,现代逻辑课是一系列课程。首先是一阶逻辑。这是现代逻辑的入门课,也是哲学学习和研究的一个基础课。如果将来研究哲学,可以到此为止,也可以再学模态逻辑等。如果要学逻辑,则必须在有这门课的基础后再去学其他的逻辑课程。至于批判性思维,我认为是一门很好的课,也主张应该开这门课,甚至应该是全校的公共课。这是一门素质教育课,谁都可以选。但是要清楚,这门课与学哲学和学逻辑都没有什么特别的关系。
H. 怒了,求高人解释程序算法,很简短的一个程序
外星人计算Pi的程序
一、源程序
本文分析下面这个很流行的计算PI的小程序。下面这个程序初看起来似乎摸不到头脑,
不过不用担心,当你读完本文的时候就能够基本读懂它了。
程序一:很牛的计算Pi的程序
int a=10000,b,c=2800,d,e,f[2801],g;
main() {
for(;b-c;)
f[b++]=a/5;
for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a)
for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);
}
二、数学公式
数学家们研究了数不清的方法来计算PI,这个程序所用的公式如下:
1 2 3 k
pi = 2 + --- * (2 + --- * (2 + --- * (2 + ... (2 + ---- * (2 + ... ))...)))
3 5 7 2k+1
至于这个公式为什么能够计算出PI,已经超出了本文的能力范围。
下面要做的事情就是要分析清楚程序是如何实现这个公式的。
我们先来验证一下这个公式:
程序二:Pi公式验证程序
#include "stdio.h"
void main()
{
float pi=2;
int i;
for(i=100;i>=1;i--)
pi=pi*(float)i/(2*i+1)+2;
printf("%f\n",pi);
getchar();
}
上面这个程序的结果是3.141593。
三、程序展开
在正式分析程序之前,我们需要对程序一进行一下展开。我们可以看出程序一都是使用
for循环来完成计算的,这样做虽然可以使得程序短小,但是却很难读懂。根据for循环
的运行顺序,我们可以把它展开为如下while循环的程序:
程序三:for转换为while之后的程序
int a=10000,b,c=2800,d,e,f[2801],g;
main() {
int i;
for(i=0;i<c;i++)
f[i]=a/5;
while(c!=0)
{
d=0;
g=c*2;
b=c;
while(1)
{
d=d+f[b]*a;
g--;
f[b]=d%g;
d=d/g;
g--;
b--;
if(b==0) break;
d=d*b;
}
c=c-14;
printf("%.4d",e+d/a);
e=d%a;
}
}
注:
for([1];[2];[3]) {[4];}
的运行顺序是[1],[2],[4],[3]。如果有逗号操作符,例如:d=0,g=c*2,则先运行d=0,
然后运行g=c*2,并且最终的结果是最后一个表达式的值,也就是这里的c*2。
下面我们就针对展开后的程序来分析。
四、程序分析
要想计算出无限精度的PI,我们需要上述的迭代公式运行无数次,并且其中每个分数也
是完全精确的,这在计算机中自然是无法实现的。那么基本实现思想就是迭代足够多次
,并且每个分数也足够精确,这样就能够计算出PI的前n位来。上面这个程序计算800位
,迭代公式一共迭代2800次。
int a=10000,b,c=2800,d,e,f[2801],g;
这句话中的2800就是迭代次数。
由于float或者double的精度远远不够,因此程序中使用整数类型(实际是长整型),分
段运算(每次计算4位)。我们可以看到输出语句 printf("%.4d",e+d/a); 其中%.4就是
把计算出来的4位输出,我们看到c每次减少14( c=c-14;),而c的初始大小为2800,因
此一共就分了200段运算,并且每次输出4位,所以一共输出了800位。
由于使用整型数运算,因此有必要乘上一个系数,在这个程序中系数为1000,也就是说
,公式如下:
1 2 3 k
1000*pi = 2k+ --- * (2k+ --- * (2k+ --- * (2k+ ... (2k+ ---- * (2k+ ... )).
..)))
3 5 7 2k+1
这里的2k表示2000,也就是f[2801]数组初始化以后的数据,a=10000,a/5=2000,所以下面
的程序把f中的每个元素都赋值为2000:
for(i=0;i<c;i++)
f[i]=a/5;
你可能会觉得奇怪,为什么这里要把一个常数储存到数组中去,请继续往下看。
我们先来跟踪一下程序的运行:
while(c!=0) 假设这是第一次运行,c=2800,为迭代次数
{
d=0;
g=c*2; 这里的g是用来做k/(2k+1)中的分子
b=c; 这里的b是用来做k/(2k+1)中的分子
while(1)
{
d=d+f[b]*a; f中的所有的值都为2000,这里在计算时又把系数扩大了
a=10000倍。
这样做的目的稍候介绍,你可以看到
输出的时候是d/a,所以这不影
计算
g--;
f[b]=d%g; 先不管这一行
d=d/g; 第一次运行的g为2*2799+1,你可以看到g做了分母
g--;
b--;
if(b==0) break;
d=d*b; 这里的b为2799,可以看到d做了分子。
}
c=c-14;
printf("%.4d",e+d/a);
e=d%a;
}
只需要粗略的看看上面的程序,我们就大概知道它的确是使用的那个迭代公式来计算Pi
的了,不过不知道到现在为止你是否明白了f数组的用处。如果没有明白,请继续阅读。
d=d/g,这一行的目的是除以2k+1,我们知道之所以程序无法精确计算的原因就是这个除
法。即使用浮点数,答案也是不够精确的,因此直接用来计算800位的Pi是不可能的。那
么不精确的成分在哪里?很明显:就是那个余数d%g。程序用f数组把这个误差储存起来
,再下次计算的时候使用。现在你也应该知道为什么d=d+f[b]*a;中间需要乘上a了吧。
把分子扩大之后,才好把误差精确的算出来。
d如果不乘10000这个系数,则其值为2000,那么运行d=d/g;则是2000/(2*2799+1),这
种整数的除法答案为0,根本无法迭代下去了。
现在我们知道程序就是把余数储存起来,作为下次迭代的时候的参数,那么为什么这么
做就可以使得下次迭代出来的结果为
接下来的4位数呢?
这实际上和我们在纸上作除法很类似:
0142
/——------
7 / 1
10
7
---------------
30
28
---------------
20
14
---------------
60
.....
我们可以发现,在做除法的时候,我们通常把余数扩大之后再来计算,f中既然储存的是
余数,而f[b]*a;则正好把这个余数扩大了a倍,然后如此循环下去,可以计算到任意精
度。
这里要说明的是,事实上每次计算出来的d并不一定只有4位数,例如第一次计算的时候
,d的值为31415926,输出4位时候,把低四位的值储存在e中间,e=d%a,也就是5926。
最后,这个c=c-14不太好理解。事实上没有这条语句,程序计算出来的仍然正确。只是
因为如果迭代2800次,无论分数如何精确,最后Pi的精度只能够达到800。
你可以把程序改为如下形式尝试一下:
for(i=0;i<800;i++)
{
d=0;
g=c*2;
b=c;
while(1)
{
d=d+f[b]*a;
g--;
f[b]=d%g;
d=d/g;
g--;
b--;
if(b==0) break;
d=d*b;
}
// c=c-14; 不要这句话。
printf("%.4d",e+d/a);
e=d%a;
}
最后的答案仍然正确。
不过我们可以看到内循环的次数是c次,也就是说每次迭代计算c次。而每次计算后续位
数的时候,迭代次数减少14,而不影响精度。为什么会这样,我没有研究。另外最后的
e+d/a,和e=d/a的作用就由读者自己考虑吧。
--
I. 神经网络算法是用来干什么的
神经网络算法是由多个神经元组成的算法网络。
逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理;这一过程可以写成串行的指令,让计算机执行。然而,直观性的思维是将分布式存储的信息综合起来,结果是忽然间产生的想法或解决问题的办法。这种思维方式的根本之点在于以下两点:
1、信息是通过神经元上的兴奋模式分布储在网络上。
2、信息处理是通过神经元之间同时相互作用的动态过程来完成的。
思维学普遍认为,人类大脑的思维分为抽象(逻辑)思维、形象(直观)思维和灵感(顿悟)思维三种基本方式。
J. 秀尔算法的算法实现
我们要试着解决的问题是:给定一个合成数 N,找到整数p在1和N之间且不包含1和N, 并且 N整除于p。
秀尔算法包含两个部份:
1.一个以传统的电脑运作的简化算法,将因子分解简化成搜寻目的问题。2.一个量子算法,解决搜寻目的问题。
传统部份:
1.选择任意数字a < N
2.计算gcd(a, N)。这里可以使用辗转相除法来计算。
3.若 gcd(a, N) ≠ 1,则我们有了一个N非显然的因子,因此这部份结束了。
4.否则,利用下面的周期寻找副函式(Period-finding subroutine,下面会列出)来找出下面这个函数的周期r: ?f(x) = a^x mod N。换句话说,找出a在里面的目 r,或者最小的正整数r令 f(x + r) = f(x)。
5.若r是奇数,回到第一步。
6.若a^(r/2) ≡-1 (mod N), 回到第一步。
7. gcd(a^(r/2)? ± 1, N) 是N非平凡的一个因子。分解完成。
量子部份:周期寻找副函式(Period-finding subroutine)
这个算法使用的量子线路是为了在给定一个固定常数 N 以及一个任意常数 a之下,找出f(x) = a^x mod N所设定的。给定N, 找出Q = 2^q且合乎N^2≤Q≤2N^2??(这同时表示Q / r > N)。输入和输出量子位元暂存器需要储存从0到Q-1所有值的叠加态,因此分别需要q个量子位元。这里使用看起来比所需的数量还要更多一倍的量子位元,保证了即使周期r的大小逼近N/2,也至少有N个不同的x会产生相同的 f(x)。
算法如下:
1.将暂存器初始化成
?
x从0到Q - 1。所以这一个初始态是Q 个状态的叠加。
2.建立量子函式版本的f(x) ,并且应用于上面的叠加态, 得到
?
这里仍旧是Q个状态的叠加。
3. 对输入暂存器进行 量子傅立叶转换。这个转换(操作于二的幂次即Q = 2^q个叠加态上面)使用一个Qth 单位根 例如 ω = e^(2pi*i/Q)将任意给定态|x>的振幅平均分布在所有Q个态|y>上。另一个方法是对于每个不同的|x>:
?
由此得到最终状态:
?
这是一个远多过Q个状态的叠加态,但是远低过Q^2个。虽然在和中有Q^2项,但只要x0 和 x的值相同,态|y>f(x0)就可被提出来。令
ω = e^(2pi*i/Q)? 为 Qth 的一个单位根,
r 为 f 的周期,
x0为一个产生相同 f(x) 的 x 的集里面的最小元素(我们已经有x0 < r),以及
b在0到[(Q-x0-1)/r]之间使得x0 + rb < Q。
那么ω^ry则是复平面的一个单位向量(ω是一个单位根,r 和 y 是整数),而?Q^(-1)|y>|f(x0)>在最终状态下的系数则为?
?
这一求和的每一项代表一个获得相同结果的不同路径,而量子干涉发生。在单位向量ω^ryb几乎与复平面指向同一方向(要求ω^ry指向正实数轴)时,干涉将是相长的。
4.进行测量。我们由输入寄存器取得结果 y,由输出寄存器取得f(x0)。而既然f 是周期,对某对y和 f(x0)进行测量的概率则由
?
给出。分析显示这个概率越高,单位向量ω^ry就越接近正实数轴,或者yr/Q就越接近一个整数。除非r是2的乘方,否则它不会是Q的因子。
5.对y/Q进行连分数展开来计算其近似值,并生成满足下列两个条件的c/r′:
A: r′<N
B: |y/Q - c/r′| < 1/2Q
借着满足这一些条件,r′ 有很高的机率会是我们要找的周期r 。
6. 检查f(x) = f(x + r′) ,由此可得
?
?
如果成功了,我们就完成了。
7.否则,以接近y左右的数值作为r的候选,或者说多取几个r′. 如果任何候选成功了,我们就完成了。
8.否则,回到第一步骤(也就是全部重新作一次)。?