天文算法求节气发生时间的C++实现

算法一直是程序员们“难啃的骨头”。但早在计算机被发明以前,人们对于算法就已经研究了很长的时间。

算法历史上的每一个“第一次”,都为计算机的发展带来了重大影响。那算法为什么是计算机程序的灵魂呢?其实可以从它的发展史中略窥一二。

人邮君带领大家从算法的每个“第一次”开始,了解“好”算法的性质,还会送给大家一些算法的基础学习方法!

算法概念的第一次被提出

自古老的公元前1世纪开始,《周髀算经》(zhōu bì suàn jīng)就作为中国最古老的天文学和数学著作,在算法的历史上写下了浓墨重彩的一笔。

作为算经的十书之一,《周髀算经》采用最简便可行的方法确定天文历法,揭示日月星辰的运行规律,囊括四季更替,气候变化,包涵南北有极,昼夜相推的道理。为后来者的生活作息提供了有力保障。

经过几个世纪的发展,到公元9世纪,波斯数学家al-Khwarizmi第一次在数学上提出了“算法”这个概念——演算法(algorithm)。他提出的算法概念,仍旧沿用至今:

指按照规定的法则和顺序对式题或算式进行运算,并求出结果的过程。包括:加法、减法、乘法、除法、乘方、开方等几种运算形式。

运算和计算略有区别,计算是指把横式中的数按运算符号和规定的顺序求得结果,可以按运算法则,也可以按口算或其他简便的方式直接求得结果。而运算则是指求得结果的过程。

关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),有些查询需要几个基本运算的组合,要经过若干步骤才能完成。

逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律 。这一逻辑理论人们常称它为布尔代数。

公元前330年,被人们称为“几何之父”的欧几里得出生了。在欧几里得生活的那个时期,几何学存在一个很大的缺点和不足,就是缺乏系统性。

这一时期的古希腊几何学,大多数是片断、零碎的知识,公理与公理之间、证明与证明之间并没有什么很强的联系性,更不要说对公式和定理进行严格的逻辑论证和说明。

于是欧几里得下定决心,要在有生之年完成对几何学的系统化理论化。由此,经过无数个日夜的撰写,人类史上第一个算法——欧几里得算法诞生了

对现在的计算机行业来说,欧几里得算法是目前最经典的几大算法之一。

历史上的第一个算法程序

19世纪80年代,“软件之母”Ada Byron为巴贝奇分析机编写了求解伯努利方程的程序。这是人类史上的第一个算法程序。

Ada关于算法的研究实现了计算机科学的本质性飞跃。在她去世一百年之后的1953年,她之前所翻译《分析机概论》留下的笔记被重新公布,再一次震惊了世人。人们因此认为,Ada对现代计算机与软件工程造成了重大影响。

从现在的观点来看,Ada首先为了计算制作了“算法”,然后制作了“程序设计流程图”,这个珍贵的计划被认为是“第一件计算机程序”

作为世界上的第一位程序员,Ada为编程的发展做出了极大的贡献。

第一次解决算法定义的难题

进入20世纪,算法得到了进一步的巨大发展。这个世纪,英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机

图灵机的构造(图源:百度百科)

所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色,有一个机器头在纸带上移来移去。

机器头有一组内部状态,还有一些固定的程序。每个时刻,机器头都要从纸带上读入一个方格信息,然后结合内部状态查找程序表,再根据程序输出信息到纸带方格上,并转换自己的内部状态进行移动。

虽然图灵机十分地简单,但它可以用来模拟任何算法。图灵机对人们使用纸笔进行数学计算的过程进行了抽象,实现了用机器代替人类进行数学计算。图灵机的出现,解决了算法定义的难题。

算法是计算机程序的灵魂,掌握了算法,就可以离开发出优秀的程序更近一步。

说到算法与编程的关系,异步君就必须向大家介绍一位传奇人物:Nicklaus Wirth。

作为编程界的“Pascal之父”,Nicklaus Wirth有一句在计算机领域人尽皆知的名言:“算法+数据结构=程序”

凭借着这句名言,Nicklaus Wirth在1984年拿到了图灵奖的奖项。因为这个公式对计算机科学的影响程度,足以类似物理学中爱因斯坦的“E=MC^2”——仅用一个公式就展示了程序的本质

Nicklaus Wirth于1934年在瑞士北部的温特图尔出生,其父瓦尔特是一位地理学教授。Wirth小时候就喜欢动手动脑,他的最大爱好就是组装飞机模型。

1960年,在加拿大莱维大学深造的Wirth获得了硕士学位。取得硕士学位的他并不满足,随后便进入加州大学伯克利分校,于1963年获得博士学位。

在斯坦福大学成功的开发出Algol W以及PL360后,爱国心极强的Nicklaus Wirth于1967年回到祖国瑞士,第二年在他的母校苏黎世工学院,他创建与实现了Pascal语言——当时世界上最受欢迎的语言之一

Pascal语言算得上是一种经典的算法语言。而算法的主要目的在于为人们提供阅读了解所执行的工作流程与步骤。那么,什么样的算法才算是“好”的算法?异步君在这里提炼了几个性质:

(1)正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。

(2)易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。

(3)健壮性:算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,系统应该提示出错。

(4)高效性:高效性是指算法运行效率高,即算法运行所消耗的时间短。算法时间复杂度就是算法运行需要的时间。

好的算法,可以让我们开发程序达到事半功倍的效果。那么我们应该如何学好算法呢?

随着科技的发展,算法已经逐渐渗透在各行业内,是一个有着优秀前景的专业领域。

怎样学好算法?人邮君在这里为大家准备了一些学习算法的入门路径

【算法工程师必备技能】

2. 熟练运用各种常用算法和数据结构,有独立的实现能力;

3.熟悉数据挖掘算法;

4.熟悉机器学习相关知识理论。

加分项:具有较为丰富的项目实践经验。

大家看到这里,肯定带一个疑惑:是应该直接学习算法吗?

万丈高楼平地起,任何高深的算法都要从基础算法学起,不可能一口吃个胖子。

所以,初入门的你学习算法还是要从基础开始:

【算法的基础学习步骤】

数据结构书有很多,但是有些教材晦涩难懂,建议看图解多,通俗易懂的书,推荐《趣学数据结构》

本书基于C++语言编写,从趣味故事引入算法复杂性计算及数据结构基础内容,通过大量图解将抽象数据模型简单通俗化,语言表述浅显易懂,并结合有趣的实例帮助读者轻松掌握数据结构。

不要直接看《算法导论》,大量证明会让你崩溃。推荐《趣学算法》,有问题分析,完美图解,伪码详解,实战演练,适合初学者快速掌握经典算法。

程序的灵魂是算法。软件开发中,选择算法可以更快更好地实现功能。因此,程序员唯有掌握算法,才能轻松地驾驭程序开发。

另外,陈小玉老师的精英算法训练营在开课啦,ACM教练带你免费学算法!( 可领课件)

陈小玉老师,副教授、高级程序员。ACM教练,多次获得ACM、蓝桥杯奖项。著有畅销书《趣学算法》《趣学数据结构》

◆ 掌握深度优先搜索和广度优先搜索算法

◆ 掌握背包类问题求解方法

◆ 快速掌握算法核心方法,利用树形DP求解

◆ 3天视频直播,讲师助教指导

◆ 班主任全程督学,效果更好

◆ 加入学习社群,让学习更有动力

赠人玫瑰,手留余香,不要忘记点赞、收藏、关注 哦~

开发的.这款游戏当时并不是运行在传统计算机上的.它的硬件甚至没有处理器和内存.它只是一个简单的状态机,在多个状态中转换.Computer Space的所有逻辑必须在硬件上完成.

随着"Atari 2600"在1977年推出,开发者们有了一个开发游戏的平台.这正是游戏开发变得更加软件化的时候,再也不用设计复杂的硬件了.从Atari时期一直到现在,仍然有一些游戏技术保留着

家用机推出的时候,它的硬件就会被锁定5年多,称为一个"世代".家用机的优点也在于其锁定了硬件,使得程序员可以有效利用机能.

这个时期的程序员需要对底层硬件有一定的理解.CPU运行在/594f6r和/abrash/. 这个博客的博主是游戏产业的传奇人物Michael Abrash, 讲了很多有洞见的虚拟实现和现实增强的文章

// 给出一个稍微前一点的点 Vector3 target = /):这个博客中有很多业界经验丰富的程序员谈论了关于AI编程相关的话题

根据存储数据的类型,JSON可能与XML相比速度更快,体积更小.但也不总是这样

  • AaronYang的C#私房菜[二][提供编程效率的技巧] 前言 我的文章简单易懂,能学到东西.因为复杂的东西,讲起来,好累.阅读者只是膜拜,学不到东西,就是没用的东西,好多文章都是看不下去.我写不出 ...

    1. 在.net框架体系内,反射特性较多的应用到.反射的相关定义分为两种. 自然解释:射是一种自然现象,表现为受刺激物对刺激物的逆反应:这是反射的字面解释,我们看一下计算机编程中的反射: 编程解释:通过 S ...

    2. JqModal 是jQuery的一个插件,用来在web浏览器中显示自定义通告,而且它为通用窗口框架奠定了基础. 1. 多模型支持 2. 支持拖拽和重定义大小 3, 支持远程加载窗口内容(ajax和if ...

    3. 之前写过<使用SwingBench 对Oracle RAC DB性能 压力测试>,使用的是最基础直观的图形模式,已经可以满足大多数需求. 但是在有些场景下,图形模式可能本身消耗资源过大,尤 ...

    4. Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询 ...

    5. ICP算法简介 根据点云数据所包含的空间信息,可以直接利用点云数据进行配准.主流算法为最近迭代算法(ICP,Iterative Closest Point),该算法是根据点云数据首先构造局部几何特征, ...

我要回帖

更多关于 实现自己的梦想 的文章

 

随机推荐