一、学习算法必要性why:

应用:机器学习、数据挖掘、自然语言处理、密码学、计算机图形学等

找工作:贪心、分治、动态规划、树、图等.

二、怎么做how?

  • 穷举法(万能算法)

求N个数的全排列

8皇后问题

  • 分而治之(减而治之)

二分查找——减而治之

归并排序——分而治之

  • 贪心

最小生成树 Prim, Kruskal

单源最短路 Dijkstra

  • 动态规划

背包

士兵路径

三、时间、空间复杂度

常见时间复杂度分析方法

  • 数循环次数
  • 均摊分析
  • 递归式——主定理

• O(1)   基本运算,+,-,*,/,%,寻址

• O(logn)   二分查找

• O(n1/2)   枚举约数

• O(n)    线性查找

• O()    朴素最近点对

• O(n3)    Floyd最短路、普通矩阵乘法

• O(nlogn)    归并排序、快速排序的期望复杂度、基于比较排序的算法下界

• O(2n)   枚举全部的子集

• O(n!)    枚举全排列

• 总结:

优秀 O(1) < O(logn) < O(n1/2) < O(n) < O(nlogn)

可能可以优化 O() < O() < O() < O(n!)

证明:O(nlogn)是基于比较的算法时间复杂度的下限

因为排序就是排列组合中的一种,总的组合次数是n!种,每一次比较如i<j即可排除一半的组合,

所以当比较了k次,即>n! 所以k>ln(n!)     ln(n!) < ln()  所以k> nln(n) 所以O(nlogn)是下限

四、时间复杂度的均摊分析

  • 多个操作,一起算时间复杂度,MULTIPOP的队列,可以一次性出队k个元素,每个元素只出入队列一次
  • 动态数组尾部插入操作(vector)一旦元素超过容量限制,则扩大一倍,再复制原来的数组,再释放原数组空间

所以vector当插入n个元素时,可能发生复制的次数是1+2+4+8+.....+ 次 = 2*-1次=O(2n)   所以插入n个数时间复杂度是 O(n);所以插入一个元素的时间复杂度是O(1),所以vector特别快,值得学习。

五、例题1:

• 给定数组a[1…n],求最大子数组和,即找出1<=i<=j<=n,使a[i]+a[i+1]+…+a[ j]最大,LeetCode第53题,最大子序和

• 介绍三个算法

  1. 暴力枚举 O(n3)
  2. 优化枚举 O(n2)
  3. 贪心法 O(n)

要求:手写暴力枚举算法必须会;暴力枚举:三重循环,时间复杂度 O(n3) 附加空间复杂度 O(1)

for i = 1 to n

for j = i to n

sum = a[i]+..+a[j]

ans =max(ans, sum)


class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int ans = nums[0];for(int i = 0; i < n; ++i){for(int j = i; j < n; ++j){int sum = 0;for(int k = i; k <= j; ++k){sum += nums[k];if(sum > ans){ans = sum;}}}}return ans;}
}

重点:优化过程就是解决重复计算的过程上述存在i...j的求和与i....j,j+1的求和,存在i...j求和的重复,所以i....j,j+1 = sum(i....j) + nums[j]即可,提前记录sum(i....j)和,优化如下

优化枚举:两重循环

for i = 1 to n

sum = 0

for j = i to n

sum = sum + a[j]

ans = max(ans, sum)

时间复杂度 O(n2) 附加空间复杂度 O(1)

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int ans = nums[0];for(int i = 0; i < n; ++i){int sum = 0;for(int j = i; j < n; ++j){sum += nums[j];if(sum >= ans){ans = sum;}}}return ans;}
}

贪心法:一重循环

sum = 0 ans = 0

for i = 1 to n

sum = sum + a[i]

ans = max(sum, ans)

if (sum < 0) sum = 0

时间复杂度 O(n) 附加空间复杂度 O(1)

class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;int n=nums.length;for(int i=0; i< n; i++){sum += nums[i];if(sum > ans){ans = sum;}if(sum < 0){sum = 0;}}return ans;}
}

例题2:设计一个队列;支持:出队,入队,求最大元素;要求O(1);均摊分析

例题3:给定一个正整数组a,是否能以3个数为边长构成三角形?即是否存在不同的i,j,k,

• 满足 a[i] < a[ j] + a[k]

• 并且 a[ j] < a[i] + a[k]

• 并且 a[k] < a[i] + a[ j]

学习算法第一天:算法初步相关推荐

  1. 算法图解第一章——算法简介

    目录 前言 一.算法简介 1.引言 1.什么是算法 2.需要具备的知识 2.二分查找 1.什么是二分查找 2.举个例子,猜数字 3.对数函数 3.大 O 表示法 1.定义 2.一些常见的大 O 运行时 ...

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

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

  3. 第一个算法项目 | JS实现并查集迷宫算法Demo学习

    0 参考链接 并查集,不就一并和一查? 520,花了一夜给女朋友写了个走迷宫游戏 点击下载并查集迷宫算法JS代码 1 JS代码修改运行方法 首先下载的文件夹如下: 双击打开maze.html文件. 键 ...

  4. 【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法

    第一种就是纯粹的暴力枚举起始.终点. O(n^3) 第二种在第一种的基础上先进行初始化,将以第一个元素为起点,所有元素为终点的所有子列和存储在S数组中,所以在第三层循环中计算子列和是直接用S[j]-S ...

  5. 《算法导论》学习笔记第一章

    这本书已经买了将近两个个月了,可惜我没看过.今天开始看了,毕竟不积跬步无以至千里,我也是有理想.抱负的少年郎.闲话少叙,切入正题.晚上临睡前看书及打代码共两小时,以后每天坚持. 今天看到第12页,把第 ...

  6. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  7. 数据结构和算法 | 第一部分第二课:小鸭子们去旅行

    作者 谢恩铭,公众号「程序员联盟」. 转载请注明出处. 原文:https://www.jianshu.com/p/31d14bd080d4 内容简介 引出算法复杂度的故事 两种算法 两种算法的对比 第 ...

  8. 学习笔记之——基于深度学习的目标检测算法

    国庆假期闲来无事~又正好打算入门基于深度学习的视觉检测领域,就利用这个时间来写一份学习的博文~本博文主要是本人的学习笔记与调研报告(不涉及商业用途),博文的部分来自我团队的几位成员的调研报告(由于隐私 ...

  9. CORL: 基于变量序和强化学习的因果发现算法

    深度强化学习实验室 官网:http://www.neurondance.com/ 论坛:http://deeprl.neurondance.com/ 来源:诺亚实验室 华为诺亚方舟实验室.西安交通大学 ...

  10. [学习笔记] [机器学习] 8. 聚类算法(聚类算法:K-means、K-means++;聚类算法评估;特征降维:特征选择(Pearson相关系数、Spearman相关系数)、PCA主成分分析)

    视频链接 数据集下载地址:无需下载 1. 聚类算法简介 学习目标: 掌握聚类算法实现过程 知道 K-means 算法原理 知道聚类算法中的评估模型 说明 K-means 的优缺点 了解聚类中的算法优化 ...

最新文章

  1. JAVA第二次验证设计性实验报告
  2. 你不应该关注区块链的“杀手级应用”
  3. PyTorch踩过的12坑 | CSDN博文精选
  4. c++ 类中静态变量 static
  5. 被惊艳到了!适用 Win、Mac、Linux,酷炫的极客界面 eDEX-UI
  6. echo count(“abc”); 输出什么?
  7. node.js——sequelize-auto模块生成数据库models及使用
  8. [Effective Java]第二章 创建和销毁对象
  9. 哈工大中文分词系统LTP(pyltp)学习笔记
  10. Db4o数据库:细说查询
  11. 谷歌logo的“前世今生”
  12. 主曲率,主方向,高斯曲率与平均曲率公式与matlab代码
  13. 使用EasyPoi导出word并转换为pdf
  14. Sass系统技术选型笔记(1)OS
  15. 创业有感-表达能力很关键
  16. JAVA:实现PigeonholeSort鸽巢排序算法(附完整源码)
  17. android 日历翻页动画,Android开源库合集:轻松实现Android动态,炫目:日历效果...
  18. 为什么苹果要出7寸的iPad mini?
  19. [Unity3D]-协程的介绍和使用
  20. MySQL数据库基础01 韩顺平 自学笔记

热门文章

  1. python 刷微信跳一跳分数遇到的bug
  2. 基于快应用的音乐播放器
  3. prent()和prents()的区别
  4. 华纳云:MySQL数据丢失的原因是什么及怎么解决
  5. 自古猛兽皆独行,唯有牛羊结成群
  6. python可视化图表分析---pyecharts库的使用
  7. win8下去除QQ聊天窗口的广告
  8. Matlab实现小波变换
  9. BUUCTF:[UTCTF2020]sstv
  10. 完爆90%的性能毛病,收好数据库优化八大通用绝招