算法快学笔记(一):算法入门

栏目: 编程工具 · 发布时间: 5年前

内容简介:“算法”一词在不同的书籍以及网站上可能会存在一些差异,但是下面的定义个人觉得最为贴切:在很多场景下,数据规模越大,越能体现优秀算法的价值,接下来将以猜数游戏为例进行说明优秀算法的重要性。假设 A随便想了一个1到100中的某个数字让B猜,B可以有两种方案:

1. 算法的定义

“算法”一词在不同的书籍以及网站上可能会存在一些差异,但是下面的定义个人觉得最为贴切:

1. 算法代表着用系统的方法描述解决问题的策略机制
2. 能够对一定规范的输入,在有限时间内获得所要求的输出
3. 一个算法的优劣可以用空间复杂度与时间复杂度来衡量

2. 论优秀算法的重要性

在很多场景下,数据规模越大,越能体现优秀算法的价值,接下来将以猜数游戏为例进行说明优秀算法的重要性。

假设 A随便想了一个1到100中的某个数字让B猜,B可以有两种方案:

  1. 简单查找:从1开始猜,一直猜到A想的数字为止。
  2. 二分查找:一半一半的猜,先猜50,如果小了,这时候就排除了1-50的数字!。接下来,你猜75,如果大了,就排除了75-100。以此类推。

接下来对两种方式进行说明与比较

2.1 简单查找

该方法的优点是简单,只需要从1一个个的猜,就一定能猜到。但是如果猜测数字的范围非常的大,且猜的数字非常靠后,将会使用较多的时间。

2.2 二分查找

二分查找是一种算法,其输入是必须是一个有序的元素列表。每次猜都从列的中间元素开始,如果大了,就过滤掉比猜测值小的那一半数字,反之亦然。

实现代码如下:

// 使用二分查找法,在有序列表intList中查找target,返回对应的索引
func BinarySearch(intList []int, target int) int {
	start := 0
	end := len(intList) - 1
	for {
		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表示法有以下几点需要注意:

  1. 大O表示法让你能够比较操作数,它指出了算法运行时间的增速,代表随着数据集的增加,算法所需时间的变化趋势。
  2. 大 O 表示法指出了最糟情况下的运行时间

下面按从快到慢的顺序列出了常见的5种大O运行时间:

  • O(log n),也叫对数时间,这样的算法包括二分查找。
  • O(n),也叫线性时间,这样的算法包括简单查找。
  • O(n * log n),这样的算法包括快速排序(一种非常快的 排序 算法)
  • O(n^2),这样的算法包括选择排序(一种非常慢的排序算法)。
  • O(n!),这样的算法包旅行商问题的解决方案-一种非常慢的算法。
  • 二分查找的速度比简单查找快得多。
  • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
  • 算法运行时间是从其增速的角度度量的。
  • 算法运行时间用大O表示法表示。

以上所述就是小编给大家介绍的《算法快学笔记(一):算法入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JAVA 2核心技术 卷Ⅰ

JAVA 2核心技术 卷Ⅰ

[美] 霍斯特曼、[美] 科奈尔 / 叶乃文、邝劲筠 等 / 机械工业出版社 / 2006-5 / 88.00元

本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。 本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员......一起来看看 《JAVA 2核心技术 卷Ⅰ》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具