Microsoft PowerPoint - 3+.pptx



Similar documents
第2章 数据类型、常量与变量

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

I

《C语言基础入门》课程教学大纲

国债回购交易业务指引

修改版-操作手册.doc


第二讲 数列

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

登录、注册功能的测试用例设计.doc

用节点法和网孔法进行电路分析

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

Template BR_Rec_2005.dot

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

Microsoft Word - 第7章 图表反转形态.doc

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

教师上报成绩流程图

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

精 勤 求 学 自 强 不 息 Born to win! 解 析 : 由 极 限 的 保 号 性 知 存 在 U ( a) 当 a 时 f ( ) f ( a) 故 f ( ) 在 点 a 不 取 极 值 f ( ) f ( a) f ( ) f ( a) lim lim a a a a ( a)

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

年 第 期 % %! & % % % % % % &

生产支援功能 使用说明书(IP-110 篇)

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

世华财讯模拟操作手册

目 录 一 激 活 账 号... 2 二 忘 记 密 码 后 如 何 找 回 密 码?... 3 三 如 何 管 理 学 校 信 息 及 球 队 学 生 教 师 等 信 息... 6 四 如 何 发 布 本 校 校 园 文 化? 五 如 何 向 教 师 发 送 通 知? 六

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

DLJ1.nps

 编号:

<4D F736F F D20CAFDD6B5BBFDB7D6D3EBCAFDD6B5CEA2B7D6D1A7CFB0D6B8B5BC2E646F63>

4 进 入 交 互 区 设 置 的 组 件 管 理, 在 组 件 管 理 中, 教 师 可 以 选 择 课 程 空 间 中 的 所 有 组 件, 并 通 过 点 击 启 用 或 不 启 用 选 定 组 件 在 课 程 空 间 中 的 显 示 5 进 入 工 作 室 管 理 的 工 作 室 首 页,

Microsoft PowerPoint - plan03.ppt

云信Linux SSH认证代理用户手册

深圳市新亚电子制程股份有限公司

上证指数

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页


Microsoft Word - 第3章.doc

Cybozu Garoon 3 管理员手册

4.3.3 while 语 句 用 于 无 限 循 环 当 while 语 句 的 表 达 式 永 远 不 会 为 布 尔 假 时, 循 环 将 永 远 不 会 结 束, 形 成 无 限 循 环, 也 称 死 循 环 使 用 while 语 句 构 成 无 限 循 环 的 格 式 通 常

全国教师资格认定管理信息系统

珠江钢琴股东大会

第 三 章 审 计 证 据 2

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )


上海证券交易所会议纪要

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

2 熟 悉 Visual Basic 的 集 成 开 发 环 境 3 了 解 可 视 化 面 向 对 象 编 程 事 件 驱 动 交 互 式 开 发 等 基 本 概 念 4 了 解 Visual Basic 的 特 点 环 境 要 求 与 安 装 方 法 1 Visual Basic 开 发 应 用

抗 日 战 争 研 究 年 第 期

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

第3章 创建数据库

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

电信系教学大纲的基本规范

关于修订《沪市股票上网发行资金申购

第 期 李 伟 等 用 方 法 对 中 国 历 史 气 温 数 据 插 值 可 行 性 讨 论

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

第 六 章 债 券 股 票 价 值 评 估 1 考 点 一 : 债 券 价 值 的 影 响 因 素 2

2006年顺德区高中阶段学校招生录取分数线

!!

·岗位设置管理流程

微 积 分 ( 二 ) 教 学 大 纲 2 (2010 版 ) 课 程 编 码 : 课 程 名 称 : 微 积 分 学 时 / 学 分 :36/2 先 修 课 程 : 初 等 数 学 立 体 几 何 平 面 解 析 几 何 微 积 分 ( 一 ) 适 用 专 业 : 人 力 资 源 管

IntelBook_cn.doc

第三章 作业

国际财务报告准则第13号——公允价值计量

操作手册

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

中 国 软 科 学 年 第 期!!!

!!!!!!!!!!

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

全国艺术科学规划项目

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

数 学 标 准 不 练 习 1.1 理 解 问 题 并 坚 持 解 决 这 些 问 题 1.2 以 抽 象 和 定 量 方 式 推 理 1.3 建 构 可 行 参 数 和 评 判 他 人 的 推 理 1.4 使 用 数 学 方 法 建 模 1.5 策 略 性 地 使 用 合 适 的 工 具 1.6

一 六 年 级 下 册 教 科 书 总 体 说 明 ( 一 ) 教 学 内 容 本 册 教 科 书 一 共 安 排 了 5 个 教 学 单 元, 其 中 前 4 个 单 元 为 新 知 识, 第 五 单 元 是 对 整 个 小 学 阶 段 所 学 数 学 知 识 系 统 的 整 理 和 复 习

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

证券代码: 证券简称:长城电脑 公告编号:

第 一 部 分 MagiCAD for Revit 安 装 流 程

目 录 版 本 更 新 说 明 导 读 读 者 对 象 手 册 内 容 简 介 软 件 简 介 基 本 术 语 技 术 支 持 基 本 流 程 操 作 步 骤... 8

企业管理类职业资格认证书

在 企 业 生 产 过 程 中 (E 水 泥 ), 往 往 需 要 测 量 计 算 许 多 数 据, 而 在 测 量 计 算 过 程 中, 我 们 要 遵 循 那 些 法 则 和 计 算 方 法, 这 就 是 学 习 本 章 的 目 的 重 点 学 习 实 验 数 据 误 差 估 算 及 分 析,


超 级 玛 丽 JAVA 小 游 戏 测 试 报 告 1. 导 言 1.1 编 写 目 的 该 文 档 的 目 的 是 描 述 超 级 玛 丽 JAVA 小 游 戏 的 系 统 测 试 的 总 结 报 告, 其 主 要 内 容 包 括 : 系 统 环 境 的 介 绍 功 能 的 实 现 的 测 试

《应用数学Ⅰ》教学大纲

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

<4D F736F F D DB9FAD5AEC6DABBF5B1A8B8E6CAAEC8FDA3BAB9FAD5AEC6DABBF5B5C4B6A8BCDBBBFAD6C6D3EBBBF9B2EEBDBBD2D7D1D0BEBF>

目 录 页 1. 欢 迎 使 用 网 上 预 约 面 谈 访 问 系 统 新 用 户 新 用 户 登 入 帐 户 程 序 启 动 网 上 预 约 面 谈 访 问 帐 户 核 对 帐 户 的 地 址 资 料


Transcription:

串 的 定 义 串 的 逻 辑 结 构 和 基 本 操 作 串 的 存 储 结 构 串 的 实 现 串 的 模 式 匹 配 算 法 进 阶 导 读 本 章 小 结

3.1 串 的 定 义 假 设 V 是 程 序 设 计 语 言 所 采 用 的 字 符 集, 由 字 符 集 V 上 的 字 符 所 组 成 的 任 何 有 限 序 列, 称 为 字 符 串 ( 或 简 称 为 串 ): s= a 1 a 2 a n (n 0) 其 中 : s 是 串 的 名 ; 两 个 双 引 号 之 间 的 字 符 序 列 a 1 a 2 a n 是 串 的 值 ; a i V (1 i n) 是 字 符 集 上 的 字 符 串 中 字 符 的 数 目 n 称 为 串 的 长 度 长 度 为 0 的 串 称 为 空 串 一 个 串 的 子 串 是 这 个 串 中 的 任 一 连 续 子 序 列 包 含 子 串 的 串 相 应 地 称 为 主 串 通 常 称 字 符 在 序 列 中 出 现 的 序 号 为 该 字 符 在 串 中 的 位 置 相 应 地, 子 串 在 主 串 中 的 位 置 则 以 该 子 串 的 第 一 个 字 符 在 主 串 中 的 位 置 来 表 示 2

3.2 串 的 逻 辑 结 构 和 基 本 操 作 在 逻 辑 结 构 方 面, 串 与 线 性 表 极 为 相 似, 区 别 在 于 串 的 数 据 对 象 约 束 为 字 符 集 字 符 串 的 逻 辑 表 示 : 数 据 对 象 :D={a i a i 字 符 集, i=1,2,,n, n 0} 数 据 关 系 :R={<a j-1, a j > (a j-1 D) (a j D), 2 j n} 3

在 基 本 操 作 方 面, 串 与 线 性 表 差 别 很 大 线 性 表 : 大 多 以 单 个 元 素 为 操 作 对 象, 如 : 在 线 性 表 中 查 找 某 个 元 素 在 某 个 位 置 上 插 入 一 个 元 素 或 删 除 一 个 元 素 等 ; 串 : 通 常 以 串 的 整 体 作 为 操 作 对 象, 如 : 在 串 中 查 找 某 个 子 串 在 串 的 某 个 位 置 上 插 入 一 个 子 串 或 删 除 一 个 子 串 等 字 符 串 数 据 结 构 需 支 持 的 基 本 操 作 : 1. Assign 字 符 串 的 初 始 化, 用 字 符 串 常 量 或 字 符 串 类 型 为 当 前 字 符 串 初 始 化 2. GetLen 获 得 字 符 串 的 长 度 3. IsEmpty 判 断 当 前 字 符 串 是 否 为 空 串 4. Empty 清 空 当 前 字 符 串, 即 使 当 前 串 为 空 串 5. Comp 比 较 两 个 字 符 串 是 否 相 等 6. Concat 将 两 个 字 符 串 拼 接 在 一 起 7. SubString 获 得 位 置 pos 开 始, 长 度 为 len 的 子 串 8. Find 获 得 字 符 串 中 子 串 的 出 现 位 置 除 上 述 基 本 操 作 外, 字 符 串 上 的 操 作 还 包 括 Insert Delete Replace 等 相 对 串 上 的 基 本 操 作, 这 些 操 作 相 对 比 较 复 杂 4

3.3 串 的 存 储 结 构 1. 数 组 存 储 2. 块 链 存 储 5

3.3.1 串 的 数 组 存 储 表 示 (1) 静 态 数 组 存 储 方 法 为 字 符 串 变 量 分 配 一 个 固 定 长 度 的 存 储 空 间 一 般 用 定 长 数 组 加 以 实 现 const int nmaxlen=1024; // 字 符 串 的 最 大 长 度 class SString { private: int nlen; // 字 符 串 的 当 前 长 度 char ch[nmaxlen+1]; // 字 符 串 存 储 空 间 }; 6

(2) 动 态 数 组 存 储 方 法 使 用 C++ 提 供 的 new 操 作 符 分 配 一 块 连 续 的 堆 空 间 class Dstring { private: int nlen; // 字 符 串 长 度 char *ch; // 指 向 当 前 字 符 串 的 指 针 }; 7

3.3.2 串 的 块 链 存 储 表 示 Head F u d a n U n i v e r s i t y # # # # (a) 结 点 大 小 为 5 Head F u d a n... i t y (b) 结 点 大 小 为 1 图 3-1 字 符 串 Fudan University 的 块 链 存 储 方 式 结 点 大 小 的 选 择 和 子 串 存 储 方 式 是 影 响 效 率 的 重 要 因 素 存 储 密 度 串 值 所 占 的 存 储 位 实 际 分 配 的 存 储 位 8

块 链 式 存 储 结 构 对 字 符 串 的 连 接 等 操 作 的 实 现 比 较 方 便, 但 总 体 来 说 操 作 复 杂, 占 用 的 存 储 空 间 大 块 链 存 储 结 构 字 符 串 的 操 作 实 现, 与 线 性 表 的 链 表 实 现 类 似 9

3.4 串 的 实 现 程 序 3-1 提 供 了 字 符 串 的 类 定 义, 封 装 了 3.2 小 节 描 述 的 8 个 基 本 操 作 1. 程 序 3-1 字 符 串 的 类 定 义 #ifndef DSTRING INCLUDED_ 2. #define DSTRING INCLUDED_ 3. 4. const int ninitlen=1024; // 初 始 最 大 长 度 class DString{ 5. public: 6. 7. // 构 造 函 数 : 为 数 组 分 配 ninitlen+1 大 小 的 空 间 ; 初 始 化 串 为 空 串 ; 长 度 为 0 DString( ); // 析 构 函 数 : 释 放 字 符 串 所 占 的 内 存 8. ~DString( ); // 重 载 构 造 函 数 : 用 已 知 的 字 符 串 初 始 化 当 前 字 符 串 9. 10. DString(const DString &strsrc); // 重 载 构 造 函 数 : 用 chsrc 初 始 化 当 前 字 符 串 DString(const char *chsrc); // 内 联 函 数 : 计 算 字 符 串 的 长 度 11. int GetLen( ) const { return nlen; } // 内 联 函 数 : 判 断 当 前 字 符 串 是 否 为 空 串 12. 13. int IsEmpty( ) { return nlen?0:1; } // 内 联 函 数 : 清 空 当 前 字 符 串 void Empty( ) { nlen=0; ch[0]= 0 ; } 14. // 获 得 当 前 字 符 串 位 置 npos 开 始 的 长 度 为 ncount 的 子 串 15. DString GetSub(int npos, intncount)const; // 操 作 符 重 载 : 获 得 指 定 下 标 的 字 符 16. char operator [ ] (int npos)const; // 操 作 符 重 载 : 字 符 串 赋 值 17. Dstring & operator = (const DString &str); // 操 作 符 重 载 : 字 符 串 合 并 18. Dstring & operator += (const DString &str); // 操 作 符 重 载 : 字 符 串 等 值 判 断 19. int operator == (const DString &str) const; // 字 符 串 的 模 式 匹 配 : 精 确 匹 配 20. 21. int Find(DString &strsub) const; // 找 子 串 private: 22. int nlen; // 字 符 串 实 际 长 度 23. char *ch; // 字 符 串 存 储 所 在 的 数 组 24. }; 25. #endif //#define DSTRING INCLUDED_ 10

程 序 3-2 字 符 串 类 的 实 现 1. DString::DString( ){ 2. // 为 动 态 数 组 ch 开 辟 ninitlen+1 的 存 储 空 间 3. ch=new char[ninitlen+1]; 4. if (!ch) { cerr<< Allocate Error!\n ; return; } 5. // 初 始 化 当 前 字 符 串 : 长 度 为 0, 空 串 6. nlen=0; 7. ch[0]= \0 ; 8. } 9. 10. DString::~DString( ) { 11. // 释 放 动 态 数 组 的 存 储 空 间 12. delete [ ] ch; 13. } 14. 11

1. DString::DString(const DString &strsrc) { 2. nlen=strsrc.getlen( ); // 设 置 字 符 串 长 度 3. // 为 动 态 数 组 开 辟 max(strsrc.nlen, ninitlen)+1 的 存 储 空 间 4. if (nlen>ninitlen) 5. ch=new char[nlen+1]; 6. else 7. ch=new char[ninitlen+1]; 8. if (!ch) { cerr<< Allocate Error!\n ; return; } 9. strcpy(ch,strsrc.ch); // 复 制 字 符 串 序 列 10. } 11. DString::DString(const char *chsrc) { 12. nlen=strlen(chsrc); // 设 置 字 符 串 长 度 13. // 为 动 态 数 组 开 辟 max(strlen(chsrc), ninitlen)+1 的 存 储 空 间 14. if (nlen>ninitlen) 15. ch=new char[nlen+1]; 16. else 17. ch=new char[ninitlen+1]; 18. if (!ch) {cerr<< Allocate Error!\n ; return; } 19. strcpy(ch,chsrc); // 复 制 字 符 串 序 列 20. } 12

提 取 子 串 的 算 法 示 例 npos=2, ncount=3 npos=5, ncount=4 i n f i n i t y i n f i n i t y 超 出 f i n npos+ncount-1 nlen-1 i t y npos+ncount-1 nlen 13

1. 2. // 获 取 子 串 DString DString::GetSub(int npos, int ncount)const { 3. DString tmpstring; 4. // 定 义 临 时 字 符 串, 作 为 保 存 子 串 的 临 时 对 象 5. char *pch; // 字 符 串 指 针, 指 向 要 获 取 的 子 串 6. 7. // 判 断 函 数 的 输 入 参 数 是 否 符 合 逻 辑 : // 给 定 子 串 的 在 当 前 串 中 的 位 置 不 能 小 于 0, 8. 9. // 且 子 串 长 度 不 能 小 于 0, 且 子 串 的 不 能 超 出 当 前 串 的 右 边 界 if (npos<0 ncount<0 npos+ncount-1>=ninitlen) { 10. 11. } tmpstring.nlen=0; tmpstring.ch[0]= \0 ; 12. 13. else{ // 将 子 串 拷 贝 到 tmpstring 对 象 中 if (npos+ncount-1<nlen) ncount=nlen-npos; 14. 15. tmpstring.nlen=ncount; pch=ch+npos; 16. memcpy(tmpstring.ch, pch,ncount); 17. tmpstring.ch[ncount]= \0 ; 18. } 19. return tmpstring; // 返 回 获 取 到 的 子 串 20. // 若 函 数 的 参 数 不 合 逻 辑, 返 回 的 是 空 串 21. } 14

1. // 串 赋 值 2. Dstring & DString::operator = (const DString &str) { 3. if (&str!=this) { 4. // 删 除 当 前 动 态 数 组, 并 根 据 str 的 长 度 为 当 前 串 开 辟 存 储 空 间 5. delete [ ]ch; // 释 放 原 有 的 字 符 串 存 储 空 间 6. nlen=str.nlen; // 复 制 字 符 串 的 长 度 7. if (nlen>ninitlen) // 如 果 新 的 长 度 大 于 默 认 的 初 始 化 长 度 8. // 按 新 长 度 申 请 存 储 空 间 9. ch=new char[nlen+1]; 10. else // 否 则, 按 默 认 长 度 申 请 存 储 空 间 11. ch=new char[ninitlen+1]; 12. // 若 申 请 空 间 不 成 功, 则 提 示 错 误 信 息, 并 返 回 空 指 针 13. if (!ch) { cerr<< Allocate Error!\n ; return 0;} 14. // 复 制 字 符 串 序 列 15. strcpy(ch,str.ch); 16. } 17. return *this; 18. } 15

1. Dstring & DString::operator += (const DString &str) { 2. // 当 前 串 与 串 str 拼 接, 拼 接 的 结 果 写 入 当 前 串 3. char *temp=ch; 4. int n=nlen+str.nlen; 5. int m=(ninitlen>=n)? ninitlen:n; 6. // 申 请 新 的 存 储 空 间, 并 进 行 字 符 串 拼 接 7. ch=new char[m+1]; 8. if (!ch) { cerr<< Allocate Error!\n ; return 0; } 9. nlen=n; 10. strcpy(ch,temp); 11. strcat(ch,str.ch); 12. delete [ ]temp; 13. return *this; 14. } 16

1. int DString::operator == (const DString &str) const { 2. // 字 符 串 等 值 判 断 : 相 等 则 返 回 0 3. return strcmp(ch,str.ch); 4. } 5. 6. int DString::Find(DString &strsub) const { 7. // 字 符 串 精 确 匹 配 :Brute-Force 方 法 8. int n=getlen(); 9. int m=strsub.getlen(); 10. for (int j=0; j<=n-m;++j){ 11. for (int i=0; i<m && strsub[i]==ch[i+j]; ++i); 12. if (i>=m) 13. return j; 14. } 15. return -1; 16. } 17

1. char DString::operator [ ] (int npos) const { 2. // 获 取 当 前 串 的 第 i 个 字 符 3. if (npos<0 && npos>=nlen) 4. { cerr<< npos Out Of Bounds! <<endl; return 0;} 5. return ch[npos]; 6. } 18

3.5 串 的 模 式 匹 配 算 法 串 的 模 式 匹 配 算 法 解 决 的 是 在 长 串 中 查 找 短 串 的 一 个 多 个 或 所 有 出 现 的 问 题 通 常, 我 们 称 长 串 为 text, 称 短 串 为 pattern 一 个 长 度 为 m 的 pattern 可 被 表 述 为 x=x[0..m-1]; 长 度 为 n 的 text 可 被 表 述 为 y=y[0..n-1]; 而 模 式 匹 配 的 任 务 是 找 到 x 在 y 中 的 出 现 模 式 匹 配 过 程 中, 程 序 会 查 看 text 中 长 度 为 m 的 窗 口, 即 用 pattern 串 和 text 的 窗 口 中 的 子 串 进 行 比 对 比 对 完 成 后, 将 窗 口 向 右 滑 动, 并 不 断 重 复 这 一 过 程 直 到 根 据 需 要 找 到 所 需 匹 配 为 止 这 种 机 制 被 称 为 滑 动 窗 口 机 制 本 节 所 讨 论 的 若 干 串 模 式 匹 配 算 法 都 是 基 于 滑 动 窗 口 机 制 的 算 法 19

定 义 在 串 中 寻 找 子 串 ( 第 一 个 字 符 ) 在 串 中 的 位 置 词 汇 在 模 式 匹 配 中, 子 串 称 为 模 式, 串 称 为 目 标 示 例 目 标 T : Beijing 模 式 P : jin 匹 配 结 果 = 3 20

模 式 匹 配 的 哲 理 词 汇 目 标 : 外 面 的 世 界 模 式 : 小 小 的 我 定 义 在 外 面 的 世 界 中 寻 找 小 小 的 我 的 位 置 21

BF(Brute-Force) 算 法 BF 算 法 是 最 基 本 的 串 模 式 匹 配 算 法 程 序 3-2 的 Find 函 数 就 是 利 用 BF 算 法 实 现 的 查 找 最 左 匹 配 的 实 现 其 过 程 是 : 依 次 比 对 pattern 和 滑 动 窗 口 中 的 对 应 位 置 上 的 字 符 ; 比 对 完 成 后 将 滑 动 窗 口 向 右 移 动 1, 直 到 找 到 所 需 的 匹 配 为 止 22

第 一 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 2 3 4 x C G T C T C T C 比 较 窗 口 右 移 1 个 位 置 第 二 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 x C G T C T C T C 比 较 窗 口 右 移 1 个 位 置 第 三 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 x C G T C T C T C 比 较 窗 口 右 移 1 个 位 置... 第 六 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 2 3 4 5 6 7 8 x C G T C T C T C 找 到 子 串, 程 序 结 束 Brute-Force 算 法 示 例 ( 图 3-2) 23

穷 举 的 模 式 匹 配 算 法 分 析 ( 时 间 代 价 ) 设 模 式 串 P 有 m 个 字 符, 而 目 标 串 T 有 n 个 字 符 : 最 好 情 况 T 的 前 m 个 字 符 与 P 匹 配, 可 在 m 次 比 较 后 找 到 匹 配 结 果, 算 法 复 杂 度 为 O(m) 最 坏 情 况 假 设 未 进 行 比 较 最 后 一 个 字 符 之 类 的 优 化, 且 第 一 个 字 符 总 是 能 匹 配 上, 但 却 永 远 没 有 匹 配 上 的 模 式 如 :P= abc, T= aaaaaaaa (m=3, n=8), 则 模 式 P= abc 的 m (m=3) 个 字 符 必 须 与 T 中 的 文 本 块 一 共 比 较 n-m+1 次, 一 般 情 况 下 必 须 比 较 m 个 字 符 共 (n-m+1) 次, 即 一 共 进 行 m(n-m+1) 次 而 m(n-m+1) <= m(n-m+m)=mn 算 法 复 杂 度 的 估 计 值 为 O(mn) 算 法 速 度 慢 的 原 因 在 于 回 溯 每 趟 重 新 比 较 时, 目 标 串 的 检 测 指 针 要 回 退 24

BF 算 法 的 特 点 总 结 (1) 不 需 要 预 处 理 过 程 ; (2) 只 需 固 定 的 存 储 空 间 ; (3) 滑 动 窗 口 的 移 动 每 次 都 为 1; (4) 字 符 串 的 比 对 可 按 任 意 顺 序 进 行 ( 从 左 到 右 从 右 到 左 或 特 定 顺 序 均 可 ); (5) 算 法 的 时 间 复 杂 性 为 O(m n); (6) 最 大 比 较 次 数 为 (n-m+1) m 25

KR(Karp-Rabin) 算 法 作 为 最 朴 素 的 字 符 串 匹 配 算 法,BF 算 法 的 效 率 并 不 理 想 其 主 要 原 因 有 二 : 其 一 是 子 串 与 滑 动 窗 口 内 的 子 串 逐 个 字 符 匹 配 所 引 发 的 效 率 问 题 ; 其 二 是 该 算 法 太 健 忘, 前 一 次 匹 配 的 信 息 其 实 可 以 有 部 分 可 以 应 用 到 后 一 次 匹 配 中 的, 而 BF 算 法 只 是 简 单 的 把 这 个 信 息 扔 掉, 重 头 再 来 KR 算 法 优 化 滑 动 窗 口 内 容 逐 一 匹 配 KR 算 法 : 将 滑 动 窗 口 内 m 个 字 符 的 比 较 变 为 一 个 哈 希 值 的 比 较 通 过 对 字 符 串 进 行 哈 希 运 算, 然 后 比 较 子 串 哈 希 值 与 滑 动 窗 口 内 子 串 的 哈 希 值 ; 仅 当 这 两 个 哈 希 值 相 等 时, 再 来 比 较 窗 口 内 的 子 串 是 否 相 等 26

程 序 3-3 Karp-Rabin 算 法 框 架 1. function RabinKarp(string s[0..n-1], string sub[0..m-1]) 2. hsub=hash(sub[0..m-1]); // 计 算 子 串 的 哈 希 值 3. hs=hash(s[0..m-1]); // 计 算 窗 口 内 子 串 的 哈 希 值 4. for i from 0 to n-m 5. // 依 次 比 较 窗 口 内 子 串 与 给 定 子 串 是 否 相 同 6. if hs=hsub 7. if s[i..i+m-1]=sub 8. return i; // 如 果 相 同 则 记 录 位 置 并 退 出 函 数 9. hs=hash(s[i+1..i+m]); // 否 则, 当 前 窗 口 右 移 10. return not found; 11. // 没 有 发 现, 记 录 没 有 发 现 给 定 子 串, 退 出 27

哈 希 算 法 KR 算 法 的 效 率 取 决 于 哈 希 函 数 的 的 选 取 通 常,KR 算 法 使 用 h(x)=x mod q 作 为 哈 希 函 数 滑 动 窗 口 的 哈 希 值 计 算 公 式 : hash(w[0..m-1])= (w[0] 2 m-1 + w[1] 2 m-2 + + w[m-1] 2 0 ) mod q 其 中,q 为 一 个 大 整 数 当 滑 动 窗 口 右 移 时, 需 要 对 当 前 窗 口 内 的 子 串 重 新 利 用 哈 希 函 数 计 算, 其 计 算 公 式 为 : rehash(a,b,h)=((h-a 2 m-1 ) 2+b)mod q 其 中,h 为 上 一 滑 动 窗 口 的 哈 希 值 ;a 为 即 将 移 出 滑 动 窗 口 的 字 符 ;b 是 即 将 移 入 滑 动 窗 口 的 字 符 28

程 序 3-4 Karp-Rabin 算 法 ( 窗 口 长 度 为 m,q 选 取 2 m-1 ) 1. #define Rehash(a, b, h) ((((h)-(a)*d)<<1)+(b)) 2. int KR(char *x,intm, char*y,intn){ 3. int d, hx, hy, i, j; 4. // 预 处 理, 计 算 d=2^(m-1), 这 里 的 d 为 算 法 描 述 中 的 q 5. for (d=i=1; i<m; i++) 6. d=d<<1; 7. // 分 别 计 算 字 符 串 x 和 y 的 哈 希 值 8. for (hy=hx=i=0; i<m; i++) { 9. hx=(hx<<1)+x[i]; 10. hy=(hy<<1)+y[i]; 11. } 12. // 查 找 过 程 13. for (j=0; j<=n-m; j++) { 14. // 如 果 哈 希 值 相 等, 再 判 断 字 符 串 是 否 相 等 15. if (hx==hy && memcmp(x, y+j, m)==0) 16. return j; // 如 字 符 串 相 等, 返 回 位 置 17. hy=rehash(y[j], y[j+m], hy); 18. // 否 则, 对 y 上 的 子 串 重 新 进 行 哈 希 19. } 20. return -1; 21. } 29

第 一 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C x C G T C T C T C Hash(y[0..7])=17910 第 二 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C x C G T C T C T C Hash(y[1..8])=18735 第 三 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C x C G T C T C T C Hash(y[2..9])=19378... 第 六 轮 比 较 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 2 3 4 5 6 7 8 x C G T C T C T C Hash(y[5..12])=Hash(x)=18055 找 到 子 串, 函 数 结 束 图 3-3 Karp-Rabin 算 法 示 例 30

KR 算 法 的 特 点 (1) 利 用 哈 希 的 方 法 ; (2) 预 处 理 需 要 O(m) 的 时 间 和 常 数 的 存 储 空 间 ; (3) 最 坏 情 况 下, 算 法 时 间 复 杂 性 为 O(m n); (4) 算 法 时 间 复 杂 性 的 预 期 为 O(m+n) 31

KMP (Knuth-Morris-Pratt) 算 法 BF 和 KR 算 法 的 一 个 共 同 点 是 每 次 比 较 的 窗 口 向 右 滑 动 的 距 离 均 为 1 KMP 算 法, 旨 在 利 用 pattern 的 内 容 指 导 滑 动 窗 口 向 右 滑 动 的 距 离 k 32

KMP (Knuth-Morris-Pratt) 算 法 Knuth-Morris-Pratt (KMP) 算 法 发 现 每 个 字 符 对 应 的 该 k 值 仅 依 赖 于 模 式 P 本 身, 与 目 标 对 象 T 无 关 1970 年,S. A. Cook 在 进 行 抽 象 机 的 理 论 研 究 时 证 明 了 在 最 差 情 况 下 模 式 匹 配 可 在 N+M 时 间 内 完 成 此 后,D. E. Knuth 和 V. R. Pratt 以 此 理 论 为 基 础, 构 造 了 一 种 方 法 来 在 N+M 时 间 内 进 行 模 式 匹 配, 与 此 同 时,J. H. Morris 在 开 发 文 本 编 辑 器 时 为 了 避 免 在 检 索 文 本 时 的 回 溯 也 得 到 了 同 样 的 算 法 33

KMP 算 法 思 想 T T 0 T 1 T i-j-1 T i-j T i-j+1 T i-j+2 T i-2 T i-1 T i T n-1 ǁ ǁ ǁ ǁ ǁ P p 0 p 1 p 2 p j-2 p j-1 p j 则 有 T i-j T i-j+1 T i-j+2 T i-1 = p 0 p 1 p 2 p j-1 (1) 如 果 p 0 p 1 p j-2 p 1 p 2 p j-1 (2) 则 立 刻 可 以 断 定 p 0 p 1 p j-2 T i-j+1 T i-j+2 T i-1 ( 朴 素 匹 配 的 ) 下 一 趟 一 定 不 匹 配, 可 以 跳 过 去, 也 即 模 式 右 移 一 位 后 依 然 不 匹 配

KMP 算 法 思 想 同 样, 若 p 0 p 1 p j-3 p 2 p 3 p j-1 则 模 式 右 移 2 位 也 不 匹 配, 因 为 有 p 0 p 1 p j-3 T i-j+2 T i-j+3 T i-1 直 到 对 于 某 一 个 k 值, 使 得 p 0 p 1 p k p j-k-1 p j-k p j-1 且 p 0 p 1 p k-1 = p j-k p j-k+1 p j-1 则 p 0 p 1 p k-1 = T i-k T i-k+1 T i-1 T i ǁ ǁ ǁ p j-k p j-k+1 p j-1 p j ǁ ǁ ǁ p 0 p 1 p k-1 p k 模 式 右 移 j-k 位

KMP 算 法 的 关 键 : 模 式 本 身 模 式 右 移 j-k 位 T i-j T i-j+1 T i-j+2 T i-k T i-k+1 T i-1 T i ǁ ǁ ǁ ǁ ǁ ǁ p 0 p 1 p 2 p j-k p j-k+1 p j-1 p j ǁ ǁ ǁ 特 征 向 量 p 0 p 1 p k-1 p k 关 键 : 对 每 个 p j, 如 何 求 k 值??

字 符 串 特 征 向 量 设 模 式 P 由 m 个 字 符 组 成, 记 为 P = p 0 p 1 p 2 p 3 p m-1 令 特 征 向 量 N 用 来 表 示 模 板 P 的 字 符 分 布 特 征, 简 称 N 向 量 和 P 同 长, 由 m 个 特 征 数 n 0 n m-1 整 数 组 成, 记 为 N = n 0 n 1 n 2 n 3 n m-1 N 在 大 多 数 文 献 中 称 为 next 数 组, 每 个 n j 对 应 next 数 组 中 的 元 素 next[j]

字 符 串 的 特 征 向 量 模 式 P 的 前 缀 子 串 ( 首 串 ) P 的 前 t 个 字 符 : p 0 p 1 p 2 p t-1 模 式 P 的 左 子 串 ( 尾 串 ) 在 P 的 第 j 位 置 之 前 的 t 个 字 符, 称 为 j 位 置 的 左 子 串 : p j-t... p j-2 p j-1 模 式 P 第 j 个 位 置 的 特 征 数 n j 最 长 的 (t 最 大 的 ) 能 够 与 前 缀 子 串 匹 配 的 左 子 串 ( 简 称 第 j 位 的 最 长 前 缀 串 ) t 即 p j 的 特 征 数 n j

Knuth 等 人 认 为 合 理 的 右 移 方 案 是 根 据 P[0..j-1] 的 最 大 前 缀 和 最 大 后 缀 能 够 匹 配 的 内 容 来 决 定 窗 口 右 移 的 距 离 为 此 KMP 算 设 计 一 个 next 函 数 : next 1 如 果 0 max 0.. 1.. 1 如 果 0.. 1.. 1 && 0 其 他 情 况

对 应 的 求 特 征 向 量 算 法 框 架 在 KMP 快 速 模 式 匹 配 中, 若 用 ni 表 示 第 i 位 的 特 征 值, 特 征 数 n i+1 ( -1 n i < i ) 可 以 采 用 如 下 定 义 : 1. n 0 = -1; 对 于 i> 0 的 n i+1, 假 定 已 知 前 一 位 置 没 有 优 化 以 前 的 特 征 数 n i = k; 2. 当 k > =0, 且 P i P k 时, 则 令 k = n k, 并 让 步 骤 2 循 环 直 到 条 件 不 满 足 ( 变 为 P i = =P k, 或 上 一 步 骤 k == 0 而 导 致 k = n k 步 骤 后 k == -1 了 ); 3. n i+1 = k+1( 这 是 没 有 优 化 以 前 的 特 征 数, 在 优 化 前 传 到 第 一 步 用 于 计 算 下 一 个 特 征 值 );

计 算 next 数 组 1. 求 p 0, p 1,,p j-1 中 最 大 相 同 的 前 缀 与 后 缀 的 长 度 t 2. next[j] = t 计 算 next[j] 时 充 分 利 用 了 位 置 j 之 前 的 各 个 字 符 的 next 值

KMP 算 法 // 不 带 优 化 // 预 处 理 : 计 算 Next 数 组 1. void preprocessing(char *p, int m, int Next[]){ 2. for (int i=0,j=next[0]=-1;i<m-1;){ 3. if (j==-1 p[i]==p[j]){ 4. i++; j++; 5. Next[i]=j; 6. } 7. else 8. j=next[j]; 9. } 1. int KMP(char *p, int m, char *t, int n) 2. { 3. int i, j, Next[SIZE]; 4. // 预 处 理 5. preprocessing(p,m, Next); 6. // 查 找 7. for (i=j=0;j<n;){ 8. if (i==-1 p[i]==t[j]) 9. { i++; j++; } 10. else 11. i = Next[i]; 12. if (i>=m) 13. return j-i; 14. } 15. return -1; 16. }

KMP 模 式 匹 配 : 示 例 a b a c a a b a c c a b a c a b a a 1 2 3 4 5 6 a b a c a b 7 a b a c a b j P j N j 0 a -1 1 b 0 2 a 0 3 c 1 4 a 0 5 b 1 8 9 10 11 12 a b a c a b 13 a b a c a b 14 15 16 17 18 19 a b a c a b

KMP 模 式 匹 配 : 示 例 优 化 的 next[] a b a c a a b a c c a b a c a b a a 1 2 3 4 5 6 a b a c a b 7 8 9 1011 a b a c a b 121314151617 a b a c a b j 0 1 2 3 4 5 P j a b a c a b N j -1 0-1 1-1 0

优 化 后 的 求 特 征 向 量 算 法 框 架 一 般 把 模 式 的 第 一 个 字 符 的 特 征 数 设 置 为 -1, 以 尽 可 能 地 减 少 冗 余 比 较 : 在 KMP 快 速 模 式 匹 配 中, 若 用 ni 表 示 第 i 位 的 特 征 值, 特 征 数 n i+1 ( -1 n i < i ) 可 以 采 用 如 下 定 义 : 1. n 0 = -1; 对 于 i> 0 的 n i+1, 假 定 已 知 前 一 位 置 没 有 优 化 以 前 的 特 征 数 n i = k; 2. 当 k > =0, 且 P i P k 时, 则 令 k = n k, 并 让 步 骤 2 循 环 直 到 条 件 不 满 足 ( 变 为 P i = =P k, 或 上 一 步 骤 k == 0 而 导 致 k = n k 步 骤 后 k == -1 了 ); 3. n i+1 = k+1( 这 是 没 有 优 化 以 前 的 特 征 数, 在 优 化 前 传 到 第 一 步 用 于 计 算 下 一 个 特 征 值 ); 4. 若 P i+1 = =P k+1, 则 n i+1 = n k+1 ( 此 步 骤 为 优 化 )

程 序 3-5 KMP 算 法 // 带 优 化 1. // 预 处 理 : 计 算 Next 数 组 2. void preprocessing(char *p, int m, int Next[]){ 3. for (int i=0,j=next[0]=-1;i<m-1;){ 4. for (;j>-1&&p[i]!=p[j];) 5. j=next[j]; 6. i++; j++; 7. if (p[i] == p[j]) 8. Next[i]= Next[j]; 9. else 10. Next[i]=j; 11. } 12. } 1. int KMP(char *p, int m, char *t, int n) 2. { 3. int i, j, Next[SIZE]; 4. // 预 处 理 5. preprocessing(p,m, Next); 6. // 查 找 7. for (i=j=0;j<n;){ 8. for (;i>-1&&p[i]!=t[j];) 9. i = Next[i]; 10. i++; j++; 11. if (i>=m) 12. return j-i; 13. } 14. return -1; 15. }

程 序 3-5 KMP 算 法 // 带 优 化 1. // 预 处 理 : 计 算 Next 数 组 2. void preprocessing(char *p, int m, int Next[]){ 3. for (int i=0,j=next[0]=-1;i<m-1;){ 4. for (;j>-1&&p[i]!=p[j];) 5. j=next[j]; 6. i++; j++; 7. if (p[i] == p[j]) 8. Next[i]= Next[j]; 9. else 10. Next[i]=j; 11. } 12. } i 0 1 2 3 4 5 P j a b a c a b N j -1 0 0 1 0 1 i 0 1 2 3 4 5 P j a b a c a b N j -1 0-1 1-1 0

预 处 理 过 程 i x[i] Next[i] 0 1 2 3 4 5 6 7 8 C G T C T C T C -1 0 0-1 1-1 1-1 1 查 找 过 程 第 一 轮 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 2 3 4 x C G T C T C T C 窗 口 右 移 4(i-Next[i]=3-(-1)) 第 二 轮 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 x C G T C T C T C 窗 口 右 移 1(i-Next[i]=0-(-1)) 第 三 轮 : y C G T A G C G T C T C T C A T A T G T C A T G C 1 2 3 4 5 6 7 8 x C G T C T C T C 找 到 子 串, 程 序 结 束 图 3-4 KMP 算 法 示 例

KMP 算 法 的 特 点 (1) 与 BF 算 法 类 似, 按 照 从 左 到 右 的 顺 序 进 行 比 较 ; (2) 预 处 理 需 要 O(m) 的 时 间 和 存 储 空 间 ; (3) 算 法 时 间 复 杂 性 为 O(m+n); (4) 查 找 阶 段 的 最 大 比 较 次 数 为 2n-1 49

BM(Boyer-Moore) 算 法 ( 不 要 求 )

3.6 进 阶 导 读 在 C++ 的 STL 库 中 对 字 符 串 进 行 了 封 装 [1], 微 软 的 ATL/MFC 中 将 其 封 装 为 CStringT/CString [2] 最 近, 英 特 尔 在 其 最 新 的 CPU 中 增 加 了 字 符 串 处 理 的 硬 件, 以 加 速 字 符 串 处 理 的 效 率 [3] 字 符 串 匹 配 算 法 可 分 为 两 类 : 精 确 匹 配 和 近 似 匹 配 本 章 所 介 绍 的 模 式 匹 配 算 法 属 于 精 确 匹 配 51

习 题 见 助 教 在 elearning 上 的 通 知 补 1: 试 证 明 KMP 的 算 法 复 杂 度