《算法图解》阅读笔记

前言

  • 问题解决技巧:分而治之 / 动态规划;贪婪算法
  • 书目: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);左子节点的值都比它小,而右子节点的值都比它大。
  • 反向索引:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯mini项目-【指标监控服务重构】2023-07-29

今日已办 根据导师代码评审的 comment 改进 修改命名 otelclient.otelExporterOtlpEndpoint to otelclient.endpoint禁用 TLS 加密,移除 otelclient.insecureMode避免命名缩写影响代码的阅读理解把两个函数(createTraceExp和createTraceProvider&#…

VSCode 远程开发,再也不用带电脑回家了~

VS Code几乎是所有的程序员必备的工具之一,据说全球一般的开发者都使用过VS Code这款工具。 今天为大家介绍一下 VS Code 实现远程办公的方法。 1、概 述 通常,我们都是每天到工作的办公室进行办公,但是,如果下班回家&…

保密技术基础--北交大实验靶场2

由于第2、第3章的内部章节较少,所以我将其的体验感受一起写在这篇文章当中。 2.1 保密专用网络知识学习 这一小节也是一节的理论知识学习,学习过后有一个小测试,和第一章一样,学的知识和给的题目可以说是毫无关系。这一节的知识更…

shell 流程控制

流程控制 if条件判断 可以使用if来实现多路跳转,条件通常使用test命令 #if语句的语法if condition1then command1elif condition2 then command2else commandNfi 如果then需要和if放在同一行的话,使用;分隔 fi用来结束if语句,相当于…

Nginx部署前后端分离项目(Linux)

Nginx代理前端页面、后端接口 一、前端打包二、后端打包三、Linux部署Nginx启动、暂停、重启服务器部署文件地址: 一、前端打包 npm run build二、后端打包 通过Maven 使用package打包 三、Linux部署 安装Nginx 安装环境 yum -y install gcc pcre pcre-devel z…

【C语言】用冒泡排序实现my_qsort

大家好,我是苏貝,本篇博客带大家了解如何用冒泡排序实现my_qsort,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 前言二. 冒泡排序三. 4个参数3.1 第一个参数void* base3.2 第二个参数…

erlang练习题(二)

题目一 替换元组或列表中指定位置的元素,新元素作为参数和列表或元组一起传入函数内 解答 replaceIdx(List, Index, Val) ->replaceIdx(List, Index, Val, 1, []).replaceIdx([], _, _, _, Acc) ->lists:reverse(Acc);%% 到达替换位置的处理replaceIdx([_ …

AOSP源码中Android.mk文件中的反斜杠符号(\)的作用和使用

简介 在AOSP(Android Open Source Project)源码中的Android.mk文件中,反斜杠符号(\)的主要作用是将一行代码拆分成多行,以提高可读性并帮助组织较长的代码块。这对于定义复杂的构建规则和变量时特别有用。…

uniapp-历史搜索记录

应用场景 很多搜索场景内都能用到这个功能 大概就是用户搜索了某个关键字 然后搜索的关键字可以持久的保存下来 下次打开搜索的时候可以达到快速点击搜索的效果 实现步骤 1. 先给输入框双向绑定数据和事件 <input v-model"keyWord"> 2. 给搜索按钮绑定点…

前后端分离--Vue的入门基础版

目录 一.前后端分离 二.Vue的简介 三.Vue的入门案例 四.Vue的生命周期 一.前后端分离 前后端分离是一种软件架构模式&#xff0c;将应用程序的前端&#xff08;用户界面&#xff09;和后端&#xff08;数据处理和业务逻辑&#xff09;独立开发、独立部署。在前后端分离的架…

1、风行内容仓的增效之路 - 前言

18年初&#xff0c;公司成立内容资源管理中心&#xff08;以下按内部习惯简称内容仓&#xff09;。 18年中&#xff0c;因异地管理不便&#xff0c;我开始参与内容仓的现场管理&#xff0c;主要是提供一些管理方面的建议&#xff0c;以及部分协调工作。 19年Q4&#xff0c;我…

【计算机网络】75 张图详解:网络设备、网络地址规划、静态路由(万字长文)

75 张图详解&#xff1a;网络设备、网络地址规划、静态路由 1.网络设备1.1 交换机1.2 路由器 2.网络地址规划2.1 IP 地址2.2 分类地址2.3 子网掩码2.4 无类地址2.5 子网划分2.5.1 示例一2.5.2 示例二 2.6 超网合并 3.静态路由3.1 路由表3.2 直连路由3.3 静态路由3.4 默认路由3.…

Ansible 自动化运维工具部署主从数据库+读写分离

文章目录 Ansible 自动化运维工具部署主从数据库读写分离一、主从复制和读写分离介绍二、准备工作&#xff08;1&#xff09;节点规划&#xff08;2&#xff09;修改主机名&#xff08;3&#xff09;免密&#xff08;4&#xff09;配置IP映射&#xff08;5&#xff09;安装ansi…

【案例】--EasyExcel解析文件案例

目录 一、前言二、EasyExcel解析文件2.1、EasyExcel选型2.2、如何存储excel解析的文件2.3、解析格式规则的excel文件2.4、解析未知格式规则的excel文件一、前言 最近项目中,需要对excel、csv等文件进行解析,并做相关的业务功能。在实际业务中,遇到不少难题: (1)、excel、c…

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载&#xff1a;https://www.postman.com/ 访问链接后&#xff0c;进入首页&#xff0c;根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件&#xff0c;会默认安装在C盘&#xff0c;安装完会…

系统架构设计师(第二版)学习笔记----信息系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息系统基础 文章目录 一、信息系统概述1.1 信息系统的5个基本功能1.2 信息系统发展阶段1.3 初始阶段的主要特点1.4 传播阶段的主要特点1.5 控制阶段的主要特点1.6 集成阶段的主要特点1.7 信息系统的种类…

【Unity3D】UI Toolkit数据动态绑定

1 前言 本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定。 如果读者对 UI Toolkit 不是太了解&#xff0c;可以参考以下内容。 UI Toolkit简介UI Toolkit容器UI Toolkit元素UI Toolkit样式选择器UI Toolkit自定义元素 本文完整资源见→UI Toolkit数据动态绑定。 2 数据…

无涯教程-JavaScript - COMBINA函数

描述 COMBINA函数返回给定数量的项目的组合数量(重复)。 语法 COMBINA (number, number_chosen)争论 Argument描述Required/OptionalNumber 必须大于或等于0,并且大于或等于Number_chosen。 非整数值将被截断。 RequiredNumber_chosen 必须大于或等于0。 非整数值将被截断。…

脚本:python绘制七夕爱心

文章目录 效果脚本Reference 效果 脚本 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 640 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT /…

搭建Android自动化python+appium环境

一. 需要软件 JDK:JAVA安装后配置JDK环境 SDK:SDK下载后配置adb环境 Python:pyhton语言 Pycharm:python脚本编译工具 Appium-python-client:pyhton中的库 Appium客户端 二. 搭建步骤 1.配置JDK环境 ①. 下载安装java: https://www.oracle.com/java/technologies/java…