【Algorithms 4】算法(第4版)学习笔记 02 - 1.4 算法分析

news2024/12/28 4:02:40

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:科学方法
      • 2:观察举例:三数之和
      • 3:近似
      • 4:增长数量级
      • 4.1:二分查找 demo
      • 4.2:二分查找代码实现
      • 4.3:二分查找比较次数的证明(比较次数最多为lgN+1)
      • 5:三数之和的优化
      • 5.1:三数之和优化代码实现
      • 6:上下界

前言

经过上一章节对于 union-find 算法的实现以及分析,这一章节主要是对于算法的一些分析以及理论性的总结说明,还包含三数之和的实现以及优化、二分查找的实现以及证明等。

需要说明一下,Sedgewick 教授讲解第一章的顺序不是按照书本的编排顺序,而是先讲了实例,再对算法分析进行总结,然后再到基础理论说明,即 1.5 到 1.4 再到 1.3(1.1 和 1.2 没有讲,主要是 Java 相关的内容,但实际上算法课是没有语言限制的,可能有 Java 基础的话看这本书会比较舒服,但是如果是听教授讲课我觉得影响不大)。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《1.4 算法分析》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

1:科学方法

本章开篇首先说明的是应用于算法研究的科学方法以及其原则。

(截图自官方文档)
在这里插入图片描述

(用官网的英文原版是便于直观展示每一个强调的点

再贴一下中译版:

在这里插入图片描述

2:观察举例:三数之和

简单说明一下三数之和,即输入一组整数,需要统计出所有和为 0 的三整数数组的数量。

首先,最容易想到的便是暴力算法。

edu.princeton.cs.algs4.ThreeSum#count

在这里插入图片描述

三重循环,由已有的运行时间记录推算得到的运行时间大致为:

T(N)=9.98×10-11×N3

3:近似

一个程序运行的总时间主要和两点有关:
❏执行每条语句的耗时;
❏执行每条语句的频率。
前者取决于计算机、Java编译器和操作系统,后者取决于程序本身和输入。

我们常常使用约等于号(~)来忽略较小的项,从而大大简化我们所处理的数学公式。该符号使我们能够用近似的方式忽略公式中那些非常复杂但幂次较低,且对最终结果的贡献无关紧要的项。

在这里插入图片描述

4:增长数量级

在这里插入图片描述

表1.4.7 对增长数量级的常见假设的总结
在这里插入图片描述

在增长数量级这一节中,主要以二分查找来进行说明。

4.1:二分查找 demo

简单说明二分查找的demo:

给定一个排序好的数组以及一个key,查到key在数组中的下标。

实现方式:

二分查找:循环比较key和数组中间的元素

  • 如果key小,往左;
  • 如果key大,往右;
  • 相等,返回。

在一组排序好的数字中找到整数 33 的下标:

在这里插入图片描述

4.2:二分查找代码实现

edu.princeton.cs.algs4.BinarySearch#indexOf

在这里插入图片描述

4.3:二分查找比较次数的证明(比较次数最多为lgN+1)

先看下教授给出的证明方式:

在这里插入图片描述

但是吧,我数学真的一般般,所以我又去问了一下通义,所幸看懂了它给出的证明步骤:

(格式有点问题,我就直接贴原文了,有些描述进行了修改)

二分查找(Binary Search)在每次迭代中都会将搜索范围减半,直到找到目标值或者搜索范围缩小到不存在为止。假设我们有一个包含n个元素的有序数组(比如升序排列),初始搜索范围是整个数组,即从索引0到n-1。

证明步骤:

  1. 初始化比较次数k=0,表示开始时还未进行任何比较。

  2. 每次迭代,我们将当前搜索区间划分为两半,取中间元素与目标值进行比较。如果相等,则找到了目标值并停止搜索;如果不相等,根据比较结果舍弃一半区间(不包含目标值的那一半)。

  3. 由于每次比较后至少会排除掉原来区间的一半,因此,在第k次迭代后剩余的区间长度为 n 的 部分。

    对于长度n的数组,k=0是,剩余部分为 1/(20) = 1;
    以此类推,剩余部分为 1/(21) = 1/2;1/(22) = 1/4;1/8;1/16……

  4. 我们的目标是确定最大的比较次数,使得剩下的区间长度为1(即只剩一个元素或刚好找到目标值)。这意味着:
    n / 2 k = 1 n/2^k=1 n/2k=1

  5. 解这个方程得到:
    k = l o g   2   ( n ) k = log~2~(n) k=log 2 (n)

  6. 因为实际情况下k必须是整数,并且计算机程序中通常使用向下取整来决定迭代次数,所以实际上最大迭代次数是。

  7. 但是,当 log2(n) 不是整数时,需要再进行一次迭代以确定最后一个元素是否为目标值,所以总共的最大比较次数应该是向下取整的基础上加1
    最大比较次数 = ⌊ log ⁡ 2 ( n ) ⌋ + 1 最大比较次数= \lfloor \log_2(n) \rfloor + 1 最大比较次数=log2(n)⌋+1

  8. 这意味着对于任意大小为n的有序数组,最多需要执行第 7 点中计算得到的比较次数就能确定目标值是否存在。

5:三数之和的优化

对于 2 中三数之和的暴力算法,这里提出了一种利用二分查找进行优化的方法:

在这里插入图片描述

  • 升序排列非重复的一组数字
  • 对于每一对组合 a[i]a[j],利用二分查找寻找是否存在 -(a[i]+a[j])

5.1:三数之和优化代码实现

edu.princeton.cs.algs4.ThreeSumFast#count

在这里插入图片描述

6:上下界

这一部分属于理论性比较强的内容,主要是说明了这个概念对于算法研究的必要性。

在这里插入图片描述

同样贴一下通义关于上下界概念的说明,便于理解:

算法上下界是指在分析算法性能时,对算法执行时间或空间复杂度的一个范围的界定。这个范围可以帮助我们更好地了解算法在不同情况下的表现,并对算法进行更全面的评估。

  1. 算法上界(Upper Bound):

    • 定义:算法在最坏情况下的执行时间或空间复杂度的一个上限。
    • 作用:提供了算法性能的悲观估计。上界告诉我们,在最不利的情况下,算法的性能不会超过这个值。这对于确保算法在任何情况下都能在合理的时间内完成任务很有帮助。
  2. 算法下界(Lower Bound):

    • 定义:算法在最好情况下的执行时间或空间复杂度的一个下限。
    • 作用:提供了算法性能的乐观估计。下界告诉我们,在最理想的情况下,算法的性能不会低于这个值。这对于了解算法的优势和在最优情况下能够达到的极限非常重要。
  3. 平均情况复杂度:

    • 平均情况复杂度考虑了算法在所有可能输入下的性能。它可以被视为上界和下界的平均值。

在分析算法性能时,我们通常关注最坏情况下的上界,因为这提供了对算法在任何情况下的性能都足够保守的估计。同时,下界可以帮助我们了解算法的潜在优势。

作用:

  1. 性能保证: 算法上界提供了对算法在最坏情况下性能的保证,这对于实际应用中的稳定性和可靠性至关重要。

  2. 算法选择: 在设计和选择算法时,我们可以根据算法的上下界来判断它是否满足问题的要求。较低的上界和较高的下界通常是理想选择的标志。

  3. 问题难度: 下界可以用来表征特定问题的难度。如果一个问题的下界很高,说明在任何情况下找到更好的算法可能是困难的。

  4. 理论研究: 上下界有助于理论计算机科学的研究,因为它们提供了对问题复杂性的深刻理解,而不仅仅是特定算法的表现。

总体来说,算法上下界的定义和分析有助于我们更全面地理解算法的性能,并在设计和选择算法时做出明智的决策。

(完)

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

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

相关文章

贪吃蛇的简易实现

技术要点 贪吃蛇的简易实现会运用到语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等,接下来首先简单介绍一下会运用到的东西。 Win32 API介绍 Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼…

嵌入式工程师day15(链表)

内存管理 一.内存管理: 1.malloc void *malloc(size_t size); 功能: 申请堆区空间 参数: size:申请堆区空间的大小 返回值: 返回获得的空间的首地址 失败返回NULL 2.free void free(void *ptr); 功能: 释放…

机器学习-3降低损失(Reducing Loss)

机器学习-3降低损失(Reducing Loss) 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1.降低损失:迭代方法 迭代学习 下图展示了机器学习算法用于训…

idea Statistic使用

问题描述:本地idea版本为2018.3.5,安装Statistic插件后没有出现Statistic图标 原因如下:插件版本太新了,需要历史版本 解决办法: IDEA安装代码统计插件Statistic后左下角图标出不来(亲测)_idea statistic不展示-CSD…

从入门到精通 MATLAB:这些学习网站是不错的选择!

介绍:MATLAB是一种高级的数学计算软件,专门用于算法开发、数据可视化、数据分析以及数值计算。它是MathWorks公司推出的产品,自1984年推向市场以来,已经成为科学计算和工程设计领域的重要工具。以下是MATLAB的主要特点&#xff1a…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念&#xff…

【C++进阶08】哈希的应用(位图and布隆过滤器)

一、位图 1.1 位图的概念 面试题 给40亿个不重复的无符号整数,没排过序 给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】 能想到的解决思路: 遍历,时间复杂度O(N)排序(O(NlogN)) 利用二分查找: logN放到哈…

计算机毕业设计 | SpringBoot+vue 教务管理系统(附源码)

1,项目背景 教育需求增长 随着社会的发展,对于教育质量的要求也在不断提高。传统的手工操作和纸质记录已经不能满足现代教学的需求。因此,一个自动化、数字化的教务管理系统成为了必然的选择。 信息化趋势 现代科技的飞速发展使得信息化成为…

【算法】登山(线性DP,最长上升)

题目 五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。 同时队员们还有另一个登山习惯,就是不连续浏览海拔相…

如何保证MySQL数据一致性

在当今大数据时代,数据库系统扮演着至关重要的角色,而MySQL作为一种流行的关系型数据库管理系统,在数据一致性方面拥有着丰富的机制和技术。下面简单的探讨MySQL是如何保证数据一致性的。 事务与ACID特性 要了解MySQL如何保证数据一致性&am…

excel中去掉单元格中两个数字之间的空格

excel中去掉单元格中两个数字之间的空格 使用公式:SUBSTITUTE(A1," “,”") 解释:将A1单元格中的空格查找出来并去掉。

香蕉派BPI-M7 瑞芯微RK3588 人工智能开源硬件开发板公开发售

香蕉派(Banana Pi) BPI-M7瑞芯微K3588开源硬件单板计算机公开销售,支持WiFi 6和BT5.2,硬件有3个版本:8G Ram64G eMMC, 16G Ram128 eMMC和32G Ram128 eMMC 香蕉派BPI-M7采用睿芯最新旗舰RK3588八核64位处理器,最高频率为2.4GHz, 6 TOPS NPU&…

网络安全全栈培训笔记(59-服务攻防-中间件安全CVE复现lSApacheTomcataNginx)

第59天 服务攻防-中间件安全&CVE复现&lS&Apache&Tomcata&Nginx 知识点: 中间件及框架列表: lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,…

MicrosoftEdge浏览器打开网页出现“此网站被人举报不安全”问题时解决办法

1:有时候不知怎么回事用电脑自带的微软浏览器进行搜索会出现以下的问题 这可能是由于我们的浏览器安全审查过于严格引起的 Windows10正式版系统下,使用Edge浏览器浏览网页时候,发现整个页面突然变成了红色,显示“已有人举报此网站…

【项目管理】立项管理

一、前言 对于甲方的立项:需求调研二编写项目申请书一可行性研究(机会、初步、详细)一项目论证一项目评估一评审获得批准一发布招标文件!对于乙方的立项:看到招标文件一进行项目识别一可行性研究(机会、初…

MATLAB - 控制小车上的倒立摆

系列文章目录 前言 一、小车 - 摆杆 小车 - 摆杆模型如图 1 所示,使用 Simscape™ Multibody™ 在 Simulink 中建模。 图 1:小车上的倒立摆 图 2:Simscape 多体模型 该系统通过对小车施加可变力 进行控制。控制器需要在将小车移动到新位置或…

【OpenCV】在Linux上使用OpenCvSharp

前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS。OpenCvSharp是一个Ope…

Python中类的相关术语(附带案例)

目录 1、面向对象 2、类 3、实例 4、初始化方法 5、魔法方法 6、字符串方法 7、self 8、数据、属性、操作、行为 9、父类、基类、超类 or 子类、派生类 10、多态 11、重载多态 and 重写多态 12、名称解释 1、面向对象 在Python中,面向对象编程&…

由《幻兽帕鲁》私服漏洞引发的攻击面思考

《幻兽帕鲁》私服意外丢档 当了一天的帕鲁,回家开机抓帕鲁的时候发现服务器无法连接。运维工具看了下系统负载发现 CPU 已经跑满。 故障排查 登录服务器进行排查发现存在可疑的 docker 进程。 经过一番艰苦的溯源,终于在命令行历史中发现了端倪 攻击…

深入浅出AI落地应用分析:AI个人助手Monica

前言:铺天盖地的大模型以及所谓的应用到目前为止实际还是很少有像Monica这样贴合个人工作习惯的产品落地,比如像Chatgpt等这样的产品,绝大多数人不会专门买🪜翻墙出去用,而且大多数场景下素人或小白都不知道该怎么用,但是Monica这款产品就很好的以浏览器的插件的形式始终…