程序设计方法与实践-时空权衡

news2024/11/27 8:23:50

什么是时空权衡?

时空权衡是算法设计中的一个众所周知的问题,也就是对算法的空间和时间效率做出权衡,它大概有分两种形式:

  • 对输入的部分数据或者全部数据作预处理,然后对于获得额外信息储存起来,从而加快后面问题的求解速度——加强输入
  • 使用额外的空间来储存已有的信息,使达到加快问题求解的目的——预构造

输入增强

  • 计数排序
  • 字符串匹配

计数排序

思路:

对于待排序列表中的每一个元素,算出比该元素小的元素的数量,并将这些数据记录在一张表中。

伪码描述:

Comparison ( A[0,2……n-1] ){
    for(int i=0; i<n; i++) Count[i]=0;  //Count用来记录多少元素比他它小,一定要初始化!
    for(int i=0; i<n; i++){
        for(int j=i+1; j<n; j++){
            if(A[j]<a[i]) Count[i]++;
            else Count[j]++;
        }
    }
    for(int i=0; i<n; i++){
        S[Count[i]]=A[i];  //这里很有意思,Count存的也正好,该元素在有序表中的下标
    }
    return S;
}

过程详解: 

分析总结:

如果只从这个角度看,似乎这个算法并没有多么高效。不难分析,它的时间复杂度为\Theta (n^{2}),并不比蛮力法要好,但是在一些特殊情况下,计数排序是有一定优势的。

例如,如果待排序列表中的元素都来自于某个数列,那么此时使用计数排序将会高效很多:

如图,待排序列表中有11、12、13,它们都在数列[11,12,13]中,那么我通过计数排序的思想,先去统计11,12,13分别出现了多少次,然后将这个数据存在一张表中,而也代表了这个元素在有序表中最后一次出现的下标:

DistributionCounting (A[0,1……],U,L){  //U是元素最大值,L是最小值
    for(int i=0; i<U-L; i++)  D[i]=0;
    for(int j=0; j<n; j++){
        D[A[j]-L]++;
    }
    for(int j=1; j<U-L; j++) D[j]=D[j-1]+D[j];  //这个好好理解,实现了数组的复用
    for(int i=n-1; i>=0; i--){
        j=A[i]-L;
        S[D[j]-1]=A[i];
        D[j]--;
    }
    return S;
}

此时的时间的复杂度是\Theta (n)的,也就是线性的,这是因为这个算法充分利用了数组的自然属性。

Boyer-Moore(BM算法) 

我们先回想一下字符匹配的暴力算法,它的最坏时间复杂度是\Theta (mn),而最效率度是\Theta (n)也就是线性的。接着让我们来了解一下BM算法。

Hoespool算法

首先在讲解BM算法之前,我们先了解一下BM算法的简化版——Horspool算法:

  • 与蛮力法相比较,Horspool算法在匹配方式上的区别就在于,蛮力法是从模式串的左边向右边匹配,而Horspool算法是从模式串的右边向左边进行匹配的
  • 实现Horspool算法的关键就在于建立一个“坏”字符表,表中储存的是,当字符串当前匹配失败是时,字符串应该移动多少的长度。

//要注意的是这个表是以文本串中可能出现的字符为索引的

  • 对于每一个字符可以创建下面的字符移动公式:

t(c)=m

t(c)=模式串中前m-1个字符的最后一个c,到模式串的最后一个字符的距离

过程详解:

文本串:S[ ]

模式串:BARBER

  1. 对于文本串中的所有字符,除了字符为E,B,R,A的单元格分别填上1,2,3,4,其他所有没有在模式串中出现的字符的单元格全部是6(模式串的长度)。
  2. 然后建立“坏”字符表,从左到右扫描模式串表,对前m-1个字符的第i个字符在文本串中对应的单元格的值改为m-1-i(就是该字符到最右端的距离)。(要注意的是应该重复扫描m-1次)

伪码描述:

HorsopoolMatching (S[0..m-1],T[0..n-1]){
    ShiftTable(P[0..m-1]);
    i=m-1;
    while(i<n){
        k=0;
        while(k<m && S[m-1-k]==T[i-k])
            k++;
        if(k==m)
            return i-(m-1);
        else
            i=i+Table[T[i]];
    }
    return -1;
}

建立移动表的函数如下:

ShiftTable(P[0..m-1]) {
    //创建一个以文本串字符为索引的Table数组,并将其全部初始化为m
    for(int j=0; j<m-2; j++){
        Table[P[j]]=m-1-j;
    }
    return Table;
}

下面是一个匹配的具体过程,方便大家理解:

可以看到显示建立了一个移动字符表,现将文本串与模式串对齐,并从模式串右边开始匹配,A-R,匹配失败,去查字符移动表,A(4),即将模式串向右移动四个单位,后面的过程以此类推。

PS:当匹配失败时,要查表的字符并不是当前匹配失败的字符,而应该是模式串末尾对应文本串中字符的移动表值!!!

BM算法

值得注意的是,BM算法在匹配失败时,模式串移动的距离d应该由两个数值决定。

第一个数值d1:当字符匹配失败时,已经有k(0<=k<m)个字符匹配成功,那么BM算法与Horspool算法的处理不同。BM算法的处理是将模式串向右移动t(c)-k个单位。

第二个数值d2:构建一个好后缀移动表

k代表的是,模式串的末尾k位,把其称作好的后缀。例如,k=1时,后缀为B,而模式串中有3个这样的后缀,d2会等于将从右往左数第二个后缀与移动到右往左数第一个后缀的距离,2。又如,k=2时,后缀为AB,模式串中有2个后缀AB,d2会等于将倒数第一个AB移动倒数第二个AB的距离,4。但要注意的是,当这一个后缀只在模式串中出现了一次时,就需要观察这个后缀的子集,例如,k=3时,后缀为BAC,但是模式串中只有一个BAB,此时我们去观察它的子集,发现子集AB存在,所以此时d2=将从右往左数第二个AB与移动到右往左数第一个AB的距离

PS:而此时的要查表的字符就是匹配失败的那个字符!!!

总结一下:就是

下面详细讲解一个过程,先给出文本串,模式串:

然后建立”坏“字符表,以及好后缀移动表

 然后进行字符串匹配:

 以上是讲解了关于是时空权衡的两个经典算法,计数排序、BM算法,其中BM算法的过程可能比较难以理解,需要大家反复琢磨思考,其实并不难,只是细节东西比较多。

加油!!!加油!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F1学习——TIM

一、STM32中的定时器 在STM32中分为三种定时器&#xff0c;分别是基本定时器&#xff0c;通用定时器和高级定时器&#xff0c;每种定时器都是向下兼容的。 二、定时器详细介绍 a、基本定时器 基本定时器主要由下面与分频器、计数器 和 自动重装寄存器三个组成的时基单元&#…

W5500-EVB-Pico2评估板介绍

目录 1 概述 2 板载资源 2.1 硬件规格 2.2 硬件规格 2.3 工作条件 3 参考资料 3.1 RP2350 数据手册 3.2 W5500 数据手册 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图 (单位 : mm) 3.4 参考例程 认证 CE FCC AWS 资质 Microsoft Azure 认证…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。

Oracle视频基础1.4.3练习

15个视频 1.4.3 できない dbca删除数据库 id ls cd cd dbs ls ls -l dbca# delete a database 勾选 # chris 勾选手动删除数据库 ls ls -l ls -l cd /u01/oradata ls cd /u01/admin/ ls cd chris/ ls clear 初始化参数文件&#xff0c;admin&#xff0c;数据文件#新版本了…

一个由Deno和React驱动的静态网站生成器

大家好&#xff0c;今天给大家分享一个由 Deno React 驱动的静态网站生成器Pagic。 项目介绍 Pagic 是一个由 Deno React 驱动的静态网站生成器。它配置简单&#xff0c;支持将 md/tsx 文件渲染成静态页面&#xff0c;而且还有大量的官方或第三方主题和插件可供扩展。 核心…

1分钟解决Excel打开CSV文件出现乱码问题

一、编码问题 1、不同编码格式 CSV 文件有多种编码格式&#xff0c;如 UTF - 8、UTF - 16、ANSI 等。如果 CSV 文件是 UTF - 8 编码&#xff0c;而 Excel 默认使用的是 ANSI 编码打开&#xff0c;就可能出现乱码。例如&#xff0c;许多从网络应用程序或非 Windows 系统生成的 …

发布天工AI高级搜索功能,昆仑万维做最懂科研学术的AI搜索

今天&#xff0c;昆仑万维天工AI正式发布最新版本的AI高级搜索功能。 一年时光&#xff0c;栉风沐雨。昆仑万维致力于通过领先的AI技术&#xff0c;为全球用户提供创新的智能搜索和信息处理解决方案。无论是金融、科技领域的专业搜索还是文档分析&#xff0c;「天工AI高级搜索…

mac找到主目录下的文件夹

访达-&#xff08;上方状态栏显示&#xff09;-然后在

安装fpm,解决*.deb=> *.rpm

要从生成 .deb 包转换为 .rpm 包&#xff0c;可以按照以下步骤修改打包脚本 1. 使用 fpm 工具 fpm 是一个强大的跨平台打包工具&#xff0c;可以将 .deb 包重新打包成 .rpm&#xff0c;也可以直接从源文件打包成 .rpm。 安装 fpm sudo apt-get install ruby-dev sudo gem in…

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…

数据结构:LRUCache

什么是LRUCache 首先我们来看看什么是cache 缓存&#xff08;Cache&#xff09;通常用于两个速度不同的介质之间&#xff0c;以提高数据访问的速度和效率。这里有几个典型的应用场景&#xff1a; 处理器和内存之间&#xff1a; 处理器&#xff08;CPU&#xff09;的运算速度远…

智能提醒助理系列-springboot项目彩虹日志+TraceID

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍如何让springboot启动日志“彩打” 提升日志识别度&#xff0c;同时增加TraceID&#xff0c;便于同一请求&#xff0c;全链路的追踪。 一、需求出发点 提升日志识别度…

窨井监测遥测终端RTU IP68防水强信号穿透力

在窨井的潮湿 黑暗和腐蚀性环境中 常规物联网设备往往难以生存 如何突破层层环境挑战 轻松应对极端条件 确保信号 24h不掉线&#xff0c;不延迟 不仅是对技术的突破 更是对恶劣环境的征服 ↓↓↓ 坚守 ——严苛环境下的工业设备 计讯物联工业级设备&#xff0c;专为恶劣环境设计…

150道MySQL高频面试题,学完吊打面试官--如何实现索引机制

前言 本专栏为150道MySQL大厂高频面试题讲解分析&#xff0c;这些面试题都是通过MySQL8.0官方文档和阿里巴巴官方手册还有一些大厂面试官提供的资料。 MySQL应用广泛&#xff0c;在多个开发语言中都处于重要地位&#xff0c;所以最好都要掌握MySQL的精华面试题&#xff0c;这也…

基于Matlab 模拟停车位管理系统【源码 GUI】

系统对进入停车位的车辆进行车牌识别&#xff0c;将识别出来的车牌号显示出来&#xff1b;然后对车主进行人脸识别&#xff0c;框出车主照片的人脸部分作为车主信息的标记&#xff0c;记录在系统库中。车辆在库期间&#xff0c;系统使用者可以随意查看车辆与车主信息的获取过程…

微信小程序 https://pcapi-xiaotuxian-front-devtest.itheima.net 不在以下 request 合法域名

微信小程序在调用接口的时候出现以上报错&#xff0c;接口没有问题&#xff0c;是因为小程序自动校验了合法域名 打开本地设置&#xff1a; 勾选不校验合法域名&#xff0c;即可 效果如下&#xff1a;

数据治理,数据提取,大数据中心建设,大数据治理总体解决方案书(word,ppt原件)

1. 数据管理的现状 2. 数据治理的概述 1.1数据治理概念 2.2数据治理目标 3. 数据治理体系 4. 数据治理核心领域 1.1 数据模型 1.2 数据生命周期 &#xff08;1&#xff09;数据生成及传输 &#xff08;2&#xff09;数据存储 &#xff08;3&#xff09;数据处理和应用…

电机控制储备知识 二:电磁学理论知识

一&#xff1a;磁场的发现过程和和一些实验现象 古代发现&#xff1a;公元前七世纪&#xff0c;中国和古希腊的学者就已经发现了磁石。 吉尔伯特的研究&#xff1a;1600年&#xff0c;英国女王御臣威廉吉尔伯特&#xff08;William Gilbert&#xff09;发表了《地磁论》&#…

Java:数组的定义和使用(万字解析)

目录 1. 数组的概念 2. 数组的基础知识 2.1 数组的创建 \1. 基础创建格式&#xff1a; \2. 类似C语言的创建格式&#xff1a; 【错误的创建(初始化)格式】 2.2 数组的数据类型 2.3 数组的初始化 —— 两种方式 \1.动态初始化&#xff1a;(完全默认初始化) \2. 静态初…

ProLightsfx新的出发–从CSDN到WordPress

原文链接&#xff1a;ProLightsfx新的出发--从CSDN到WordPress_ProLightsfx的技术分享 &#xff08;https://www.prolightsfxjh.com/article/article-new-start/&#xff09; 大概有差不多2年时间没有在csdn发布文章了。可能主要是最近几年工作有些疲惫、精神有些懈怠&#xff…