算法快学笔记(一):算法入门
1. 算法的定义
“算法”一词在不同的书籍以及网站上可能会存在一些差异,但是下面的定义个人觉得最为贴切:
1. 算法代表着用系统的方法描述解决问题的策略机制
2. 能够对一定规范的输入,在有限时间内获得所要求的输出
3. 一个算法的优劣可以用空间复杂度与时间复杂度来衡量
2. 论优秀算法的重要性
在很多场景下,数据规模越大,越能体现优秀算法的价值,接下来将以猜数游戏为例进行说明优秀算法的重要性。
假设 A随便想了一个1到100中的某个数字让B猜,B可以有两种方案:
- 简单查找:从1开始猜,一直猜到A想的数字为止。
- 二分查找:一半一半的猜,先猜50,如果小了,这时候就排除了1-50的数字!。接下来,你猜75,如果大了,就排除了75-100。以此类推。
接下来对两种方式进行说明与比较
2.1 简单查找
该方法的优点是简单,只需要从1一个个的猜,就一定能猜到。但是如果猜测数字的范围非常的大,且猜的数字非常靠后,将会使用较多的时间。
2.2 二分查找
二分查找是一种算法,其输入是必须是一个有序的元素列表。每次猜都从列的中间元素开始,如果大了,就过滤掉比猜测值小的那一半数字,反之亦然。
实现代码如下:
// 使用二分查找法,在有序列表intList中查找target,返回对应的索引
func BinarySearch(intList []int, target int) int {start := 0end := len(intList) - 1for {if end <= start {break}mid := int((start + end) / 2)if intList[mid] == target {return mid}// 如果mid处的值大于目标值,就在mid之前的数据中搜索if intList[mid] > target {end = mid-1}// 如果mid处的值大于目标值,就在mid之后的数据中搜索if intList[mid] < target {start = mid+1}}return -1
}
2.3 简单查找VS二分查找
如果列表包含100个数字,简单查找的方式可能要找100次才能找到结果,而二分查找法由于每次查找都会过滤掉一半的数据,因此最多只需要7次(log100)就能找到结果。这个级别的数据,结果看起来差距还不是很大。
如果列表包含40亿个数字,简单查找的方式可能要找40亿次才能找到结果,而二分查找法最多只需要32次(log40亿)就能找到结果。这个级别的数据,差距就比较可观了。
假设B一秒钟能猜10个数字,通过简单查询要猜4629(40亿/10 秒)天,而通过二分查找只需要4秒(log40亿/10 秒)。
有上面的例子可以看出,一个优秀的算法是多么的重要!
注意:log指的都是log2
大O表示法
大O表示法指出了算法有多快(O为操作数:Operations)。例如,假设列表包含n个元素。简
单查找需要检查每个元素,因此需要执行n次操作,使用大O表示法,
这个运行时间为O(n)。二分查找需要执行log n次操作,使用大O表示法的运行时间为 O(log n)。
关于大O表示法有以下几点需要注意:
- 大O表示法让你能够比较操作数,它指出了算法运行时间的增速,代表随着数据集的增加,算法所需时间的变化趋势。
- 大 O 表示法指出了最糟情况下的运行时间
下面按从快到慢的顺序列出了常见的5种大O运行时间:
- O(log n),也叫对数时间,这样的算法包括二分查找。
- O(n),也叫线性时间,这样的算法包括简单查找。
- O(n * log n),这样的算法包括快速排序(一种非常快的排序算法)
- O(n^2),这样的算法包括选择排序(一种非常慢的排序算法)。
- O(n!),这样的算法包旅行商问题的解决方案-一种非常慢的算法。
总结
- 二分查找的速度比简单查找快得多。
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
- 算法运行时间是从其增速的角度度量的。
- 算法运行时间用大O表示法表示。
算法快学笔记(一):算法入门相关推荐
- 算法快学笔记(九):红黑二叉树
转载自:https://www.tianxiaobo.com/2018/01/11/红黑树详细分析/ 1.红黑树简介 红黑树是一种自平衡的二叉查找树,是一种高效的查找树.它是由 Rudolf Baye ...
- 算法快学笔记(十三):狄克斯特拉(Dijkstra)算法原理与实现
1. 简介 广度优先算法可以找出段数最少的路径,但是对于路径上带权重的图,想要找出最快的路径,则需要使用狄克斯特拉算法. 2. 原理 为了说明狄克斯特拉算法的原理,使用换钢琴的的例子来做说明. 假设R ...
- 算法快学笔记(五):散列表
1. 介绍 当需要根据给定的值需要快速得到想要值的时候,散列表是一个非常有用的数据结构,假设你在一家杂货店上班.有顾客来买东西时,你得在一个本子中查 找价格,如果本子的内容不是按字母顺序排列的,你可以 ...
- des算法java_Java加密算法笔记--DES算法实现
Java加密算法笔记--DES算法实现 在使用中发现,经过加密的字符串如果要进行传输,需要使用Base64进行编码,这样能保证加密信息的完整性,确保将来解密成功. import java.securi ...
- 【数据结构与算法】学习笔记-《算法笔记》-7
查找元素 找x #include <cstdio> #include <cstring> #include <cmath> using namespace std; ...
- 算法训练营学习笔记1
算法训练营学习笔记 贪心算法 心算法总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案.从问题的初始解开始,一步歩地做出当前最好的选择,逐步逼近问题的目标,尽可能得到最优解: 贪心本质 ...
- 计算机视觉算法——Transformer学习笔记
算机视觉算法--Transformer学习笔记 计算机视觉算法--Transformer学习笔记 1. Vision Transformer 1.1 网络结构 1.2 关键知识点 1.2.1 Self ...
- 新手如何学习算法?算法如何入门以及零基础入门算法应该学些什么?
搬运工,看到一篇关于算法学习之路的总结,希望对你有帮助. 原文链接:zh.lucida.me/blog/on-le 我的算法学习之路 MAY 4TH, 2014 | COMMENTS 关于 严格来说 ...
- 新手收入学习算法?算法如何入门以及零基础入门算法应该学些什么?学习路线是什么...
作者:周末 链接:https://www.zhihu.com/question/27984119/answer/39116336 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- PSO算法文献阅读笔记
粒子群算法读书笔记精读 2020<电子信息学报>基于非线性降维的自然计算方法 孙小晴(2020-04-28) 1针对问题 高维大规模优化问题,陷入局部最优与收敛速度和时间复杂度的矛盾. 2 ...
最新文章
- Lua(Codea) 中 table.insert 越界错误原因分析
- JAVA NIO存在的问题
- Python:Django开发函数笔记:
- Python3字符串的编码
- mysql 连接 中文_大佬们E语言连接MYSQL输出中文乱码怎么破
- 辅助类KeyNode
- 一文教你掌握 ZooKeeper 核心知识
- java visitor_java11教程--接口FileVisitor用法
- java boolean if_Java if(boolean)和if(boolean=true)区别解析
- bestcoder #66
- linq To Xml 用法简介
- js 效果 大记事-横向-重播
- MASM8.0 下载安装方法
- 中国象棋,源码,开发,毕业设计,go,qt,c++,gin,游戏,残局,悔棋,人机,网络对战,双人
- 如何查找Steam好友代码(以及添加好友代码)
- Autodesk 专用安装检查和卸载程序
- java gdal_gdal java环境配置
- 什么是缓存预热和热备?
- 显卡的基本作用是控制计算机的什么,计算机的独立显卡有什么功能?
- 微信公众号都有哪些营销技巧