mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-18 01:19:14 +08:00
更新串
This commit is contained in:
@@ -10,22 +10,25 @@
|
||||
|
||||
串的基本操作是对子串的操作。
|
||||
|
||||
## 顺序串
|
||||
## 串定义
|
||||
|
||||
### 顺序串
|
||||
|
||||
顺序串的结构定义方案
|
||||
|
||||
+ 使用单独的变量length保存串长。
|
||||
+ 使用data[0]记录串长;使得字符位序与数组下标一致;但是由于char类型一个为一字节大小,所以能表示的数字是0到255,太大的串无法表示。
|
||||
+ 没有表示串长的变量,使用\0表示串结尾,对应ASCII码的0号字符。
|
||||
+ data[0]空余,使用单独的变量length保存串长,这个比较常用。
|
||||
+ 使用单独的变量$length$保存串长。
|
||||
+ 使用$data[0]$记录串长;使得字符位序与数组下标一致;但是由于$char$类型一个为一字节大小,所以能表示的数字是$0$到$255$,太大的串无法表示,大于的部分会被截断。
|
||||
+ 没有表示串长的变量,使用$\backslash0$表示串结尾,对应$ASCII$码的$0$号字符。
|
||||
+ $data[0]$空余,使用单独的变量$length$保存串长,这个比较常用。
|
||||
+ 可以定长分配也可以用堆分配。
|
||||
|
||||
## 链串
|
||||
### 链串
|
||||
|
||||
如一般的链式存储结构定义一样,定义一个数据与指向下一位的指针。
|
||||
|
||||
但是如果你只在每个结点定义了一个字节的数据,但是又包含了四个字节的指针,那么存储利用率会很低。
|
||||
|
||||
如果是顺序表数据类型是整数类型,那么这种利用率低的情况确实无可奈何,但是对于串而言,因为一个字节存储一个字符,所以能一个字节存一个字符类型数据,所以为了提升数据存储利用率,可以每个结点存等多个字符。
|
||||
如果是顺序表数据类型是整数类型,那么这种利用率低的情况确实无可奈何,但是对于串而言,因为一个字节存储一个字符,所以能一个字节存一个字符类型数据,所以为了提升数据存储利用率,可以每个结点存等多个字符。这个就是块链串。
|
||||
|
||||
## 模式匹配
|
||||
|
||||
@@ -33,15 +36,15 @@
|
||||
|
||||
### 朴素模式匹配算法
|
||||
|
||||
从主串T、模式串P(子串)的第一个位置开始比较(i=0,j=0),若相等,则 i,j各自+1,然后比较下一个字符。若不等,主串指针回溯到上一轮比较位置的下一个位置,子串回溯到0,再进行下一次比较。令子串长度为m,主串长度为n:
|
||||
从主串$T$、模式串$P$(子串)的第一个位置开始比较($i=0,j=0$),若相等,则$i$,$j$各自$+1$,然后比较下一个字符。若不等,主串指针回溯到上一轮比较位置的下一个位置,子串回溯到$0$,再进行下一次比较。令子串长度为$m$,主串长度为$n$:
|
||||
|
||||
+ 匹配成功的最好时间复杂度:$O(m)$:刚好第一个就匹配上了,总对比次数为子串长度。
|
||||
+ 匹配失败的最好时间复杂度:$O(n-m+1)=O(n-m)=O(n)$:匹配成功之前,每一个与第一个字符都匹配失败。
|
||||
+ 匹配失败的最坏时间复杂度:$O(nm-m^2+m)= O(nm)$:子串除了最后一个对不上,其余的都能对上,则每次遍历完一边后,又要走回头路;直到匹配成功/失败一共需要比较$m\times(n-m+1)$次。m:每次需要移动m次,i需要移动$n-m+1$次。
|
||||
+ 匹配失败的最坏时间复杂度:$O(nm-m^2+m)= O(nm)$:子串除了最后一个对不上,其余的都能对上,则每次遍历完一边后,又要走回头路;直到匹配成功/失败一共需要比较$m\times(n-m+1)$次。$m$:每次需要移动$m$次,$i$需要移动$n-m+1$次。
|
||||
|
||||
### KMP算法
|
||||
|
||||
KMP算法是对朴素模式匹配算法的优化。
|
||||
$KMP$算法是对朴素模式匹配算法的优化。
|
||||
|
||||
朴素模式匹配算法的缺点就是当某些子串与模式串能部分匹配时,主串的扫描指针i经常回溯,从而导致时间开销。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user