《算法图解》阅读笔记

2023-09-16 15:40:35

前言

  • 问题解决技巧:分而治之 / 动态规划;贪婪算法
  • 书目:Grokking algorithms: an illustrated guide for programmers and other curious people
  • 中文名称:《算法图解——像小说一样有趣的算法入门书》

1 算法简介

  • 二分查找:输入是一个有序的元素列表
  • 运行时间:线性时间;对数时间
  • 大O表示法:算法有多快,指出了算法需要执行的操作数,指出了最糟情况下的运行时间
    • O(log n)
    • O(n)
    • O(n * log n)
    • O(n 2 )
    • O(n!)

2 选择排序

  • 数组和链表
    • 链表中的元素可存储在内存的任何地方。链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
    • 数组的读取速度更快,支持随机访问,数组的元素都在一起。
  • 数组的读取速度很快。
  • 链表的插入和删除速度很快。

3 递归

  • 递归只是让解决方案更清晰,并没有性能上的优势。实际上,在有些情况下,使用循环的性能更好。
  • 基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
  • 调用栈:栈有两种操作:压入和弹出。
  • 调用栈可能很长,这将占用大量的内存。
  • 调用另一个函数时,当前函数暂停并处于未完成状态。该函数的所有变量的值都还在内存中。

4 快速排序

  • 分而治之(divide and conquer,D&C)

    (1) 找出基线条件,这种条件必须尽可能简单。
    (2) 不断将问题分解(或者说缩小规模),直到符合基线条件。

  • 编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。

  • 平均情况和最糟情况

5 散列表

  • 散列函数是这样的函数,即无论你给它什么数据,它都还你一个数字。将输入映射到数字
  • 散列表(hash table)——字典
  • 避免冲突,需要有:
    • 较低的填装因子;
    • 良好的散列函数。

6 广度优先搜索

  • 图模拟一组连接。
  • 图由节点(node)和边(edge)组成。
  • 队列:队列是一种先进先出(First In First Out,FIFO)的数据结构,而栈是一种后进先出(Last In First Out,LIFO)的数据结构。
  • from collections import deque
  • 你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列。
  • 对于检查过的人,务必不要再去检查,否则可能导致无限循环。

7 狄克斯特拉算法

  • Dijkstra’s algorithm,总权重最小的路径。
  • 带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)。
  • 狄克斯特拉算法只适用于有向无环图(directed acyclic
    graph,DAG)。
  • 如果有负权边,就不能使用狄克斯特拉算法。
  • 贝尔曼-福德算法(Bellman-Ford algorithm)。
  • infinity = float(“inf”)

8 贪婪算法

  • 每步都选择局部最优解;
  • 教室调度问题;背包问题;集合覆盖问题;旅行商问题
  • 很多非常聪明的人都认为,根本不可能编写出可快速解决这些问题的算法。NP-complete
  • 没办法判断问题是不是NP完全问题:
    • 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
    • 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
    • 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。

9 动态规划

  • 动态规划先解决子问题,再逐步解决大问题。
  • 在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品。
  • 在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。
  • 每种动态规划解决方案都涉及网格。单元格中的值通常就是你要优化的值。
  • 费曼算法(Feynman algorithm)
    • (1) 将问题写下来。
    • (2) 好好思考。
    • (3) 将答案写下来。
  • 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题。
  • 没有放之四海皆准的计算动态规划解决方案的公式。

10 K最近邻算法

  • KNN用于分类和回归,需要考虑最近的邻居。
  • 分类就是编组。
  • 回归就是预测结果(如数字)。

11 10种算法

  • 树:二叉查找树(binary search tree);左子节点的值都比它小,而右子节点的值都比它大。
  • 反向索引:
更多推荐

Rust 数据类型 之 结构体(Struct)

目录结构体(Struct)定义与声明结构体定义结构体实例结构体分类单元结构体(UnitStruct)元组结构体(TupleStruct)具名结构体(NamedStruct)结构体嵌套结构体方法例1:结构体转换为字符串描述例2:矩形的周长和面积例3:结构体字段的更新与输出关联函数结构体方法与关联函数的区别参数传递方式的区

爬虫工作者必备:使用爬虫IP轻松获得最强辅助

目录一、爬虫IP的作用与优势二、选择合适的爬虫IP服务商三、使用爬虫IP的注意事项和技巧代码示例四、合法合规使用爬虫IP总结随着互联网的发展,数据已经成为企业竞争的核心资源。而获取这些数据的有效方式,就是通过爬虫技术。但是,爬虫在运行过程中很可能会触及到目标网站的限制,从而被禁止访问甚至封号。为了解决这个问题,我们可以

“熊猫杯” | 赛宁网安获网络安全优秀创新成果大赛优胜奖

9月11日,四川省2023年国家网络安全宣传周正式启动。由四川省委网信办指导,中国网络安全产业联盟(CCIA)主办,成都信息工程大学、四川省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛—成都分站赛(暨四川省‘熊猫杯’网络安全优秀作品大赛)”落下帷幕。赛宁网安凭借主动防御安全网格解决方案脱颖而出,荣获大赛优

Hadoop源码阅读(一):NameNode启动

说明:1.Hadoop版本:3.1.32.阅读工具:IDEA2023.1.23.源码获取:Indexof/dist/hadoop/core/hadoop-3.1.3(apache.org)4.工程导入:下载源码之后得到hadoop-3.1.3-src.tar.gz压缩包,在当前目录打开PowerShell,使用tar-

C++中按引用传递参数

C++中按引用传递参数实参通常是通过值传递给函数的,这意味着形参接收的只是发送给它们的值的副本,它们存储在函数的本地内存中。对形参值进行的任何更改都不会影响原始实参的值。然而,有时候可能会希望一个函数能够改变正在调用中的函数(即调用它的函数)中的一个值,这可以通过引用传递的方式来完成。我们知道,变量是可以保存数据的内存

Linux 内存泄漏检测的基本原理

一、mtrace分析内存泄露mtrace(memorytrace),是GNUGlibc自带的内存问题检测工具,它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数voidmtrace(),函数对libc库中的malloc/free等函数的调用进行追踪,由此来检测

【送面试题】Linux中grep和find的区别及全面使用指南

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

模型训练中的常见超参数解析

目录超参数学习率——lrbatch_sizenum_workersseed随机种子超参数学习率——lr数据集大小与学习率的调整有一定的关系,但并不是唯一决定学习率的因素。学习率的选择通常需要进行实验和调整,以找到最佳的学习率值,而这个最佳值可能会受到数据集大小的影响。下面是一些关于数据集大小和学习率调整的一般原则:1.

java面试题-jvm面试题

java面试题-jvm面试题1JVM组成面试官:JVM由那些部分组成,运行流程是什么?候选人:嗯,好的~~在JVM中共有四大部分,分别是ClassLoader(类加载器)、RuntimeDataArea(运行时数据区,内存分区)、ExecutionEngine(执行引擎)、NativeMethodLibrary(本地库

恒合仓库 - 用户管理、用户列表、为用户分配角色

文章目录用户管理一、用户列表1.1实体类1.1.1分页实体类1.1.2用户信息实体类1.2业务实现1.2.1UserMapper1.2.2Service层1.2.3Controller层1.2.4效果图二、用户增删改查2.1添加用户业务实现2.1.1Mapper2.1.2Service2.1.3Controller2.

BUU [HCTF 2018]Hideandseek

BUU[HCTF2018]Hideandseek考点:软连接读取任意文件Flask伪造session/proc/self/environ文件获取当前进程的环境变量列表random.seed()生成的伪随机数种子MAC地址(存放在/sys/class/net/eth0/address文件)国赛的时候遇见过软连接,这次再来

热文推荐