前言

什么是算法?为什么算法值得研究?算法的作用是什么

算法

算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合做为输出。即就是把输入转换成输出的计算步骤的一个序列。

良定义的解释:良好的定义,让人一看就懂得

拿排序问题举例:

  1. 输入一个序列<a1 a2 a3 a4 a5>
  2. 输出一个递增序列<a1' a2' a3' a4' a5'>, 满足a1'<=a2'<=a3'<=a4'<=a5'。

即其排序的过程就是我们所谓的算法, 如果对每个输入实例都能得到期望的输出那么称该算法是正确的,当然,某些时候当算法的错误率可控时对于我们来说仍然是可用的。

算法能够解决哪些问题?

  1. 人类的基因工程。识别人类DNA中的10万个基因,包含30亿碱基对,将这些信息储存于数据库并开发相应的工具进行数据分析,使得生物科学家能够有效地利用数据进行实验研究。
  2. 网站的数据信息管理。借助算法能够帮助寻找用于传输数据的性能优良的路由,如提高我们利用搜索引擎检索信息的速度。
  3. 电子商务领域的电子支付保密性。公钥密码和数字签名都是以数值算法为基础的。
  4. 各领域的线性规划问题如石油公司如何设置油井以最大化利润、航空公司如何在满足乘务员调度法规的基础上最大化利润地将乘务员分配到各班机上

以上是一些概括,最终会具体到实际问题:

  1. 给出一张交通图上面标记了所有十字路口之间的距离;我们如何确定从一个十字路口到另一个十字路口间的最短距离?简单来说求解过程如下:将交通图建模为一个图,接着寻找途中从一个顶点到另一个顶点的最短路径。
  2. 给定两个有序的符号序列:X=<x1,x2,x3......xm>和Y=<y1,y2,y3.....yn>,求出X和Y的最长公共子序列。比如若两个序列是DNF链中的基对,那么当它们具有长的公共子序列时我们认为它们是相似的。而选择X和Y的所有可能的子序列会发挥大量的时间,因此要借助一种合适的算法。
  3. 拓扑排序问题,给定一个依据部件库的机械设计,其中每个部件可能包含其他部件的实例,我们需要列出这些部件使每个部件出现在使用它的部件的前面。
  4. 给定平面上n个点寻找凸壳的问题。所谓凸壳就是在该平面上包含所有这些点的最小多边形。

练习题

  • 1-1给出现实生活中需要排序的一个例子或现实生活中需要计算凸壳的一个例子。

    排序:输入班级所有学生的考试成绩,输出成绩排名
    凸包:求省/城市边界范围,城市规划等
  • 1-2除速度外,在真实环境中还可能使用哪些其他有关效率的量度

    内存、通信的带宽、精度、健壮性。
  • 1-3 选择一种你以前已知的数据结构并讨论其优势和局限。

    单向链表:
    优势:可以不用连续的内存空间,插入和删除比较方便
    劣势:不能向数组一样随机访问。
  • 1-4 前面给出的最短路径与旅行商问题有哪些相似之处

    相似之处:都是寻求最短路径
    不同之处:最短路线问题:从若干条可选线路中选择一条线路使之在两个点之间最短旅行商问题:需要遍历所有的点。

作为一种技术的算法

假设计算机是无限快的并且计算机存储器是免费的,那么用于求解某个问题的任何正确的方法都行。 我们还有什么理由研究算法?

当然,计算机也许是快的,但它们不是无限快。存储器也许是廉价的,但不是免费的。所以计算时间是一种有限资源,存储器中的空间也一样。你应该明智地使用这些资源,在时间或空间方面有效的算法将帮助你这样使用资源。举一个1000w数组排序的例子:

  1. 计算机A(每秒执行百亿条指令),插入排序
  2. 计算机B(每秒1000万条指令),归并排序

计算机A就纯计算能力来说比计算机B快1000倍,插入排序排序n个数,需要指令;归并排序需要指令.即

  • 计算机A需要,   1000w * 1000w / 100亿  = 10000 秒
  • 计算机B需要,1000w *  / 1000W  = 23秒

计算机B比计算机A还快接近500倍!因此表明我们应该像计算机硬件一样把算法看成是一种技术。整个系统的性能不但依赖于选择快速的硬件而且还依赖于选择有效的算法。

练习题

  • 2-1给出在应用层需要算法内容的应用的一个例子,并讨论涉及的算法的功能。

    当我们使用高德或百度地图,查找两地点的路径。
    在此情况下,我们最关心的是最近路径就是通过算法计算出来的
  • 2-2假设我们正比较插入排序与归并排序在相同机器上的实现。对规模为n的输入,插入排序运行步,而归并排序运行64nlgn步。问对哪些n值,插入排序优于归并排序?

    1. 满足8n^2 < 64n*lg(n)
    2. n < 8*lg(n);
    3. 可得n<= 43 ,不考虑n为1.

思考题

以计算机1s一般可执行最大操作10^6次为前提, 假设求解问题的算法需要f(n)毫秒,对下面中的每个函数f(n)和时间t,确定可以在时间t内求解的问题的最大规模n

《算法导论3rd第一章》算法在计算中的作用相关推荐

  1. 重读《算法导论》第一章

    重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...

  2. 每天一道算法练习题--Day25 第一章 --算法专题 --- ----------蓄水池抽样

    蓄水池抽样 问题描述 算法描述 相关题目 总结 力扣中关于蓄水池抽样问题官方标签是 2 道,根据我的做题情况来看,可能有三四道.比重算是比较低的,大家可以根据自己的实际情况选择性掌握. 蓄水池抽样的算 ...

  3. 我眼中的算法导论 | 第一章——算法在计算中的作用、第二章——算法基础

    一个小白的算法学习之路.读<算法导论>第一天.本文仅作为学习的心得记录. 算法(Algorithm) 对于一个程序员来说,无论资历深浅,对算法一词的含义一定会或多或少有自己的体会,在< ...

  4. 第一章 算法设计与分析基础知识

    系列文章目录 第一章 算法设计与分析基础知识 第二章 算法的分治策略 第三章 算法的动态规划 第四章 算法的贪心法 -- @[TOC](这里写目录标题) # 一级目录 ## 二级目录 ### 三级目录 ...

  5. 【趣学算法】第一章 算法之美(上)

    14天阅读挑战赛 [趣学算法]第一章 算法之美(上) 文章目录 [趣学算法]第一章 算法之美(上) 1.打开算法之门 2.妙不可言---算法复杂性 2.1 算法的引入 [算法的定义] [算法题] [& ...

  6. 位向量(bit vector)(算法导论第十一章11.1-2)

    位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...

  7. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

    假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...

  8. 高中数学必修3知识点总结归纳:第一章算法初步

    大家好,今天分享高中数学必修3知识点总结归纳第一章算法初步,也是高中数学教学的重要内容.老师为大家整理的高中数学必修3算法初步知识点总结归纳,一起来看看吧. 好了,今天高中数学必修3知识点总结归纳第一 ...

  9. 算法导论第2章(3) 二分查找 binary search

    二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...

最新文章

  1. 南大电子机器人入驻云南_云南大学外语协会 英文歌曲演唱比赛
  2. [ARM异常]-ARMV8-aarch32的异常向量表介绍
  3. if you canget up early
  4. Keras 获取中间某一层输出
  5. linux7配置dns服务器,centOS7搭建DNS服务器配置详解
  6. android studio课程管理系统,8 个最优秀的 Android Studio 插件
  7. 收藏收藏:工作用了很久的自主开发的Sql Server代码生成器,我开源了(.NET Winform)
  8. 主席树【bzoj3524(p3567)】[POI2014]Couriers
  9. jar k8s 自己的 部署_k8s+jenkins+harbor镜像仓库实现持续集成
  10. 微信读书App来了 小伙伴们快去占榜吧
  11. 样式处理——去除无用样式
  12. java最新 学习路线
  13. 京瓷打印机p5026cdn_京瓷p5026cdn驱动下载-京瓷p5026cdn打印机驱动v2.0.1421 官方版 - 极光下载站...
  14. 【华人学者风采】李进 广州大学
  15. 【案例】某区医院绩效工资分配系统和绩效工资分配优化服务案例
  16. vi和nano实用操作
  17. cp: omitting directory
  18. 名字中间一条线怎么弄_怎么在网名中间画一条横线 一条横线穿过字的网名
  19. 【Kotlin入门教程】史上最全最易于理解最全面的文章
  20. SpringBoot + FreeMarker + FlyingSaucer 实现PDF在线预览、打印、下载

热门文章

  1. python画害羞的表情_如何绘制面部表情?教你绘制极具吸引力的面部表情画法技巧!...
  2. matlab 动态优化,基于Matlab的测控系统动态性能优化与仿真
  3. 当乐app官方下载android,当乐下载安卓最新版_手机官方版免费安装下载_豌豆荚
  4. 电子计算机技术人才需求,电子与信息技术专业人才需求调研报告.pdf
  5. h5封装去底部_贪婪洞窟H5:也出微信小游戏了!还是原来贪婪的味道
  6. GTK+实现linux聊天室代码详解-clientr端
  7. 【因缘际会】知乎APP的简单的产品体验报告
  8. 深入浅出移动直播技术之帧率、码率和分辨率
  9. 一张自拍即可实现变老变年轻,带你感受时光流逝之美
  10. 51单片机LCD显示温度与串口接受温度