[数据结构与算法] 2,算法

原创 2016年08月29日 13:16:28

1 算法

算法是解决特定问题的求解步骤描述,在计算机中表现为有限的指令序列,每个指令代表一个或者多个操作。


2 选择一门好算法的重要性

问题:求1+2+3+...+100的结果。

方法1:for循环1到100。f(n) = n

int i ,sum = 0;
for (i=1;i<=100;i++) {
  sum+=i;
}
方法2: f(n) = 1


这两种方式对比,结果显而易见,方法2只需要一行代码便可以实现。选择一门好的算法对于程序运行的高效性至关重要。

3 算法的基本特性:输入,输出,有穷,确定,可行

3.1 输入输出:算法具有任意个输入,但是具有至少一个输出,输出包括打印或者返回值。

3.2 有穷:算法执行完有限步骤之后,自动结束而且不会出现死循环,并且每个步骤在可接受的时间内完成。

3.3 确定:算法的每个步骤都具有确定的含义。

3.4 可行:算法的每一步都是可行的,并且执行完成之后得到正确的结果。


4 算法的设计要求

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

4.2 可读性:算法设计同时也要便于阅读,交流以及理解。

4.3 健壮性:一个好的算法应该同时还能够对不合法的输入做出合适的处理,比如输入的时间跟距离不应该是负数。而不是产生莫名其妙的输出结果。

4.4 时间效率低存储量低:如果多个算法都能够解决同个问题,那么应该优先选择时间花费少的那个以及执行过程中占用存储空间少的算法。

      时间效率:算法的执行时间。存储量:算法执行过程需要的存储空间。


5 算法效率的度量方法

算法的描述:


事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。一般算法消耗的时间取决于以下因素:

5.1 算法采用的策略,方法;(根本)

5.2 编译产生代码的质量;(软件的有关因素)

5.3 问题的输入规模;

5.4 机器执行指令的速度。(硬件有关因素)

抛开软硬件因素,我们可以知道算法的效率跟问题输入规模以及算法的好坏有十分紧要关系。

测试算法运行时间就是计算对运行时间由消耗的基本操作的执行次数,运行时间跟执行次数成正比。(不计循环索引的递增和循环的终止条件,变量的声明,打印语句)

于是我们将基本操作的执行次数表示成输入规模的函数。如下图:


6 函数的渐近增长


当n=4之后,算法4n+8的执行次数少于2n^2+1,我们就说,当n=4,算法C的渐近增长慢于D。

函数的渐近增长:给定函数f(n),g(n),如果存在整数N,当n>N, g(n)>f(n),我们说g(n)的渐近增长快于f(n)



我们可以知道判断一个函数的执行效率的时候,我们主要关于主项,也可以忽略与最高次项相乘的常数,也就是最高次项。


7 算法的时间复杂度

7.1 算法的时间复杂度,也就是算法的时间量度,记做T(n)=O(f(n)),它表示随着问题规模的n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,其中f(n)是问题规模的某个函数。这样O()来体现时间复杂度,我们称作大O记法。


7.2 推导时间复杂度


7.3 常数阶 O(1)


7.4 线性阶 O(n)

int i ,sum = 0;
for (i=1;i<=100;i++) {
  sum+=i;
}
7.5 对数阶 O(log2n), 2^x=n -> x=log2n


7.6 平方阶 O(n^2)

7.7 时间复杂度计算方法示例


8 常见的时间复杂度



9 最坏情况和平均情况

最坏情况是运行时间的保证,运行时间不可能超过最坏情况,这也是一个重要的需求,通常除非特别指定,不然我们所说的都是最坏情况。

平均运行时间在所有情况中最有意义,他是期望的运行时间,但是实际中很难分析得出。

10 算法的空间复杂度

有时候,我们常常可以用空间来换取时间,通过耗费更大的内存空间来换取更少的运行时间。

算法的空间复杂度是通过计算算法所需的空间。计算公式:S(n) = O(f(n)),n为问题的规模,f(n)是关于n的所占空间存储的函数。

算法分析主要还是时间复杂度。









版权声明:本文为博主原创文章,未经博主允许不得转载。

我的软考之路(四)——数据结构与算法(2)之树与二叉树

上篇博文主要介绍的是数据结构的线性结构,我们这篇博文介绍非线性结构—树与二叉树,我先介绍树的一些基本概念,树的遍历,再介绍二叉树相关概念和特性,以及二叉树的遍历,最后再树与二叉树的对比,总结。    ...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年04月25日 08:16
  • 9559

挑战程序设计竞赛2 算法和数据结构 读后感

介绍 本篇主要是讲《挑战程序设计竞赛2 算法和数据结构》书的读后感和部分题目的再次解读、编程。包括书中的部分代码和一些个人的见解。如果想深入了解,建议去网上买一本回来看,比较适合学习算法的初学...
  • u013075699
  • u013075699
  • 2017年12月21日 22:22
  • 69

数据结构中常用算法

排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法) 以下程序给出了各种算法的实现,其接口为void sort...
  • ProgramVAE
  • ProgramVAE
  • 2016年12月02日 16:55
  • 473

如何学好数据结构和算法

数据结构和算法是计算机科学中最重要的课程,作为一名Google的软件工程师,我经常看到一些求职者或刚毕业的学生,他们对于数据结构和算法的学习是远远不够的。这不是说他们看的书是有问题的,或教授们教错了内...
  • liuyi1207164339
  • liuyi1207164339
  • 2015年09月09日 10:22
  • 1388

为什么说程序=算法+数据结构!

没有算法的程序,只是一些代码的堆砌,谈不上是一个优秀的软件。 算法是软件的灵魂,得益于好的算法会给软件带来的往往都是质的变化,性能都是呈指数倍提高滴。 算法比较厉害的~去做大数据分析,数据挖掘,数值分...
  • sdewenking
  • sdewenking
  • 2016年06月20日 22:27
  • 5650

数据结构和算法的选择

本部分总结前面介绍的数据结构和算法,并讨论在不同的情况下如何进行选择。 通用数据结构:数组、链表、树、哈希表 专用数据结构:栈、队列、优先级队列 排序:插入排序、希尔排序、快速排序、归并排序...
  • zhangyuehuan
  • zhangyuehuan
  • 2014年03月28日 15:21
  • 18098

数据结构和算法经典100题-第1题

说在开头的话:如果拿金庸武侠做个比喻,数据结构和算法的学习就好比是程序员内功。内功的修炼往往不能一蹴而就,需要水滴石川。在博客中的这个分类中,专门记录我在数据结构和算法中的修炼。希望数据结构和算法的武...
  • bobkentblog
  • bobkentblog
  • 2015年03月26日 17:48
  • 1147

数据结构和算法学习之路

这篇文章讲了什么? 我这些年学习数据结构和算法的总结。 一些不错的算法书籍和教程。 算法的重要性。 初学 第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让...
  • a_long_
  • a_long_
  • 2016年03月18日 14:29
  • 4162

常见数据结构算法题目

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。       10    / \ ...
  • u011474634
  • u011474634
  • 2013年11月30日 19:54
  • 679

Java基础数据结构和算法

数据结构 Array数组 和C/C++以及其他语言一样,Java中的数组有差不多一样的语法。只是Java中除了8中基本类型,数组也是作为对象处理的,所以创建对象时也需要使用new关键字。和大多...
  • ada_dengpan
  • ada_dengpan
  • 2016年04月22日 22:46
  • 22462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构与算法] 2,算法
举报原因:
原因补充:

(最多只允许输入30个字)