从零带你入门数据结构和算法(1)

本章目录:

1.什么是算法?
2.便捷的查找方法——二分查找
3.运行时间
4.大O表示法

1.什么是算法?

简单说来,算法就是用来解决实际问题的方法。而在编程世界中,任何代码片段都可以看作是算法。算法的种类复杂多样,在这里我们要谈的,是那些速度快,或者能解决问题,或者兼而有之的算法。

在学习这些算法的同时,我们要分析这种算法的优缺点,为以后的学习打好基础。

2.便捷的查找方法——二分查找

我们肯定都玩过猜数游戏。这个游戏的规则是让对方从1~100随机选一个数,你来猜这个数。当你猜了一个数字之后,对方只能告诉你大了或者小了,或者对了。

有的人运气好一下子就猜出来了。
有的人一个一个的猜,猜了100次,终于猜了出来。

有没有一种更简洁的方法?

我们试试从中间开始猜,也就是从50开始猜。那么当50大了或者小了,有一半的区域会被切除。我们再将剩下一半的区域再取中间,也就是75或者是25,这样循环往复。

直到最后一个数字,我们会发现,就算我们运气再差,整个过程我们也一共只猜了七次。

也就是说,直到我们猜中结果最多需要七次。相比之前的一个一个猜的方法,少了九十多次。

这两种都是算法,我们称之为简单查找和二分查找。毫无疑问,二分查找更省时间。当所处理的数据更多的时候,这种优势会更明显的被显现出来。

那么,这其中有什么规律?

3.运行时间

一般而言,在程序设计过程中,应该选择效率最高的算法以最大程度减少内存的消耗和占用的空间。

回到前面的二分查找中,我们发现,在100个数中查找一个数最多需要7次,经由计算我们发现,在两个数中,查找一个数最多需要一次;四个数需要两次;八个树需要三次;由此我们可以得出一个结论,如果我们要从n个数中使用二分查找寻找一个数,那么我们最多需要logn次。

(这里的logn是以2为底n的对数。)

如果使用简单查找,最多需要查找的次数与数据量相同,我们称之为线性时间;而使用二分查找,需要查找次数是logn次,我们称之为对数时间。

4.大O表示法

在实际运用中,我们使用大O表示法,来表示算法的运行速度。例如前面的例子中,如果我们使用简单查找,那么他的运行时间为O(n)。有人就问,既然是速度,那么他单位是什么?

实际上,大O表示法并不是以时间为单位的速度,他能够让你通过对比括号里的操作数,来比较两个算法增速的不同。

如果我们用大O表示法来表示前面的游戏,那么简单查找的运行时间为O(n),二分查找的运行时间为O(n)。

但是,有的人运气极佳,他用简单查找,第一次就找到了这个数字,那么是不是O(1)?

这里注意,大O表示法指出的是最糟糕情况下的运行时间。你不可能每次运气都这么好,所以我们要做最坏的打算。这是一个保证,保证你的算法运行时间不会超过O(n)。

接下来我们可以列举一下集中比较常见的大O运行时间;
O(logn),对数时间,例如二分查找;
O(n),线性时间,例如简单查找;
O(nlogn),例如快速排序。
O(n
n),例如选择排序。
O(n!),例如旅行商问题,非常慢。

这几种运行时间从上到下依次变慢,且随着数据量增大越来越明显。

接下来介绍旅行商问题(非常慢的算法)。

有一个商人,要经过五个城市。他想寻找一种最简单的路径,因此他必须考虑各种顺序。对于每种顺序都进行计算操作,那么5个城市一共需要120次操作,涉及6个城市则需要720次操作,涉及n个城市则需要n!次操作。

可对于这个复杂的问题,还没有更简便的运算方法。

总结一下;
1.二分查找要比简单查找快的多。

2.O(logn)要比O(n)快,需要搜索的元素越多,前者比后者就快的越多。

3.算法运行时间并不以秒为单位。

4.算法运行时间是从其增速的角度度量的。

5.算法的运行时间用大O表示法表示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值