一.为什么要学习算法?

    先来个简单的算法比较:求sum=1+2+3+...+(n-1)+n的结果. 输入整数n,输出 sum 
      解法一:for循环

  function sum(n){var s=0;            //执行1次for(var i=1;i<n+1;i++){   s+=i;           //执行n+1次

     } 
    return s;            //执行1次  }

      解法二:

function sum(n){return n*(n-1)/2;    //执行1次}

    很明显,解法二要优于解法一。因为解法二需要运算的次数少。我们去衡量一个算法的好坏主要是从时间复杂度和空间复杂度来看的,其次才到可读性,可维护性。那么接下来讲讲怎么来计算时间复杂度与空间复杂度。

  二.时间复杂度的计算:

    推导大O阶来计时间复杂度

    规则:1.用常数1取代运行时间中的所有加法常数(即常数阶都计为O(1) );

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

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

    解法一的运行次数:  f1(n) = 1+n+1+1=n+3 次  时间复杂度记作 T(n) = O( f1(n) )  //n+3直接舍掉常数,变为n ,名为“线性阶”

     解法二的运行次数: f2(n) = 1次        时间复杂度记作 T(n) = O( f1(1) )  //名为“常数阶”

     由此可知解法一随n的增加,运行次数也增加,而解法二始终只需运行一次

    对数阶:

function count(n){var c=1;      //执行1次while(c<n){c=c*2;  //执行log2n
} return c; }

    也就是说2的多少次冪大于n,就运行了多少次。时间复杂度计做O(logn),名为对数阶。    平方阶:
function num(n){var count=0;for(var i=0;i<n;i++){  //执行 n 次for(var j=i;j<n;j++){count++;        //执行 n-i 次}}return count;
}

   以上代码执行总次数为n+(n-1)+(n-2)+...+1 = n2/2+n/2 次,用大O推导法去掉相加常数n/2,去掉相乘常数1/2,所以时间复杂度为O(n2)   总结:    时间复杂度有多种,这里是讨论常见的阶。常用的时间复杂杂耗时的时间从小到大依次为:    O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) <O(nn)

   扩展:最坏时间复杂度

    例:给出一个数组arr,里面有n个随机数,找出arr中的指定数字。那么这个数字有可能出现在数组中的第一个位置,时间复杂度为O(1);也可能出现在数组最后一个位置,时间复杂度为O(n) ,从概率来说,平均查找时间应该是n/2次。

    最坏时间复杂度从字面上就能理解,时间最长的情况,时间不会更长,情况不会更坏了。通常没有特殊说明,我们计算的时间复杂度都为最坏时间复杂度。    

  三.算法空间复杂度

    算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。S(n)=O(f(n)) 若算法执行时所需要的辅助空间相对于输入数据量n而言是一个常数,则称这个算法的辅助空间为O(1)。通常,我们用时间复杂度来衡量算法的优略。

转载于:https://www.cnblogs.com/zhoulin-circle/p/7413229.html

数据结构(二)之算法基础相关推荐

  1. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示

    Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...

  2. 程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币

    程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币 有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你找 ...

  3. 数据结构(二)算法基础与复杂度

    一.算法基础 1.算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 2.算法具有五个基本特性:输入.输出.有穷性.确定性和可行性. (1)输入输出:算 ...

  4. C语言数据结构-程序设计与算法基础II-电大同步进度

    第一讲-数据结构基础概念 https://blog.csdn.net/aiqq136/article/details/115209556 第二章线性表 https://blog.csdn.net/ai ...

  5. 北大郭炜教授《程序与算法(二)算法基础》学习笔记

    目录 第一章 枚举 例题一 完美立方 例题二 生理周期 例题三 称硬币 例题四 熄灯问题 第二章 递归(一) 例题一 求阶乘 例题二 汉诺塔 例题三 n皇后问题 例题四 逆波兰表达式 补充笔记(fro ...

  6. 程序设计与算法(二)--算法基础

    课程参考 mooc 北大郭炜老师 第一章 枚举 枚举:逐个的尝试答案 的一种问题求解策略 因为要一一举例,所以基本上都会用到循环(for ,while,switch,if 等等) 例题一:完美立方 形 ...

  7. 视觉惯性单目SLAM (二) 算法基础知识

    1. 基本概念 视觉惯性:Visual-Inertial (VI) VI ORB-SLAM:视觉惯性ORB-SLAM VI ORB-SLAM输入: IMU数据(用B表示,加速度:aB:角速度:ωB\m ...

  8. 程序设计与算法(二)算法基础1.4熄灯问题

    有一个由按钮组成的矩阵,其中每行有6个按钮,5行,共30个开关.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即,如果灯原来是点亮的,就会被 ...

  9. 程序设计与算法(二)算法基础7.5分蛋糕

    问题描述: 有一块矩形大蛋糕,宽和高分别是整数w.h. 现要将其切成m块小蛋糕,每个小蛋糕都必须是矩形,且宽和高均为整数.切蛋糕时,每次切一块蛋糕,将其分成两个矩形蛋糕.请计算:最后得到的n块小蛋糕中 ...

最新文章

  1. 安卓超过两行就加省略号_CSS文本超出2行就隐藏并且显示省略号
  2. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)
  3. python语言术语_python的一些术语
  4. 现在女生的床真的都是这样吗?
  5. MySQL于ON DUPLICATE KEY UPDATE采用
  6. 计算机网络中的传输协议是_计算机网络中的传输方式
  7. 你只会用 StringBuilder?试试 StringJoiner,真香!
  8. swift:自定义UICollectionViewFlowLayout
  9. select下拉框默认不能选择第一个选项的问题
  10. jni问题总结:jni error (app bug): accessed stale local reference
  11. 如果有一个工具可以帮助你将你的代码可视化,你需要吗?
  12. Java动态代理二——CGLIB动态代理应用
  13. 如何彻底删掉360安全卫士,删除顽固的DLL文件
  14. 什么是OFD格式文档?一文教你读懂OFD格式文档
  15. MATLAB db4小波分解与重构,语音降噪
  16. keil5工程函数无法跳转到函数定义解决方法
  17. 2019杭电多校训练营(第一场)
  18. MWC 2017:S8缺席,三星祭出AR/VR项目救场
  19. 安装最新版Calico
  20. Workfine5.0扩展功能——如何识别身份证信息?

热门文章

  1. stylus之混合书写(Mixins)
  2. 机器学习基础--一些基本的概念
  3. 20191215周学习总结
  4. Scrapy+ Selenium处理广告
  5. 小白兔生小白兔-菲波拉契数列问题
  6. ThinkPHP 3.2.3 关联模型的使用
  7. 【转】一句话的设计模式
  8. 解题报告 百进制数
  9. C# 的Delegate(委托)
  10. rocketmq 初探(三)