《算法图解》---笔记

第1章 算法简介

二分查找,每次都会减少一半,对于n个元素,使用二分查找最多需要log2n即可找到对应的值
二分查找必须是有序的

在这里插入图片描述
大O表示法指出了算法有多快。
大O表示法指出了最糟糕情况下的运行时间

快到慢的常见5种大O运行时间:
O(logn) < O(n) < O(n * logn) < O(n^2) < O(n!)

第2章 选择排序

两种最基本的数据结构—数组和链表

数组:

存储连续的数据
数组的查找效率很高,可迅速找到数组的任何元素

链表:

元素可以存储在内存的任何地方。每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
链表查找效率没有数组高,查找链表,需要从头开始,一个一个查找。

当需要在中间插入元素时,链表是更好的选择
删除元素,链表也是更好的选择

在这里插入图片描述

第3章 递归

如果使用循环,程序的性能可能更高;
如果使用递归,程序可能更容易理解。

由于递归函数调用自己,因此编写这样的函数时很容易出错,导致无限循环。
编写递归函数时,必须告诉它何时停止递归。

第4章 快速排序

分而治之(divide and conquer D&C):一种著名的递归式问题解决方法

递归 -> 分而治之 -> 快速排序

如何将一块168 x 64的地均匀地分成正方形,并确保分出的方块是最大的?

D&C不止可用于解决问题的算法,更是一种解决问题的思路。

第5章 散列表

散列函数总是将同样的输入映射到相同的索引
散列函数将不同的输入映射到不同的索引

散列函数和数组,创建了一种被称为 散列表(hase table)的数据结构

散列表也被称为:散列映射、映射、字典、关联数组

处理冲突的最简单的方法:如果两个键映射到了同一个位置,就在这个位置存储一个链表

  • 最理想的情况:散列函数将键均匀地映射到散列表的不同位置
  • 如果散列表存储的链表很长,散列表的速度将急剧下降。然而,如果使用的散列函数很好,这些链表就不会很长
  • 散列函数很重要,好的散列函数很少导致冲突。

在这里插入图片描述

第6章 广度优先搜索

图由 节点 和 边 组成
一个节点可能与众多节点直接相连,这些节点被称为邻居。

解决最短路径问题的算法被称为:广度优先搜索
广度优先搜索可回答两类问题:

  1. 从节点A出发,有前往节点B的路径吗?
  2. 从节点A出发,前往节点B的哪条路径最短?

队列:先进先出(FIFO),只支持两种操作:入队和出队
栈:后进先出(LIFO)

有向图中的边为箭头,箭头的方向指定了关系的方向
无向图中的边不带箭头,其中的关系是双向的。
无向图意味着两个节点彼此指向对方,其实就是环

第7章 狄克斯特拉算法

广度优先搜索找出段数最少的路径
狄克斯特拉算法(Dijksta)找出最快的路径

广度优先搜索查找两点之间的最短路径,“最短”指的是 段数最少
狄克斯特拉算法中,给每段都分配了一个数字或权重,因此,找出的是总权重最小的路径。狄狄克斯特拉算法只适用于:有向、无环图
狄克斯特拉算法不能用于:包含 负权边的图

第8章 贪婪算法

贪婪算法很简单:每步都采取最优的做法。每步都选择局部最优解,最终得到全局最优解。

NP完全问题:没有快速算法的问题
学习识别NP完全问题,以免浪费时间去寻找解决它们的快速算法

第9章 动态规划

动态规划:将问题分成小问题,并先着手解决这些小问题

动态规划处理的是,01问题,要不拿,要不不拿,而不能是拿一部分的(大米、扁豆)

第10章 K最近邻算法

K最近邻(KNN)算法,把A与附近相近B分为一类
KNN用于分类和回归,需要考虑最近的邻居

推荐系统就是使用的K最近邻算法

KNN算法也可用于机器学习领域、OCR识别

第11章 接下来如何做

二叉查找树:对于每个节点,左子节点的值都比它小,而右子节点的值都比它大
二叉查找树中查找节点时,平均运行时间为O(logn),但在最糟的情况下所需时间是O(n)
而在有序数组中查找,最糟的情况下所需时间也只有O(logn)

那么,有序数组查找比二叉查找树好?

然而,二叉查找树的插入与删除的操作速度要快得多

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值