ACM 中 矩阵数据的预处理

我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各个元素进行求和。然而当$a$或$b$很大的时候,这样的计算显得太慢,如果要求子矩阵的最大元素和(如Ural 1146),更是简直慢到不能忍。

于是就想,能不能在读入数据的同时,我就先进行一些预处理,使得到后面进行计算的时候,可以简化一些步骤呢?答案是可以的。

通常对矩阵有两种预处理:

一种是把矩阵拍扁,即把前一列或前一行加到后一列或后一行上:

按列压缩↑,紫色部分和=棕色部分和-橙色部分和

按行压缩↑,紫色部分和=棕色部分和-橙色部分和

开一个二维数组存放矩阵,第$0$行和第$0$列全都置$0$,我们真正的矩阵在数组中下标从$1$开始。

以按行压缩为例,读入当前元素$t=A_{ij}$后,我们令$B_{ij}=A_{ij}+B_{i-1,j}$,以此类推,当所有数据读入后,预处理即完成,$B_{ij}$表示对于矩阵$A$的第$j$列,从第$1$行到第$i$行的和。这样我们若想要知道矩阵$A$第$j$列上,从第$p$行到第$q$行的和,直接用$B_{qj}-B_{p-1,j}, (p<=q)$一步求出,而不需要进行$q-p+1$步计算,那么从左上角$A_{ab}$到右下角$A_{ij}$的子矩阵元素和为\$sum=\sum_{p=a}^{i}\sum_{q=b}^{j}A_{pq}=\sum_{q=b}^{j}B_{iq}-\sum_{q=b}^{j}B_{a-1,q}\$,大大减少了计算量,降低了时间复杂度。

读入预处理↑,右图紫色块=4+24+30-18=40

计算区域和↑,紫色区域和=60-12-15+3=36

而另一种则是压缩到一个元素上,用$B_{ij}$表示从最左上角元素$A_{11}$到元素$A_{ij}$的和$\sum_{p=1}^{i}\sum_{q=1}^{j}A_{ij}, (i \geq 1, j \geq 1)$,为了保持这一性质,我们在读入当前元素$t=A_{ij}$后,令$B_{ij}=A_{ij}+B_{i,j-1}+B_{i-1,j}-B_{i-1,j-1}$。当所有数据读入后,预处理即完成。我们若想要求出从左上角$A_{ab}$到右下角$A_{ij}$的子矩阵元素和,只需三步计算即可:sum=$\sum_{p=a}^{i}\sum_{q=b}^{j}A_{pq}$=$B_{ij}-B_{i,b-1}-B_{a-1,j}+B_{a-1,b-1}$,使时间复杂度降低到常数。

By Black Storm(使用为知笔记)

时间: 2024-08-08 23:14:26

ACM 中 矩阵数据的预处理的相关文章

WEKA中的数据预处理

数据预处理包括数据的缺失值处理.标准化.规范化和离散化处理. 数据的缺失值处理:weka.filters.unsupervised.attribute.ReplaceMissingValues. 对于数值属性,用平均值代替缺失值,对于nominal属性,用它的mode(出现最多的值)来代替缺失值. 标准化(standardize):类weka.filters.unsupervised.attribute.Standardize.标准化给定数据集中所有数值属性的值到一个0均值和单位方差的正态分布.

ACM中常用算法----字符串

ACM中常用算法--字符串 ACM中常用的字符串算法不多,主要有以下几种: Hash 字典树 KMP AC自动机 manacher 后缀数组 EX_KMP SAM(后缀自动机) 回文串自动机 下面来分别介绍一下: 0. Hash 字符串的hash是最简单也最常用的算法,通过某种hash函数将不同的字符串分别对应到不同的数字.进而配合其他数据结构或STL可以做到判重,统计,查询等操作. #### 字符串的hash函数: 一个很简单的hash函数代码如下: ull xp[maxn],hash[max

第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析

前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据工程到底是如何实施的呢? 本文将以IBM的Itelligent Utility Network产品为例阐述智能电网中的数据工程,它是IBM声称传统电网向智能电网转变的整体方案(看过上篇文章的童鞋想必会清楚这样的说法是片面狭隘的,它只能算是智能电网中的数据工程). 另一方面,如今是一个数据爆炸的时代,

MySQL批量更新不同表中的数据

今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录. 当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有.私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是什么类型(公有.私有.临时)的业务表对数据的固定字段做统一规律的处理. 下面为当时所编写的存储过程: BEGIN DECLARE done INT; DECLARE v_table_name VARCHAR(100); DECLARE v_disable VARCHAR(100); DECLARE v

288-基于XC7K325T的3U VPX FMC接口数据收发预处理平台

基于XC7K325T的3U VPX FMC接口数据收发预处理平台 一.板卡概述       标准VPX 3U板卡, 基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动.,可应用于高性能计算,频域算法,如与FFT的加速等:配合AD,DA FMC子卡,实现高速数据采集,回放.

ACM中杨辉三角的多种解法

杨辉三角的多种解法 杨辉三角的相信大家很熟悉吧,但是大家能用多少中方法写出来呀,一般人都只会想到两种,递归和二项式.当用递推时,有时在解题是根本没必要需要那么多呀,而只要杨辉三角的某一行,数据小时,我们可以用二项式来计算,但是数据比较大时,二项式算也是很麻烦的,那么还有其它的方法吗?所以下面我就介绍几种计算杨辉三角的方法吧. 主要要记住第四种.... 完整版下载:http://download.csdn.net/detail/u010304217/7750997 博客版下载:http://dow

【技巧】freopen()函数在ACM中的应用

在做题目的过程当中,我们需要在本机上调试,当然我们可以把测试用例一遍一遍粘贴复制,也经常会遇到测试用例很多的时候,输入和输出混了,还要去找输出和题目当中的对照.另外,有的时候题目给的测试用例太少,需要自己或者队友给想几个临界条件,自己动手多添加几个测试用例,每测一遍都要动手输入的话麻烦又浪费时间.这时候freopen()上场了. 函数名:    freopen() 函数声明:  FILE  *freopen(const char *path,const char *mode,FILE *stre

用黏贴板读取excel中的数据以及用R生成人名

本人尚在超级菜鸟级别,中间有些代码写的很low,请不要见笑! 1.今天先跟大家分享一个小技巧,用黏贴板将excel中的数据读进R 首先选中要读入R的数据 如图,上面是我分析的病人相关资料,Ctrol+C选中目标区域,接着在R运行以下代码: excel_clinic_data <- read.table("clipboard",sep="\t",header = T) 运行后就可以看到我们想要读到R中的数据已经读进来了,超级方便. 注意:经本人试验,好像不支持不

访问cv::Mat中的数据时遇到的指针类型问题

在用Opencv的时候由于下图原本的图像尺寸是1111*1111,要进行resize,代码如下: cv::Mat img = cv::imread("//Users//apple//td3//vase//19201.png",CV_LOAD_IMAGE_GRAYSCALE); cv::Mat img2; cv::resize(img, img2, cv::Size(400,400),0,0, cv::INTER_AREA); 因为我根本不知道img的数据是什么类型(不知道数据类型根本无