mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-11-03 05:43:42 +08:00
更新顺序表
This commit is contained in:
@@ -199,3 +199,10 @@ $C.O(n)$
|
||||
$D.O(n^2)$
|
||||
|
||||
解:$A$。令执行次数为$t$,基本运算是$t+1$,然后第$t$次$x+1=t$,所以根据判断条件$t^2>n$,所以解得$t>\sqrt{n}$,所以$O(n^\frac{1}{2})$。
|
||||
2^k
|
||||
**例题** 一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别(或阶)。
|
||||
|
||||
$T(n)=\left\{\begin{array}{lc} 1, & n=1 \\ 2T(n/2)+n , & n>1 \end{array}\right.$
|
||||
式中,$n$是问题的规模,为简单起见,设$n$是$2$的整数次幂。
|
||||
|
||||
解:设$n$是$2$的整数次幂,所以设$n=2^k$,当执行$k$次时,$n=1$跳出循环。当$n>1$时,$T(2^k)=2T(2^{k-1})+2^k$,又$T(2^{k-1})=2T(2^{k-2})+2^{k-1}$,所以$T(2^k)=4T(2^{k-2})+2\times2^k$,根据递推式规律所以得到$T(2^k)=2^iT(2^{k-i})+i\times2^k$,即$T(2^k)=2^kT(1)+k\times2^k=2^k+k\times2^k=(k+1)\times2^k$,即$T(n)=(\log_2n+1)\times n$,即$O(n\log_2n)$。
|
||||
|
||||
35
Data-Structrue/1-linear-list-ex.md
Normal file
35
Data-Structrue/1-linear-list-ex.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 线性表习题
|
||||
|
||||
## 基本概念
|
||||
|
||||
**例题** 以下()是一个线性表。
|
||||
|
||||
$A.$由$n$个实数组成的集合
|
||||
|
||||
$B.$由$100$个字符组成的序列
|
||||
|
||||
$C.$所有整数组成的序列
|
||||
|
||||
$D.$邻接表
|
||||
|
||||
解:$B$。线性表定义的要求为:相同数据类型、有限序列。选项$C$的元素个数是无穷个,错误;选项$A$集合中的元素没有前后驱关系,错误;选项$D$属于存储结构,线性表是一种逻辑结构,不要将二者混为一谈。只有选项$B$符合线性表定义的要求。
|
||||
|
||||
## 顺序表
|
||||
|
||||
**例题** 设线性表有$n$个元素,严格说来,以下操作中,()在顺序表上实现要比在链表上实现的效率高。
|
||||
|
||||
Ⅰ.输出第$i$($1\leqslant i\leqslant n$)个元素值。
|
||||
|
||||
Ⅱ.交换第$3$个元素与第$4$个元素的值
|
||||
|
||||
Ⅲ.顺序输出这$n$个元素的值
|
||||
|
||||
$A.$Ⅰ
|
||||
|
||||
$B.$Ⅰ、Ⅲ
|
||||
|
||||
$C.$Ⅰ、Ⅱ
|
||||
|
||||
$D.$Ⅱ、Ⅲ
|
||||
|
||||
解:$C$。对于Ⅱ,顺序表仅需$3$次交换操作;链表则需要分别找到两个结点前驱,第$4$个结点断链后再插入到第$2$个结点后,效率较低。对于Ⅲ,需依次顺序访问每个元素,时间复杂度相同。
|
||||
@@ -4,14 +4,14 @@
|
||||
|
||||
### 逻辑结构
|
||||
|
||||
是具有相同数据类型的n个数据元素的有限序列。n表示表长。
|
||||
是具有相同数据类型的$n$个数据元素的有限序列。$n$表示表长。
|
||||
|
||||
$L=(a_1,a_2,\cdots,a_i,\cdots,a_n)$,其中$i$表示元素在线性表中的位序,从一开始。
|
||||
|
||||
+ 存在惟一的第一个元素。
|
||||
+ 存在惟一的最后一个元素。
|
||||
+ 除第一个元素之外,每个元素均只有一个直接前驱。
|
||||
+ 除最后一个元素之外,每个元素均只有一个直接后继。
|
||||
+ 除第一个元素(表头元素)之外,每个元素均只有一个直接前驱。
|
||||
+ 除最后一个元素(表尾元素)之外,每个元素均只有一个直接后继。
|
||||
|
||||
### 物理结构
|
||||
|
||||
@@ -20,7 +20,7 @@ $L=(a_1,a_2,\cdots,a_i,\cdots,a_n)$,其中$i$表示元素在线性表中的位
|
||||
|
||||
## 顺序表
|
||||
|
||||
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来实现。
|
||||
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来实现。$i$是元素$a_i$在线性表中的位序。
|
||||
|
||||
### 顺序表特点
|
||||
|
||||
@@ -28,14 +28,49 @@ $L=(a_1,a_2,\cdots,a_i,\cdots,a_n)$,其中$i$表示元素在线性表中的位
|
||||
2. 存储密度高,只用存储数据。
|
||||
3. 拓展容量不方便。
|
||||
4. 插入删除操作不方便。
|
||||
5. 表中元素的逻辑地址与物理地址顺序相同。
|
||||
|
||||
### 顺序表定义
|
||||
|
||||
使用C语言的结构体定义顺序表,使用`typedef`定义一个ElemType表示数据基本类型,并定义最大长度MaxSize:
|
||||
使用$C$语言的结构体定义顺序表,使用`typedef`定义一个`ElemType`表示数据基本类型,并定义最大长度`MAXSIZE`:
|
||||
|
||||
可以使用静态分配空间,也可以使用动态分配空间:
|
||||
```c
|
||||
// 初始化最大长度
|
||||
#define MAXSIZE 25
|
||||
// 定义默认值
|
||||
#define DEFAULTELEM 0
|
||||
// 定义最大值
|
||||
#define INFINITY 32767
|
||||
// 定义默认数据类型
|
||||
typedef char element_type;
|
||||
```
|
||||
|
||||
MAXSIZE表示动态顺序表当前可以使用的最大存储空间。
|
||||
可以使用静态分配空间:
|
||||
|
||||
```c
|
||||
// 静态顺序表
|
||||
typedef struct {
|
||||
element_type data[MAXSIZE];
|
||||
// 长度
|
||||
int length;
|
||||
} StaticSequenceList;
|
||||
```
|
||||
|
||||
也可以使用动态分配空间,动态分配空间还是顺序的,只不过可以替换原来空间:
|
||||
|
||||
```c
|
||||
// 动态顺序表
|
||||
typedef struct {
|
||||
// 给一个指针来分配动态数组
|
||||
element_type *data;
|
||||
// 已分配的最大容量
|
||||
int max_size;
|
||||
// 长度
|
||||
int length;
|
||||
} DynamicSequenceList;
|
||||
```
|
||||
|
||||
其中长度是指有数据的长度,而最大容量是指已经分配给动态数组的长度,插入时要考虑这个长度,不能溢出。
|
||||
|
||||
### 顺序表操作
|
||||
|
||||
@@ -51,10 +86,12 @@ MAXSIZE表示动态顺序表当前可以使用的最大存储空间。
|
||||
|
||||
#### 顺序表插入
|
||||
|
||||
倒序移动元素,最后将数据插入对应索引并长度减一。
|
||||
倒序移动元素,最后将数据插入对应索引并长度加一。(这是一个较好的方式,因为如果插入的话其他元素会被挤住,倒序移动元素可以正好空出位置)
|
||||
|
||||
插入时间复杂度为:$T(n)=O(n)$,空间复杂度为$S(n)=O(1)$。
|
||||
|
||||
平均时间复杂度:假设$p_i$($n_i=\dfrac{1}{n+1}$)是$i$位置上插入一个结点的概率,则在长度为$n$的线性表中插入一个结点时所需要移动结点的平均次数为$\sum\limits_{i=1}^{n+1}p_i(n-i+1)=\sum\limits_{i=1}^{n+1}\dfrac{1}{n+1}(n-i+1)=\dfrac{1}{n+1}\sum\limits_{i=1}^{n+1}(n-i+1)=\dfrac{1}{n+1}\times\dfrac{n(n+1)}{2}=\dfrac{n}{2}$。
|
||||
|
||||
#### 顺序表删除
|
||||
|
||||
正序移动元素并长度减一。
|
||||
@@ -65,7 +102,7 @@ MAXSIZE表示动态顺序表当前可以使用的最大存储空间。
|
||||
|
||||
按位查找时间复杂度为$T(n)=O(1)$。
|
||||
|
||||
按值查找一般都是找到第一个元素等于指定值的元素,返回其位序,如果没有找到就返回-1。按位查找时间复杂度为$T(n)=O(n)$。
|
||||
按值查找一般都是找到第一个元素等于指定值的元素,返回其位序,如果没有找到就返回$-1$。按位查找时间复杂度为$T(n)=O(n)$。
|
||||
|
||||
## 单链表
|
||||
|
||||
|
||||
Reference in New Issue
Block a user