《算法问题实战策略》-chaper17-部分和
数组上的一个基本优化——部分和:
对于一定长度的数组,我们想不断访问这个数组上的某个区间的和,我们能够怎么做呢?这里先不去谈一些数据结构在这个问题上的优化处理。首先我们最简单的一个方法就是穷举出所有区间段然后求值保存起来,但是O(n^2)的时间复杂度并没有太多的实际应用的意义。
这里考虑一个非常简单但是常用的优化方法——部分和。
对于一个数组a[],我们在输入数据的时候,顺便记录数组部分和psum[],而对于部分和数组psum[]的定义如下:
psum[i] = ∑a[j] , j∈[1,j].
基于部分和数组,能够看到,我们在多次访问数组某个区段的和的时候,可以通过O(1)的时间复杂度得到,即a[i] + a[i+1]+…a[j] = psum[j] – psum[i].
结合一个具体的题目我们来尝试一下这个方法:
Q:假设有以正数和负数组成的数组A[],其数组中区间之和最接近0的区间。
考虑从部分和的角度去优化处理这个问题,我们首先得到这个数组的部分和,但是这里需要用结构体记录一下psum[]当前的下标。然后我们回到一开始的问题,区兼职和最接近零,也就是min{|psum[i]-psum[j]| | i、j∈[1,n]},我们将psum[]数组进行排序,然后在线性时间复杂度O(n)下维护一个psum[i+1]-psum[i]的最小值即可,两个结构体元素存着的下标变量即是原来数组对应的区段。
综合起来,整体的时间复杂度是O(nlog n) + O(n),相比O(n^2)已经优化很多了。
在c++STL中有直接进行部分和的函数,简单的用法如下:
#include <iostream> #include <functional> #include <numeric> using namespace std; int main () { int val[] = {,,,,}; int result[]; partial_sum (val, val + , result);//用法:partial_sum(<数组起点>,<数组终点>,记录部分和的数组) cout << "using default partial_sum: "; for (int i=; i < ; i++) cout << result[i] << ' '; return ; }
《算法问题实战策略》-chaper17-部分和的更多相关文章
- 算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper32-网络流
基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- Android常用功能代码块(转)
1.设置activity无标题,全屏 // 设置为无标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置为全屏模式 getWindow(). ...
- Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
一. 移动支付: 用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...
- centos 安装 lnmp
直接yum install nginx不行,要先处理下源,下面是安装完整流程 1. rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/ng ...
- 【原创】FAT32系统硬盘的数据恢复实例,这篇文章也是从自己QQ空间的,转移过来的
FAT32系统硬盘的数据恢复实例软件:win hex(16进制的编辑器)恢复内容:在FAT32中恢复一张图片1.首先我们格式化一个分区为空,让分区的系统选为FAT32系统格式化.如下: psb.jpg ...
- python手机号码运营商归属测试
#手机号码测试: def number_test(): while True: number = input('Please enter your phone number:') CN_mobile ...
- CSS对浏览器的兼容性常见处理方式小结
CSS技巧 1.div的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了. 缺点:要控制内 ...
- H5移动端的注意细节
1. max-width用在pc端页面,max-device-width用在移动设备上 2. device-pixel-ratio 设备像素比 3.设备自己单位-物理单位dp/dip css像素 px ...
- winapi获取鼠标位置
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Threading; na ...
- .Net程序员关于微信公众平台测试账户配置 项目总结
今天项目第一次验收,夜晚吃过晚饭后,想把项目中用到的关于微信配置总结一下,虽然网上关于这方面的资料很多很多,还有官方API,但是总感觉缺点什么,就像期初做这个项目时,各方面找了很久的资料,说说配置吧! ...
- cxf webservice异步调用
http://blog.csdn.net/changpingchen/article/details/9048347 http://www.oschina.net/question/780719_12 ...