算法图解

《算法图解》各章学习

1、算法简介

二分法

二分查找法,用于有序元素列表,以一半为界分开,确定元素在哪一部分,继续前述操作。速度最快,包含n个元素时为 $ \log_2 n$

大O表示法

用于表示算法的速度,O()。真正的速度需要乘以时间常数c,一般分析时不考虑。


2、选择排序

数组

数组在内存中储存的信息是连在一起的,方便读取操作。

链表

链表的信息在内存中是无序的,下一个内存地址由上一个内存中的信息给出,方便插入和删除操作。

选择排序

不断遍历整个无序列表,将元素有序排列出来,速度为O(n×n)或O(n²)
(大O表示法省略常数)


3、递归

递归:自己调用自己的函数。
递归函数条件:基线条件和递归条件,递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己(例如设置调用次数),从而避免形成无限循环。

栈(stack)

调用栈有压入和弹出两个操作,都只操作最上面的内存块,而不是压入底部的内存。所有函数调用都进入调用栈。
递归时函数不断将同名不同参考值的函数压入调用栈,使用时弹出。因此调用栈可能很长,这将占用大量的内存。


4、快速排序

D&C算法思想:找出简单的基线条件,)确定如何缩小问题的规模,使其符合基线条件。
因此处理列表时基线条件很可能是空数组或只包含一个元素的数组。

快速排序

方法:首先在数组中选择一个元素作为基准值。接下来,找出比基准值小的元素以及比基准值大的元素各自分为两个子数组。对子数组进行基准值→子数组的递归,直到子数组中只剩1个或没有元素停止(基线条件)。最后左边的数组 + 基准值 + 右边的数组合并为排序结果。
算法速度:实现快速排序时,随机地选择用作基准值的元素。快速排序的平均运行时间为 O ( n log ⁡ n ) O(n\log n) O(nlogn),也是最佳情况下的时间,最坏情况(取到了数组中最大或最小的基准值)运行时间是O(n²)。


5、散列表

散列函数

数据的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应,因此散列函数可以直接确定元素的储存位置。

散列表(hash table)

使用散列函数和数组创建了一种被称为散列表 (hash table)的数据结构。Python提供的散列表实现为字典 ,使用函数dict()来创建散列表。
用途:除了快速查找数据以外,还可以用于映射关系,缓存数据(例如,在Web服务器上),防止重复等。
冲突:在散列表中,不同的关键字值对应到同一个存储位置的现象。
处理方法:(1)在冲突的位置储存一个链表,极端情况链表很长造成散列表的速度很慢。(2)降低填装因子,使每个关键字都有自己的储存位置,一旦填装因子超过0.7,就该加长散列表的长度。(3)良好的散列函数让数组中的值呈均匀分布。
性能:散列表的查找、插入、删除在理想情况下均为常量时间O(1).在冲突很多的情况下,速度变慢,最差情况性能变化为线性时间O(n)。


6、广度优先搜索

图由节点和边组成。使用图来创建问题模型,使用广度优先搜索解决问题。
广度优先搜索可回答两类问题,从节点A出发,有前往节点B的路径吗;从节点A出发,前往节点B的哪条路径最短。

队列

队列类似于栈,你不能随机地访问队列中的元素。队列是一种先进先出 (First In First Out,FIFO)的数据结构,而栈是一种后进先出的数据结构。队列只支持两种操作:入队和出队 。
在Python中,可使用函数deque()来创建一个双端队列。

广度优先搜索算法

(1)建立图模型,在这里,要将节点映射到其所有邻居,如graph["you"] = ["alice", "bob", "claire"]以此类推;
(2)创建队列,将所有一度关系对象加入队列,取出队列的第一个元素并检查,符合要求结束,不符合则将这个节点的一度关系对象加入队列;
(3)继续按顺序检查队列(否则找到的就不是最短路径),直到队列为空或找到需要搜索的对象。检查队列时同时将检查过的对象放入数组中,防止二次检查浪费时间。

def search(name):
  search_queue = deque()
  search_queue += graph[name]
  searched = []-------------------
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值