找到基准条件,基准条件必须尽可能简单。
不断分解问题(或缩小其规模),直到满足基线条件。
DC不是一种可以用来解决问题的算法,而是一种解决问题的思想。
4.2 快速排序
使用DC解决问题,对数组进行快速排序。
step1首先判断最简单的情况(即基线条件) —— 空数组,或者只有1个元素的数组—— 这种数组不需要排序!
最简单的待排序数据#基线条件是数组为空或者只包含一个元素。在这种情况下,只需按原样返回数组——,根本不对其进行排序。
def 快速排序(数组):
iflen(数组) 2:
return arraystep2当情况比基线复杂一点时:有两个元素的数组—— 只需要比较两个元素的大小。
step3三元素数组:DC 的想法—— 分解数组,直到满足基线条件。
快速排序的方法是从数据中选择一个基准值,然后找到小于基准值的元素和大于基准值的元素。这相当于构造一个分区,形成:
所有小于基值的数字的子数组;基值;所有大于基值的数字的子数组。接下来要做的就是利用step2来解决。即三元素数组的快速排序步骤如下:
选择一个基值。将数组拆分为两个子数组:小于主值的元素和大于主值的元素。对这两个子数组进行快速排序。依此类推,对于包含4、5 或n 个元素的情况也是如此。
快速排序代码def 快速排序(数组):
iflen(数组) 2:
返回数组------基线条件:空数组或仅包含一个元素的数组是“有序的”
否则:
枢轴=array[0] ------递归条件
less=[i for i in array[1:] if i=hub] --------由所有小于或等于主元值的元素组成的子数组
Greater=[i for i in array[1:] if i hub] --------由所有大于主元值的元素组成的子数组
返回快速排序(较小)+ [枢轴] + 快速排序(较大)
print fastsort([10, 5, 2, 3])
4.3 快速排序的速度
快速排序的性能高度依赖于所选的基准值。如果选择的基准值合适,最佳速度可以达到O(NlogN),每层比较N次,层数由选择的基准值决定。
最坏的情况需要O(NN),这意味着每次选择的基值是最大值或最小值。
最坏情况- O(N) 最优情况- O(logN) 只要每次随机选择基准值,快速排序的平均运行时间就可以达到最优情况,即O(N*logN)。快速排序是最快的排序算法之一。
5 散列表
散列表,逐一进行,用于快速查找—— python中的字典实际上是一个哈希表!
5.1 散列表的基本用途
我们先看用法,再看哈希表结构。
模拟映射;防止重复;缓存/记住数据,以便服务器不会处理它以再次生成它。
5.2 散列表是什么样的
直接解释有点复杂。我们用一个问题来形容:类似于超市里的商品条码对应它的价格——
如果使用笔记本(无序)来记录,通常需要O(N)的时间来查找;如果是有序的,可以使用之前的二分法,大约需要O(logN)的时间;但通常我们去小商店买东西时,老板通常会立即告诉我们单价。他在“大脑”中形成映射,输出对应输出价格的商品名称——。
我们希望在商品较多的情况下仍然能达到这样的效果:输入商品,立即得到价格反馈——。这就像一个映射函数,在哈希表中称为哈希函数。
哈希函数是一种函数,无论您提供什么数据,它都会向您返回一个数字。 —— 哈希函数“将输入映射到一个数字”:满足两个条件,必须一致,即相同的输入得到相同的结果;它必须将不同的输入映射到不同的数字。
通过哈希函数将一个数组与另一个数组对应起来就形成了哈希表。
如果你不确定,就看一下Python的字典结构:
书=字典()
book["apple"]=0.67 ------一个苹果的价格是67 美分
book["milk"]=1.49 ------牛奶的价格是1.49 美元
书["鳄梨"]=1.49
印刷(书籍)
{"avocado": 1.49, "apple": 0.67, "milk": 1.49}
5.3 应用案例:
将散列表用于查找电话簿可以通过哈希表来实现。搜索速度接近O(1)时间。
电话本需要提供以下功能:
添加联系人及其电话号码。输入联系人的电话号码即可获取该号码。简单来说,使用python中的字典来创建这样的电话本是再完美不过了。
防止重复向列表添加数据时,只需检查是否在哈希表中即可。
# 防止双重投票的案例。
投票={}
def check_voter(姓名):
if voted.get(name):
打印“把他们踢出去!”
否则:
投票[姓名]=True
打印“让他们投票!”
check_voter("汤姆")
让他们投票吧!
check_voter("迈克")
让他们投票吧!
check_voter("迈克")
把他们踢出去!将散列表用作缓存
好了,文章到此结束,希望可以帮助到大家。
【深入浅出:算法原理与实例解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有人把算法讲明白了!
有15位网友表示赞同!
看着这些图表好清晰啊,比文字描述实在多了。
有16位网友表示赞同!
这下学习算法不那么可怕了!
有14位网友表示赞同!
我有点头晕数学符号,幸好这图解可以让我理解算法运作原理
有8位网友表示赞同!
想入门算法,这篇文章一定要看一遍!
有5位网友表示赞同!
原来算法运行是这么一种逻辑,太有意思了。
有5位网友表示赞同!
这些图形真好看啊
有14位网友表示赞同!
希望以后看到更多算法的图解,这样学习效率更高!
有15位网友表示赞同!
这个图解还蛮详细的,每个步骤都能看明白。
有15位网友表示赞同!
现在感觉机器学习一点也不吓人!
有14位网友表示赞同!
我之前总是对算法的定义一头雾水,看了这篇文章豁然开朗了。
有8位网友表示赞同!
非常好的入门指南!
有14位网友表示赞同!
这个图解很有帮助,让我更容易理解算法背后的机制。
有9位网友表示赞同!
算法的世界原来这么神奇啊!
有11位网友表示赞同!
下次再学习算法的时候,直接拿出图解来参考就好了!
有12位网友表示赞同!
真是太棒了!希望还能看到更多不同算法的图解视频!
有17位网友表示赞同!
我以前觉得算法很复杂,现在看来其实很有规律性。
有18位网友表示赞同!
这篇博文的图片真的很有创意,很直观易懂!
有13位网友表示赞同!
学习算法更简单了!
有9位网友表示赞同!
看了这篇文章让我对算法的认识加深了很多!
有7位网友表示赞同!