并行计算前缀和
pascal - 结构化编程语言
Pascal语言语法严谨,层次分明,程序易写,可读性强,是第一个结构化编程语言。
for i=0 to logn-1 do //for循环i=0开始循环一次i++,直到i=logn-1
parfor j=2^i+1 to n do //for循环j=2^i+1开始循环一次j++,直到j=n
aj<-aj-2^i+aj //aj加上aj-2^i赋值给自己
end //结束
end //结束
FOR TO DO语句
FOR 循环控制变量:=循环初值 TO 循环终值 DO 循环的语句(或语段)
倍增法
倍增法就是用来降低时间复杂度的,2的倍数跳着查询第1,2,4,8,16时间复杂度为O(logn)比挨个查询1,2,3,4时间复杂度为O(n)降低了很多。
举例:
A、B两点之间相隔若干单位为1的距离,如何从最快地从A走到B?
朴素的想法是:因为A B之间距离未知,只能从A开始试探性走1步、走2步、……看看走多少步能到达B,这样的时间复杂度是o(n)的。当然这样是不够高效(耗时间)。
实际上可以只记录走1,2,4,8,16步能到达的地方
从A出发:若跳8个格子(超过B了,放弃)
若跳4个格子(超过B了,放弃)
若跳2个格子(没超过B,可以跳)
若跳1个格子(没超过B,可以跳)
其中关键的思想是:它绝对不会连着跳两步都是跳相同的格子数,例如:如果跳两次2个格子都是可行的话,那么它干嘛不直接跳4个格子呢?依此类推。。。。。。
算法级联
算法级联是指将多个算法按照一定的顺序和方式进行组合,以解决更复杂的问题或优化算法性能的过程。算法级联可以充分利用不同算法的优势,解决更复杂的问题或优化算法性能。但同时也需要注意算法之间的依赖关系和性能要求,确保算法的组合是合理有效的。
高低分治:基本思想是将问题分解成若干个子问题,然后对每个子问题进行求解,最后将子问题的解合并得到原问题的解。不同之处在于,高低分治在划分子问题的时候会将问题按照某个参数进行分类,然后将参数较大的子问题称为"高"问题,参数较小的子问题称为"低"问题。时间优势
具体步骤如下:
-
将原问题按照某个参数进行分类,并将参数较大的子问题称为"高"问题,参数较小的子问题称为"低"问题。
-
对"高"问题进行分治处理,将其分解为更小的子问题,可以递归地调用高低分治算法来解决。
-
对"低"问题进行求解,可以使用其他算法或者直接求解。
-
将子问题的解合并得到原问题的解。
高低分治算法的主要优点是可以将问题分解为不同规模的子问题,使得每个子问题的解决方法可以自由选择,从而提高算法的效率。
奇偶分治:它将问题分成两个部分,分别处理奇数和偶数的情况,然后合并得到最终的结果。奇偶分治法的优点是可以将问题分解为两个独立的子问题,并利用递归的方式解决。这样可以简化问题的复杂度和难度。成本优势 O(logn)
奇偶分治法的一般步骤如下:
- 将原问题分为两个子问题,一个处理奇数的情况,一个处理偶数的情况。
- 对于奇数的情况,使用递归的方式解决该子问题。如果条件允许,可以再次将奇数划分为更小的奇数子问题。
- 对于偶数的情况,使用递归的方式解决该子问题。如果条件允许,可以再次将偶数划分为更小的偶数子问题。
- 将奇数和偶数子问题的结果合并,得到最终的结果。
奇偶分治(高低分治):O(2logn)降低到O(logn)成本无法降低(舍弃)
高低分治(奇偶分治):在高低分治算法中利用奇偶分治作为子模块降低成本。高低分治将数组**(数组规模为n)分为高低两部分(n/2)(分为前一半数组(n/2)和后一半数组(n/2)),递归处理高低两部分之后,前一半数组的最后一个元素对后一半数组更新。这时候令前一半数组采用奇偶分治,分成奇数部分(n/4)和偶数部分(n/4),先递归处理前半部分的偶数部分,然后更新前半部分的奇数部分(n/4)可以与后半部分(n/2)并行更新。用奇偶分治法的成本优势降低了成本(采用)**
注意:每调用一次奇偶分治都会在时间复杂度中加入一个2的因子
算法执行时间T(n)=T(n/4)+2
其中T(n/4)是执行前半部分偶数部分所用的时间;2是前半部分调用一次奇偶分治需要的时间,奇偶分治的时间复杂度为O(logn)
成本W(n)=n/4+W(n/4)+n/4+W(n/2)+n/2
=n+W(n/2)+W(n/4)<=4n
其中第一个n/4为高低分治前半部分的偶数部分规模为整个数组的n/4; 第二个n/4是前半部分的奇数部分的规模为n/4;n/2为高低分治后半部分的数组规模为n/2;W(n/4)和W(n/2)分别为并行更新前半部分奇数部分和后半部分所需要的成本。
n/4; 第二个n/4是前半部分的奇数部分的规模为n/4;n/2为高低分治后半部分的数组规模为n/2;W(n/4)和W(n/2)分别为并行更新前半部分奇数部分和后半部分所需要的成本。