『Linux从入门到精通』第 ㉑ 期 - 文件系统详解

在这里插入图片描述

文章目录

  • 💐专栏导读
  • 💐文章导读
  • 🐧认识磁盘
  • 🐧逻辑抽象
  • 🐧文件系统
    • 🐦Block
    • 🐦Block Group
      • 🐔Block Group 的组成部分
    • 🐦Superblock(超级区块)
    • 🐦Group Description(组描述)
    • 🐦Block bitmap(区块对照表)
    • 🐦Inode bitmap(inode 对照表)
    • 🐦Inode table
    • 🐦Data block
  • 🐧Inode VS 文件名
    • 🐦重新认识目录
    • 🐦直接索引与二级索引
  • 🐧软硬链接
    • 🐦软硬链接对比
    • 🐦硬链接
    • 🐦硬链接的作用
    • 🐦软链接
    • 🐦软链接的作用

💐专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 Linux从入门到精通,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法

💐文章导读

本章我们将深入学习Linux文件系统,了解物理磁盘,建立从磁盘到逻辑线性地址的抽象过程。并以Linux EXT2 为例详细理解文件系统,以及软硬链接的基本概念及原理。

在这里插入图片描述

🐧认识磁盘

磁盘是一种用于存储和检索数据的数据存储设备,通常是计算机系统中的重要组成部分。它是一种非易失性存储设备,意味着它可以在断电后保持数据的存储状态。磁盘以其数据存储介质为基础,根据其工作原理和使用场景的不同,可以分为多种类型,包括硬盘驱动器(Hard Disk Drive,HDD)和固态硬盘(Solid State Drive,SSD)等。

下图为一个老式磁盘。

在这里插入图片描述

以下是一个磁盘各部分结构。

在这里插入图片描述
其中一个磁盘有很多盘片,一个盘片又有两个盘面,盘面上可以进行读写数据。
下图为一个盘面的示意图。

在这里插入图片描述
首先我们来认识几个名词:

  • 磁道(Cylinder):磁盘表面被分为很多同心圆,每个同心圆被称为一个磁道;
  • 磁头(Head):一个磁头负责一个面的读取;
  • 扇区(Sector):每个磁道被划分为若干段,每一段为一个扇区,每一个扇区的存储容量为512字节(或4KB)。

那么如何在磁盘中定位一块扇区呢?

  1. 先定位在磁盘的哪一面——通过磁头的编号来确定,一个磁头对应一个盘面;
  2. 再确定该扇区所在的磁道——每个磁道也有自己的编号;
  3. 最后确定在哪一块扇区——每个扇区也有自己的编号;

这就是所谓的 CHS 定位法。当我们存储一个文件时,一个文件占用若干个扇区。

🐧逻辑抽象

现在我们知道一个扇区是可以被定位的。那么 OS 是不是直接通过一个 CHS 地址来访问磁盘的呢?答案是否定的,原因如下:

  1. 倘若 OS 直接使用 CHS 地址,那么磁盘物理结构发生变化,OS 也要跟着改变,这是万万不能的。所以我们要实现 OS 与硬件之间的解耦;
  2. 扇区的单位是 512 字节,而 OS 进行 I/O 时基本单位为 4KB 。所以 OS 应当与磁盘地址建立映射关系;

那么我们就必须将CHS地址转化为我们熟悉的线性地址(LBA),方便与OS建立联系。

在这里插入图片描述

现在我们定位一块扇区只需要一个数组下标即可。OS 是以4KB为单位进行 I/O 的,相当于8块扇区的大小。

在这里插入图片描述
当我们把磁盘看作一个大数组后,OS对于磁盘的管理变成了对数组的管理。

🐧文件系统

我们以Linux EXT2文件系统来做说明。现在以一个 500GB 的磁盘为例,OS在管理该磁盘时采用的是分治的方法,先分区(例如C盘和D盘),再分组

在这里插入图片描述

🐦Block

对于 ext2 文件系统来说,硬盘分区首先被分割为一个一个的逻辑块(Block),每个 Block 就是实际用来存储数据的单元,大小相同,Block 按照0,1,2,3 的顺序进行编号,第一个 Block 的编号为 0。

ext2 文件系统支持的 Block 的大小有 1024 字节、2048 字节和 4096 字节,Block 的大小在创建文件系统的时候可以通过参数指定,如果不指定,则会从 /etc/mke2fs.conf 文件中读取对应的值。原则上,Block 的大小与数量在格式化后就不能够发生改变了,每个 Block 内最多只会存放一个文件的数据(即不会出现两个文件的数据被放入同一个 Block 的情况),如果文件大小超过了一个 Block 的 size,则会占用多个 Block 来存放文件,如果文件小于一个 Block 的 size,则这个 Block 剩余的空间就浪费掉了。

可以使用 dumpe2fs 命令查看 Block 的大小:

$ sudo dumpe2fs /dev/sda1 | grep "Block size:"

注意,Ext2 文件系统的 block 主要有下面一些特点:

block 的大小与数量在格式化完就不能够再改变了(除非重新格式化)

  • 每个 block 内最多只能够放置一个文件的数据;
  • 如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
  • 若文件小于 block,则该 block 的剩余容量就不能够再被使用了;

🐦Block Group

Block 在逻辑上被划分为多个 Block Group,每个 Block Group 包含的 Block 数量相同,具体是在 SuperBlock 中通过 s_block_per_group 属性定义的(最后一个 Block Group 除外,最后剩下的 Block 数量可能小于 s_block_per_group,这些 Block 会被划分到最后一个 Block Group 中)。dumpe2fs 命令会列出所有的 Block Group 信息,但是在统计信息中却没有说明当前的文件系统中包含有多少个 Block Group。

🐔Block Group 的组成部分

如上图所示,每个 Block Group 都由下面几个组成部分:

  • Superblock(超级块)
  • Group Description(组描述)
  • Block bitmap(块位图)
  • Inode bitmap(inode 位图)
  • Inode table(inode 表)
  • Data Blocks(数据块)

🐦Superblock(超级区块)

Superblock 是记录整个文件系统相关信息的地方,其实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定都包含 superblock,如果包含,也是做为第一个 block group 内 superblock 的备份。superblock 记录的主要信息有:

  • block 与 inode 的总量;
  • 未使用与已使用的 inode/block 数量;
  • block 与 inode 的大小(block 为 1,2,4K,inode 为 128 Bytes 或 256 Bytes);
  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;
  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0,若未被挂载,则 valid bit 为 1;

Superblock 的大小为 1024 Bytes,它非常重要,因为分区上重要的信息都在上面。如果 Superblock 挂掉了,分区上的数据就很难恢复了

🐦Group Description(组描述)

Group Description 用来描述每个 group 的开始与结束位置的 block 号码,以及说明每个块(superblock、bitmap、inodemap、datablock) 分别介于哪一个 block 号码之间。

🐦Block bitmap(区块对照表)

在创建文件时需要为文件分配 block,届时就会选择分配空闲的 block 给文件使用。如何查看 block 是否已经被使用了呢?此时就需要借助于 block bitmap 了。通过 block bitmap 可以知道哪些 block 是空的,因此系统就能够很快地找到空闲空间来分配给文件。同样的,在删除某些文件时,文件原本占用的 block 号码就要释放出来,此时在 block bitmap 当中相对应到该 block 号码的标志就需要修改成"空闲"。这就是 block bitmap 的作用。

🐦Inode bitmap(inode 对照表)

inode bitmap 与 block bitmap 的功能类似,只是 block bitmap 记录的是使用与未使用的 block 号,而 inode bitmap 则记录的是使用与未使用的 inode 号。

🐦Inode table

Inode table 中存放着一个个 inode,inode 的内容记录文件的属性以及该文件实际数据是放置在哪些 block 内,inode 记录的主要的文件属性如下:

  • 该文件的读写权限(rwx)
  • 该文件的拥有者和所属组(owner/group)
  • 该文件的容量
  • 该文件的 ctime(创建时间)
  • 该文件的 atime(最近一次的读取时间)
  • 该文件的 mtime(最近修改的时间)
  • 该文件的特殊标识,比如 SetUID 等
  • 该文件真正内容的指向(pointer)

inode 的数量与大小也是在格式化时就已经固定了的,另外 inode 还有如下特点:

  • 每个 inode 大小均固定为 128 Bytes(新的 ext4 为 256 Bytes)
  • 每个文件都仅会占用一个 inode
  • 文件系统能够创建的文件数量与 inode 的数量相关
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与使用者是否符合,若符合才能够开始读取 block 的内容

🐦Data block

Data block 是用来存放文件内容的地方,Ext2 文件系统 1K、2K 和 4K 大小的 block。在格式化文件系统时 block 的大小就确定了,并且每个 block 都有编号。需要注意的是,由于 block 大小的差异,会导致文件系统能够支持的最大磁盘容量和最大单个文件的大小并不相同。

🐧Inode VS 文件名

上面我们提到 inode 具有以下特点:

  • 每个 inode 大小均固定为 128 Bytes(新的 ext4 为 256 Bytes)
  • 每个文件都仅会占用一个 inode
  • 文件系统能够创建的文件数量与 inode 的数量相关
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与使用者是否符合,若符合才能够开始读取 block 的内容

总的来说,在Linux下查找一个文件,需要根据文件的 inode 来查找,包括读取文件内容等操作,一个文件对应一个 inode,且该文件的 inode 属性和该文件对应的数据块是有映射关系的。

在Linux系统中,操作系统只认识 inode,文件的 inode 属性中并不存在文件名,文件名仅仅是给用户使用的。

🐦重新认识目录

首先目录是文件,当然也有自己的 inode。那么目录是否有自己的数据块呢?答案是有的!目录的数据块里面保存的是该目录下的所有文件的文件名和 inode 对应的映射关系。

当我们访问一个文件时,我们总是在特定的目录下访问的。以 cat log.txt 为例:

  1. 首先我们需要在 log.txt 所在的目录下找到 log.txt 所对应的 inode 编号。
  2. 一个目录也是一个文件,一定隶属于一个分区,结合 inode,在该分区中找到分组,在该分组的inode table 中找到文件的 inode。
  3. 通过inode 和对应的datablock的映射关系,找到该文件的数据块,并加载到 OS,并在显示器显示。

🐦直接索引与二级索引

一个 inode 中存储着与 datablock 的映射关系,我们粗略的表示一个 inode 如下:

struct inode
{
	int inode_number; 	// inode 编号
	int ref_count; 		// 链接数
	mode_t mode; 		// 文件权限
	int uid;
	int gid;
	int size;
	//...
	int datablocks[NUM]; // 所指向的datablock
}

一个磁盘中的特定分区、特定分组下存在着若干个 datablock(假设大小都为4KB),每个 datablock都有着自己的编号。

上面的 datablocks 数组中记录着存储该文件内容的若干个 datablock。假设 datablocks 仅仅只存储着存储文件内容用到的 datablock,那么即使 NUM 非常大,为 100 0000 ,那这个文件的存储上限也就是 4GB 左右,但是在我们的印象中,一个文件大到上 100GB 的都有,如果真如同刚才所说的,那肯定是行不通的。

其实在 datablocks 数组中,前面一部分存储的是直接索引,也就是用到哪些 datablock 就存储哪些 datablock 的索引。再往后一部分是二级索引,二级索引指向的 datablock 中存储的并不是直接的文件数据,而是其他 datablock 的索引。倘若需求再大一些,甚至还会用到三级索引。

🐧软硬链接

学习了文件系统,我们再来看看有趣的软硬链接。

🐦软硬链接对比

首先我们通过软硬链接的对比来知道二者的差别。

首先来创建一个文件 myfile.txt;

$ touch myfile.txt

为该文件设置软链接

$ ln -s myfile.txt my_soft

为该文件设置硬链接

$ ln myfile.txt my_hard

查看三个文件,为ls添加-i参数,可查看文件的 inode 编号;

$ ls -il
total 0
541408 -rw-rw-r-- 2 hxy hxy  0 Feb 28 13:04 myfile.txt
541408 -rw-rw-r-- 2 hxy hxy  0 Feb 28 13:04 my_hard
541409 lrwxrwxrwx 1 hxy hxy 10 Feb 28 13:07 my_soft -> myfile.txt

首先我们可以直观地看到的是:myfile.txtmy_hard 的 inode 编号相同;myfile.txtmy_soft 的inode 编号不同。

我们刚才知道,一个文件对应一个inode,那么现在这两个文件的 inode 编号相同,这是怎么回事呢?

🐦硬链接

我们不妨大胆的猜测一下,假设之前的理论没错,那么myfile.txtmy_hard虽然名字不一样,但两个文件其实是一个文件,指向的是同一个 datablocks。我们现在加以验证:

首先在myfile.txt中写入内容:

$ echo "hello world" >> myfile.txt
$ echo "hello world" >> myfile.txt
$ echo "hello world" >> myfile.txt
$ echo "hello world" >> myfile.txt
$ echo "hello world" >> myfile.txt
$ cat myfile.txt
hello world
hello world
hello world
hello world
hello world

现在myfile.txt 中已经被写入了一些内容。接下来我们查看my_hard中的内容。

$ cat my_hard 
hello world
hello world
hello world
hello world
hello world

结果显而易见。我们的猜想是对的。

其实在文件系统中,一个文件可以有多个文件名指向同一份数据内容,这些文件名被称为硬链接。在硬链接中,所有硬链接文件都指向相同的物理存储块,它们实际上共享相同的 inode。

每个文件在文件系统中都有一个唯一的 inode,该 inode 包含有关文件的元数据和指向文件数据的指针。硬链接通过在文件系统中创建一个新的目录项,并将该目录项与相同的 inode 关联来实现。由于所有硬链接文件共享相同的 inode,它们实际上是对同一份数据内容的不同引用。

硬链接通常只能在同一文件系统中创建,并且不能指向目录。删除一个硬链接文件并不会删除实际的数据,直到所有硬链接都被删除,即引用计数降为零时,文件系统才会释放相关的inode和存储块。

通过 ls -l 我们还可以查看文件的硬链接数:

在这里插入图片描述

🐦硬链接的作用

硬链接的特性我们了解了,但是它有什么用呢?其实,我们平时没少用到它。还记得初学Linux时,我们遇到的两个隐藏文件.(当前目录) 和. . (上级目录)吗?

$ mkdir dir
$ ll -a dir
total 8
drwxrwxr-x 2 hxy hxy 4096 Feb 28 13:39 .
drwxrwxr-x 3 hxy hxy 4096 Feb 28 13:39 ..

我们注意到在dir目录下.的硬链接数是2. . 的硬链接数是3。其实 . 代表当前目录,它是在上级目录下dir的硬链接。而 . . 代表上级目录,它是上级目录的硬链接。那为什么 . . 的硬链接数是 3 呢?

因为. . 指向上级目录并且在上级目录下还存在一个.也指向上级目录。

在这里插入图片描述

当然硬链接的作用不仅仅在于当前目录与上级目录,我们只是以此为例。

🐦软链接

$ ls -il
total 0
541408 -rw-rw-r-- 2 hxy hxy  0 Feb 28 13:04 myfile.txt
541408 -rw-rw-r-- 2 hxy hxy  0 Feb 28 13:04 my_hard
541409 lrwxrwxrwx 1 hxy hxy 10 Feb 28 13:07 my_soft -> myfile.txt

my_soft的硬链接数是1,且 inode 也与myfile.txt不相同,显然它们是独立的两个文件。但是当我们查看my_soft中的内容时:

$ cat my_soft 
hello world
hello world
hello world
hello world
hello world

我们发现,my_softmyfile.txt中的内容竟然也相同。

其实软链接是一种特殊的文件,它包含一个指向另一个文件或目录的路径的引用。与硬链接不同,软链接不共享相同的 inode 或存储块,而是简单地包含指向目标文件的路径。当你访问软链接时,系统会自动解析路径并定位到目标文件。

软链接有如下特点:

  1. 独立的inode: 软链接和目标文件有不同的inode。软链接的inode包含有关软链接本身的元数据和指向目标文件的路径。

  2. 路径引用: 软链接存储的是目标文件的路径,而不是实际的数据块。当访问软链接时,文件系统会解析路径并跳转到目标文件。

  3. 跨文件系统: 软链接可以跨越不同的文件系统,因为它们只包含目标的路径,而不是具体的inode或存储块。

  4. 删除链接不影响目标文件: 删除软链接并不会影响目标文件,只有软链接本身被删除。如果删除目标文件,软链接就会成为“死链接”(dangling link),无法访问。

  5. 可以链接目录: 软链接可以指向目录,而硬链接通常不能。

使用软链接的一些优势包括更灵活的文件链接,可以跨越文件系统边界,以及对目录的链接支持。然而,由于软链接依赖于路径而不是直接指向数据块,当目标文件被移动或删除时,软链接可能会成为“死链接”,因此需要谨慎使用。

🐦软链接的作用

当我们有一个文件的路径被藏得很深的时候,每次访问该文件时,需要带很长的路径并不是很方便,此时我们就可以为该文件建立软链接,这样在自己的工作目录下就可以很便捷地使用了。

示例

$ tree
.
├── dir
│   └── dir1
│       └── dir2
│           └── dir3
│               └── dir4
│                   └── dir5
│                       └── test.c
├── myfile.txt
├── my_hard
└── my_soft -> myfile.txt

此时我们想要访问test.c,需要这样:

$ cat ./dir/dir1/dir2/dir3/dir4/dir5/test.c 

为了方便我们为该文件设置软链接:

$ ln -s ./dir/dir1/dir2/dir3/dir4/dir5/test.c test_soft
$ ll
total 12
drwxrwxr-x 3 hxy hxy 4096 Feb 28 14:14 dir
-rw-rw-r-- 2 hxy hxy   60 Feb 28 13:19 myfile.txt
-rw-rw-r-- 2 hxy hxy   60 Feb 28 13:19 my_hard
lrwxrwxrwx 1 hxy hxy   10 Feb 28 13:07 my_soft -> myfile.txt
lrwxrwxrwx 1 hxy hxy   37 Feb 28 14:18 test_soft -> ./dir/dir1/dir2/dir3/dir4/dir5/test.c

现在每次我们想访问test.c文件时,只需访问test_soft即可。

$ cat test_soft

这里有点类似于widows下的快捷方式

本章的内容到这里就结束了!如果觉得对你有所帮助的话,欢迎三连~

在这里插入图片描述

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

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

相关文章

typescript 的数据类型有哪些

👩 个人主页:不爱吃糖的程序媛 🙋‍♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端领域技术,成长的路上共同学习共同进步,一起加油呀! ✨系列专栏:前端面…

吸猫毛空气净化器哪个好?推荐除猫毛好的宠物空气净化器品牌

如今,越来越多的家庭选择养宠物!虽然家里变得更加温馨,但养宠可能会带来异味和空气中的毛发增多可能会引发健康问题,这也是一个大问题。 但我不想家里到处都是异味,尤其是便便的味道,所以很需要一款能够处…

Unity(第八部)Vector3的三维向量和旋转(坐标和缩放也简单讲了一下)

对了,Unity的生命周期自行百度吧;我这边整理的都不是很满意 Vector 是结构体 Vector2是指里面有两个变量 Vector3是指里面有三个变量 Vector4是指里面有四个变量 Vector3常用的变量就是x y z,所以,它可以代表坐标、旋转、缩放、三维向量 创…

C语言数据结构基础—单链表相关数据结构题目6道

上一篇博客中,我们大致的讲解了单链表相关的各种接口。接下来我们通过例题来运用类似的思想,达到学以致用的目的。 1.移除链表元素 203. 移除链表元素 - 力扣(LeetCode) 没有说明头结点是什么,默认就是第一个元素&am…

智能汽车软硬件产品CES展示汽车技术新亮点

智能汽车是汽车产业发展的新趋势,是未来汽车发展的必然方向。智能汽车是指搭载了先进的传感器、控制器、执行器等部件,并融合了人工智能、自动驾驶等技术,能够实现部分或完全自动驾驶、智能网联等功能的汽车。 近年来,智能汽车技…

ensp模拟单臂路由实现不同两个网段主机访问

拓扑结构图如下 1.pc机配置略过 2.交换机配置 三个接口,两个连接pc,连接方式access,一个连接路由器 连接方式trunk sy #进入系统 视图模式 undo info-center enable #关闭信息 vlan batch 10 20#批量创建vlan int g 0/0/2#进入2端口 p…

Java图书管理系统---命令行

项目列表 Book包 Book类内包含book的基本属性 BookList类初始化图书列表并且提供图书的属性方法 User包 Administrator类 common类 operator包 功能接口 新增图书功能 借阅图书功能 删除图书功能 显示图书功能 查找图书功能 归还图书功能 结束释放资源功能 运行…

MySQL进阶:大厂高频面试——各类SQL语句性能调优经验

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:MySQL进阶:强推,冲大厂必精通!MySQL索引底层(BTree)、性能分析、使用…

批量获取图片(下)

1.问题分析 我们观察下之前获得的图片,可以发现图片的清晰度不够。 放大之后比较模糊,这样的图叫做缩略图,那该如何获得高清海报图片呢? 为了找到高清图片,我们需要对网页结构进行分析,找到高清图对应的链…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题(Gold Mine Problem) 给定一个N*M尺寸的金矿,每个点都有一个非负数表示当前点所含的黄金数目,最开始矿工位于第一列,但是可以位于任意行。矿工只能向右,右上,右下三个方向移动。问该…

Eureka 入门教程

Eureka 介绍 1. 注册中心概述 什么是注册中心? 给客户端提供可供调用的服务列表,客户端在进行远程调用(RPC)时,根据服务列表选择服务提供方的服务地址进行服务调用 注册中心的核心功能 注册:服务提供者上…

CY8C42(1.PSoC4 Pioneer Kit开箱及基本使用)

1.开箱 最近了解到赛普拉斯有一种芯片,属于PSoC系列,与传统MCU不同,有点类似跨界芯片,于是就买来玩玩了,老实说用完还是很特别的,因为我没有用过FPGA,不确定是不是FPGA的开发流程(有…

【性能测试】loadrunner12.55--知识准备

1.0. 前言 ​ 在性能测试中,牵扯到了许多比较杂的知识点,这里将给大家说一下,loadrunner性能测试前需要做的一些准备,本节中我们将先从性能测试的一些术语入手,再到HTTP的一些知识,最后导我们loadrunner12…

linux文件及文件内容查找命令总结

在linux环境下,我们经常要查找一个文件或者文件的内容,但搜索的命令有很多,这些命令都有什么区别,应该怎么选择和使用呢? 下面总结了一些常见的文件查找、内容查找的命令,收藏起来备用吧。 文件查找 where…

虚拟机中window7界面太小解决办法

1.在虚拟机中的桌面的空白处右击,然后点击屏幕分辨率 2.根据自己电脑屏幕的大小来选择对应分辨率

java之servlet

动态的web资源开发技术 不同的用户,或者携带不同的参数,访问服务器 服务器添加判断层,实现访问不同的web资源

c++数据结构算法复习基础-- 2 -- 线性表-单链表-常用操作接口-复杂度分析

1、链表 特点 每一个节点都是在堆内存上独立new出来的, 节点内存不连续优点 内存利用率高,不需要大块连续内存 插入和删除节点不需要移动其它节点,时间复杂度O(1)。 不需要专门进行扩容操作缺点 内存占用量大,每一个节点多出存…

LeetCode238题:除自身以外数组的乘积(python3)

代码思路: 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积,因此需要进行两次遍历,第一次遍历求左部分乘积,第二次遍历求右部分的乘积,再将最后的计算结果一起求出来。 class Solution:def productExceptSelf(…

【力扣 - 杨辉三角】

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 提示: 1 < numRows < 30 方法一&#xff1a;数学 思路…

【免费】两阶段鲁棒优化matlab实现——CCG和benders

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序采用matlab复现经典论文《Solving two-stage robust optimization problems using a column-and-constraint generation method》算例&#xff0c;实现了C&CG和benders算法两部分内容&#xff0c;通过…