数学基础篇(有关数列)
1.序列
1.1 序列两种表达形式
(1)通项表示
(2)连续表示
1.2 收敛和发散的概念
学会用𝜀−𝑁语言描述收敛和发散(非常重要,属于基础推理)
收敛的描述:有极限(极限不为无穷)就是收敛
用𝜀−𝑁语言描述为:
收敛的几何意义:
∀𝜀,在𝑙的𝜀邻域𝑈(𝑙,𝜀)包含了𝑥𝑛自某项之后的所有项
∀𝜀,在𝑙的𝜀邻域𝑈𝑙,𝜀之外只有𝑥𝑛的有限项
发散的描述:没有极限(极限为无穷)就是发散
用𝜀−𝑁语言描述为:
1.3 数列的性质
(1)有界性:收敛的数列必有界
(2)唯一性:收敛序列的极限是唯一的
(3)保序性:
(4)子序列收敛:𝑎𝑛收敛于𝑎,则𝑎𝑛的任意一个子序列𝑎n𝑘收敛于𝑎
(5)单调收敛原理:当一个单调实数列具有上下界,则它的极限一定存在
(6)夹逼收敛原理:
这些原理和性质可以用于计算和推导公式极限!!!!
1.4 两个重要极限的来源(主要是e和c(欧拉常数))
(1)
(2)
1.5 无穷大量和无穷小量
无穷小量:收敛于0的数列是无穷小量
无穷小量几个性质:
(1){𝑥𝑛}是无穷小量的充分必要条件是{|𝑥𝑛|}是无穷小量。
(2)若{𝑥𝑛}是无穷小量,M是一个常数,则{𝑀𝑥𝑛}是无穷小量。
(3)𝑥𝑛→𝑙(𝑛→∞)的充分必要条件是{𝑥𝑛−𝑙}是无穷小量。
**无穷大量:**趋向于∞的数列是无穷大量
阶层:用于衡量无穷小量的收敛速度(即给无穷小量再划分级别)
有关阶层的一些比较方法:
同时列出一些常见收敛数列的阶层对比关系(可以辅助夹逼或者保序性来推导极限):
闭区间套定理和聚点原理
1.闭区间套定理:
简单的说:闭区间不断套娃,然后所有套娃的闭区间长度组成一个数列,改数列收敛于0的话,那么最终套娃的闭区间会存在左端点=右端点=唯一公共点(即左右端点收敛于数轴上唯一一点)
详细解释如下:
2.聚点原理 :
首先确定聚点的概念:
简单的说:集合 E 的聚点x0,是指x0 的任意空心邻域内,都有E的点,无论这个邻域多么小。反之除聚点以外属于集合E的点都叫孤立点
具体定义如下:
那么什么是聚点原理呢?
ℝ中任何一个有界无穷子集至少有一个聚点。或者也可以说任何有界数列均存在收敛的子数列
Python数据结构篇(有关顺序表)
1 理解内存和类型本质
1.1 内存一些基础概念
内存:用于存放数据的空间,存在地址指引
内存容量的基本单位是字节(Byte) =8位(bit)
地址的表示方法是0X0010(当前多数内存地址是32位数所以其实是0X0000 0010,即保存一个地址信息到内存的话需要4个字节),但是一个地址只指向一个字节(00000000)
1.2 类型的本质
从int出发:
int的长度是4个字节,所以保存一个int数据其实需要4个地址位,如图所示:
一个char数据是一个字节,说明只占一个地址位。
在地址中如何区分连续4个地址位是int还是4个char需要通过数据类型去判断
2 顺序表
2.1 顺序表的两类
顺序表是物理地址连续的存储单元依次存储数据的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
以下图展示了两类顺序表:
(1)基本顺序表,即数据元素本身连续存储,每个元素所占的存储单元大小固定相同,存储区里存的就是数据本身
(2)元素外置顺序表:如果元素的大小不统一,则须采用图b的元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)。
2.2 顺序表的实现方法(一体式和分离式)
(1)一体式:顺序表的容量和个数和元素内容顺序链接
(2)分离式:顺序表的容量和个数和元素内容是分离开的,通过指向地址链接
在元素存储区替换上,两者很大不同:
一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了,相当于重新画个区域把顺序表的容量和个数和元素内容都放到新的区域里。表头地址会改变
分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。表头地址不改变
引申出动态顺序表的概念:
采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行。人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。
2.3 元素存储区扩充(扩充的两种策略)—能扩充的顺序表就是动态顺序表
(1)每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。
特点:节省空间,但是扩充操作频繁,操作次数多。
(2)每次扩充容量加倍,如每次扩充增加一倍存储空间。
特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。
2.4 顺序表的增加和删除
(1)增加顺序表元素的方法
(1)尾端加入元素,时间复杂度为O(1)-----相当于直接查找到尾部,然后加一个元素,一步操作------类似Python的append
(2)非保序的加入元素(非常不常见),时间复杂度为O(1)-----相当于直接查找到插入位置,然后取出插入位置当前元素放到尾部,在插入位置替换加入元素,固定2步操作不涉及循环
(3) 保序的元素加入,时间复杂度为O(n)----查找到插入位置,但是要把插入位置到尾部的所有元素进行后移一位,需n步操作,需要循环操作
注意列表的insert方法是保序加入
(2)顺序表的删除
(1) 删除表尾元素,时间复杂度为O(1)------相当于直接查找到尾部,然后删除一个元素,一步操作
b. 非保序的元素删除(不常见),时间复杂度为O(1)
c. 保序的元素删除,时间复杂度为O(n)---------查找到插入位置,但是要把插入位置到尾部的所有元素进行前移一位,需n步操作,需要循环操作
Python里面的顺序表
Python里面顺序表结构有两种:list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。
tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。
注意:list就是一种采用分离式技术实现的动态顺序表
list的扩充策略:
在Python的官方实现中,list实现采用了如下的策略:
在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。