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

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 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. 理论研究: 上下界有助于理论计算机科学的研究,因为它们提供了对问题复杂性的深刻理解,而不仅仅是特定算法的表现。

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

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL的配置和安装

下载安装 打开官网 MYSQL官网 点击DOWNLOADS 滑到最低下点击:MYSQL Community(GPL) Downlads 点击Download Archives 点击MySQL Community Server进入网站 选择相应版本下载,这里选择的是5.7.24版本,x86 64位【按需选择】 下载解压 配置文件…

H5022B降压恒流芯片 内置MOS PWM调光 高性价比 支持48V 60V 80V 100V

内置MOSFET的100V降压恒流芯片是一种能够将高输入电压降低到稳定的输出电流的降压稳流器。以下是其基本工作原理: 输入电压检测:芯片首先检测输入电压,即来自电源的100V。这涉及使用电压检测电路,以确保输入电压在可接受范围内。…

springboot 怎么设置局域网访问

如何配置Spring Boot应用以实现局域网访问 在开发一个Spring Boot应用时,我们通常会通过localhost来访问和测试我们的应用。但是,当我们想要在局域网中分享我们的应用,供其他设备访问时,仅仅使用localhost是不够的。本文将引导你…

PyNest 一个可以搭建微服务的 Python 包

PyNest 在构建 Python API 和微服务方面崭露头角,解决了 FastAPI 中存在的关键问题,因此成为卓越的框架。凭借其模块化的架构和先进的特性,PyNest 在 2024 年及以后有望成为 Python 开发者的首选选择。 随着 Python 生态系统的不断成熟&…

关于信号处理中的测量精度与频谱细化问题及其仿真实践

说明 频谱细化问题其实很早之前就想研究并整理一下了,车载雷达中我们似乎对这个话题并不太涉及(最多只是在测角时用补0 FFT的方法),想要了解这个话题的源头是很早之前的一次面试时面试官问我:有哪些提高测量精度的方法?并进而引申…

Linux 文件IO

目录 linux下的文件分类: 文件描述符原理:(底层原理,可跳过) 虚拟文件系统: 内存中的inode与磁盘中的inode open函数 函数原型: 形参列表: 代码: close函数 er…

eNSP学习——华为交换机STP配置和选路规则

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验步骤 基本配置 配置网络中的根交换机 理解根端口的选举 理解指定端口的选举(首先比较根路径开销) 原理概述 生成树协议(英语:Spanning Tree Protocol&#…

excel 选中指定区域

问题 excel 选中指定区域 详细问题 笔者有一个excel数据集,数据量较大,如何快速选中指定区域 解决方案 步骤1、 点击起始单元格 确定单元格坐标(建议直接CtrlC复制至剪贴板) 具体操作入下图所示 步骤2、 点击结束单元格 …

微信小程序|推箱子小游戏

推箱子游戏是一种经典的益智游戏,通过移动箱子将其推到指定位置,完成关卡的过程。随着小程序的发展,越来越多的人开始在手机上玩推箱子游戏。本文将介绍如何利用小程序实现推箱子游戏,并分享一些技术实现的方法。 目录 引言游戏背景介绍游戏规则及挑战技术实现步骤创建游戏…

Leetcode—1570. 两个稀疏向量的点积【中等】Plus

2024每日刷题&#xff08;一零四&#xff09; Leetcode—1570. 两个稀疏向量的点积 实现代码 class SparseVector { public:SparseVector(vector<int> &nums) {for(int i 0; i < nums.size(); i) {if(nums[i]) {indexNum[i] nums[i];}}}// Return the dotProd…

3 款最好的电脑硬盘数据迁移软件

您将从本页了解 3 款最好的 SSD硬盘数据迁移软件&#xff0c;磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移&#xff1f; 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中&#xff0c;常见的数据迁移有三种&…

类Markdown实时绘图编辑器mermaid-live-editor

什么是 Mermaid &#xff1f; Mermaid 是一个基于文本的图表描述语言&#xff0c;它允许你使用简洁的语法来描述各种不同类型的图表和图示&#xff0c;例如流程图、时序图、甘特图等。 什么是 mermaid-live-editor &#xff1f; mermaid-live-editor 是一个基于 Javascript 的在…

springboot3-web开发

跟着尚硅谷学springboot3 0.配置application语法 表示复杂对象person Component ConfigurationProperties(prefix "person") public class Person {private String name;private Integer age;private Date birthday;private Child chlid;private List<Dog>…

实战Vue.js与MySQL:爱心商城项目开发指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

14.4.2 Flash读取与修改数据库中的数据

14.4.2 Flash读取与修改数据库中的数据 计数器是网站必不可少的统计工具&#xff0c;使用计数器可以使网站管理者对网站的访问情况有一个清晰的了解。如果仅仅是统计首页访问量的话&#xff0c;用文本文件来存储数据就可以了&#xff0c;但如果统计的数据量比较大的话(如文章系…

The Sandbox 专访|印尼国家足球队主教练申台龙

Q. 请简单介绍一下自己。 我是申台龙&#xff01;我目前担任印度尼西亚国家足球队主教练。我在印尼负责三支国家队的教练工作&#xff0c;分别是 A 组&#xff08;成年队&#xff09;、U-23 和 U-20。在韩国&#xff0c;我的名字是申台龙&#xff08;Shin Tae-yong&#xff09;…

【React】前端项目引入阿里图标

【React】前端项目引入阿里图标 方式11、登录自己的iconfont-阿里巴巴矢量图标库&#xff0c;把需要的图标加入到自己的项目中去&#xff1b;2、加入并进入到项目中去选择Font class 并下载到本地3、得到的文件夹如下4. 把红框中的部分粘贴到自己的项目中&#xff08;public 文…

VirtualBox中Ubuntu硬盘扩容

1.选中要扩容的虚拟机点击属性按钮&#xff0c;选择存储后点击控制器&#xff1a;STAT右边的 按钮 2.创建虚拟硬盘 在弹出框中选择创建按钮&#xff0c;选择VDI后点击下一步按钮 选择动态分配后点击下一步按钮 3.设置文件位置和大小 选择要保存的虚拟硬盘文件路径&#xff0c…

编程语言与编程工具总结

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您些帮助请&#x1f449;关…

iOS 微信分身(Windows手把手教程)

我之前教过大家IOS里面去创建微信应用副本(懂的都懂)。那个教程是MAC的教程版本。就有小伙伴问到&#xff0c;有没有Windows的教程版本呢。其实相差不多&#xff0c;但&#xff0c;不过谁叫我宠粉呢。 如果你使用的Mac版本的请参考这篇文章 1. iOS 微信应用副本 (免费&安…