第1章 什么是算法
前言:写这篇文章的目的,
众所周知算法对于很多刚入行做程序员的人来说是感觉很神秘又高深的东西的东西,有时又感觉特别的难学,我最近在看B站上看斯坦福大学的公开课,很久之前拍的,文末附上相关的链接,名字叫<算法导论>,里面有21天的课程,感觉讲的很深奥,里面有大量的演算方面的内容,看完以后没有啥印象了,对于刚入门的小白来说看的很吃劲,最近刚好看到一本讲关于算法方面的书籍名字就叫写个大家看的算法书,里面的内容很是比较容易懂的,语言比较精炼而且还有很多的动漫方面的图,所以总结一下分享给大家
什么是算法
所谓算法就是"对特定问题的解决步骤", 这里说的特定问题通常有
- 对信息进行排序
- 搜索目标信息
等不同的问题
1.算法是解特定问题的步骤
现实生活中有很多问题的解决方法蕴含了算法思想,比如其中的代表就是菜谱,菜谱中会把制作菜品的所需材料,用量标记清楚,并且把做菜的过程,每一步需要的时间等正确的记录下来,遵从这样的步骤,无论是谁都可以做出一道不错的菜,我用番茄炒蛋菜谱为例,谁叫我只会番茄炒蛋呢
第一步:把番茄洗干净,切好
第二步:把蛋打好
第三步:番茄和蛋放入锅中翻炒,加入调味料:油,盐,鸡精等
第四步:煮上3分钟
第五步:出锅享用
像这样对给定问题(做一道番茄炒蛋),给出可行的解法的菜谱,也是解决问题的步骤
2.算法是人类智慧的结晶
在计算机面世以来,在利用计算机解决各种问题,无数解法,步骤被人们提出.“是不是可以更好的复用”, “是不是可以更高效”, “是不是可以花费更少的空间代价”,很多研究者会从这些方面对现存的算法进行改善,而经历了时间的洗练,那些优雅的算法正在被应用到各种计算机程序中去,算法也一样,聚集了为编写优雅的程序而付出的前人的智慧的结晶
现实生活中也是,比如厨师会想办法把菜谱改良一下,这样会做出更好吃的菜肴,算法中则是编写出更加优质的程序
一个学习过算法的人,即使没有多高的天分,在编写同样功能的程序时,完成度也能比没有学习过算法的人有明显的优势
3.算法的两个必要条件
- 准确性
- 可停止性
a.准确性
对相应的问题算法必须能够得出正确的结果,这正是算法的准确性.所谓算法准确性,指的是输入符合条件的值,一定要保证能得到正确的输出 ,
证明算法准确性的其中一个方法是,“对于算法中的任意一个步骤,输入当前步骤满足条件的值,看能否得到当前步骤产生的准确结果,以此细分并判定”,这种方法叫断言
b.可停止性
算法是最终可停止的,也就是说算法也就是==“无论怎么样的输入,也一定可以在有限的时间内正确的停止”==,一直重复,永远不能返回结果的操作(也叫死循环)步骤,是不能被称作算法的
1.4要重点关注的算法
a.专用于数论计算的算法
- 求最大公约数的辗转相除法
- 求联立方程的高斯消元法
- 求解定积分近视值的梯形公式
- 计算质数埃拉托斯特尼筛法[^1]
b.对一组乱序的数据进行升序或者降序的排序算法(sort)
- 选择排序
- 冒泡排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
c.在大量数据中找出目标数据的搜索算法(search)
- 线性搜索(linear search)
- 二分排序(binary search)
d.在一个字符串中找到符号特定模式的子串(子字符串)的匹配算法
- 简单字符串搜索
- KMP算法
- BM算法
1.5算法基础之结构化编程思想
在计算机领域,有一种旨在高效描述程序,最大限度减少设计的方法论,叫做结构化编程思想
在结构化化编程思想中,所有处理流程都用以下三种结构来组合表示
- 顺序结构
- 选择结构
- 循环结构
面向过程的程序,也基本是由着三种构造的组合来编写的
总结:这篇文章主要围绕什么是算法来描述五点
- 算法是解决特定问题的步骤
- 算法是人类智慧的结晶
- 算法的两个必要条件(准确性,可停止性)
- 要重点关注的算法,四点(数论计算算法,sort排序,search搜索, 字符串匹配)
- 结构化编程思想(顺序,选择,循环)
结束语:后面我会仔细的将1.4要重点关注的算法以专题的形式总结
链接:https://www.bilibili.com/video/av48922404/?p=1[算法导论]
说明:
[^1]埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。埃拉托斯特尼筛法