算法:是解决问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法的特性:算法具有五个特性:输入、输出、有穷性、确定性、可行性

  输入输出:算法具有零个或多个输入;至少有一个或多个输出。

  有穷性:指算法在执行有限的步骤后,自动结束而不会出现无线循环,并且每个步骤在可接受的范围内完成。

  确定性:算法的每一步骤都具有明确的含义,不会出现二义性。

  可行性:算法的每一步都必须是可行的,也就是说,每步都能够通过执行有限次数完成。

算法设计的要求:

正确性:算法的正确性是指算法中至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。

正确性的层次:  

  1、算法程序没有语法错误。

  2、算法程序对于合法的输入数据能够产生满足要求的输出结果。

  3、算法程序对于非法的输入数据能够得出满足规格说明的结果。

  4、算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

可读性:算法设计的另一个目的是为了便于阅读、理解和交流。

健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。

时间效率高和存储量低:设计算法应该尽量满足时间效率高和存储量低的需求。

综上所述:好的算法应该具备正确性、可读性、健壮性、高效率和低存储的特点。

算法效率的度量方法:

  事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

  缺陷:

    必须依据算法编制好程序,往往需要花费大量的时间和精力。

    时间的比较依赖计算机硬件和软件等环境因素,有时候会掩盖算法本身的优劣。

    算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大的关系,效率高的算法在小的测试数据面前往往得不到体现。

  事前分析估计算法:在计算机程序编制前,一局统计方法对算法进行估算。

高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

  1、算法采用的策略、方法。

  2、编译产生的代码质量。

  3、问题的输入规模。

  4、机器执行指令的速度。

显然,第一条和第四条是我们无法控制的,撇开不谈,那么一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题的输入规模是指输入量的多少。

  在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤。

函数的渐进增长

  给定两个函数f(n)和g(n),如果存在一个整数N,当n>N时,f(n)总比g(n)大,那么,我们说f(n)的增长渐进快于g(n).

 分析以上的内容可以得出结论:

  我们比较算法的时间复杂度时,可以忽略加法常数,与最高次项相乘的常数并不重要。

  最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。

综上所述:判断一个算法的效率时,函数中的常数和其他次要的项常常可以忽略,而更应该关注主项(最高阶项)的阶数。

算法时间复杂度

  算法时间复杂度定义:  

    在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记

作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

  推导大O阶:  

    1、用常数1取代运行时间中的所有加法常数。

    2、在修改后的运行次数函数中,只保留最高阶项。

    3、如果最高阶项存在且不是1,则除去与这个项相乘的常数。

    最后得到的就是大O阶。

  常数阶 O(1)  线性阶 O(n)  对数阶 O(logn)  平方阶 O(n^2)

常见的时间复杂度  O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n).

数据结构看书笔记(二)--算法(Algorithm)简介的更多相关文章

  1. 《大象UML》看书笔记2:

    <大象UML>看书笔记2 抽象角度:                                                        在为现实世界建模的时候,首先要搞清楚有多 ...

  2. JavaScript看书笔记01

    JavaScript看书笔记... ------------------- JavaScript允许var定义语句出现在函数内部的任意位置.JS中使用Var来显示的给变量声明 JavaScript是一 ...

  3. spring笔记----看书笔记

    上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...

  4. Android Studio 学习笔记(二):布局简介和xmlns说明

    初学Android Studio,是在b站看的教程视频,这里的笔记也是以其为基础的,个人强烈安利: [天哥]Android开发视频教程最新版 Android Studio开发 Android 布局简介 ...

  5. 数据结构 浙大MOOC 笔记二 线性结构

    线性表及其表现 第二章的内容是关于三种最基本的数据结构 结合<DDSA>第三章 表.栈和队列做一个总结 首先简单说明一下各个数据结构的特点: 数组:连续存储,遍历快且方便,长度固定,缺点是 ...

  6. 《深入理解 JVM 虚拟机》 --- 看书笔记

    1.JVM 内存溢出 1.堆溢出:堆要不断的创建对象,如果避免了垃圾回收来清除这些对象,就会产生JVM内存溢出.一般手段是通过内存映像分析工具对Dump出来的堆转储快照进行分析,分清楚到底是内存泄露还 ...

  7. MySql笔记二:命令简介

    从笔记二开始讲解一些简单的命令,这些我在SQL Server里面都讲过了,什么主键,约束啥的数据库这些都是相通的,所以MySql这里,不讲,粗略过一遍. 使用命令框登录MySql mysql -u r ...

  8. JS红宝书笔记——第一章 JavaScript简介

    1.JavaScript简史 Netscape公司决定开发一种客户端语言用来处理浏览器端简单的表单验证. Netscape公司派布兰登·艾奇(BrendanEich)为计划于1995年2月发布的Net ...

  9. 精通javascript(看书笔记)

    变量的类型检查 //检测类型 var str = "Hello World"; if (typeof str=="string") {//使用typeof来判断 ...

随机推荐

  1. Java的四种内部类

    Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...

  2. strncpy,strcpy

    strncpy不会为des自动添加“\0” strcpy遇空结束,自动添加结束符 结论: 1.使用strcpy时一定不能用于无结束符的字符串,因为strcpy依赖\0判断源字符串的结束 2.使用str ...

  3. Linux Kernel Oops异常分析

    1.PowerPC小系统内核异常分析 1.1  异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...

  4. CSS笔记1

    一. 列表 列表是有三种形式 1.1   无序列表 无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" ...

  5. select 选择的制作

    我说的select选择是指 手机端的话,一般考虑元素 + 伪类制作 .checkbox{ border:1px solid #987;width:16px;height:16px; } .checkb ...

  6. 总结-php

    strtr('li.a-o_lo.n_g-jun', '-_.', '+/=')  好高级啊 在tomcat里使用php用quercus PHP in java  http://quercus.cau ...

  7. c# TimeSpan

    转自:http://blog.163.com/y_p_xu/blog/static/17085710220116472030543/ /// <summary>        /// 将时 ...

  8. 几何服务,cut功能测试

    关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...

  9. 一步一步来做WebQQ机器人-(五)(发送消息||完结)

    × 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个 ...

  10. rabbitmq method之basic.consume

    basic.consume指的是channel在 某个队列上注册消费者,那在这个队列有消息来了之后,就会把消息转发到给此channel处理,如果 这个队列有多个消费者,则会采用轮转的方式将消息分发给消 ...