递归分治时间复杂度主定理法

记录一下以前博客的证明过程,补充一下之前的结论

在算法导论中lgn一般指2为底的对数n,特此说明


以前写的博客记录了一下分治递归时间复杂度的结论,发现少了一个正则条件,而且也不覆盖所有的一般情况

https://blog.csdn.net/qq_19841133/article/details/103640028
在这里插入图片描述

考虑分支递归时间复杂度T(n),有下面的更一般结论
T(n) = aT(n/b) + f(n)
在这里插入图片描述
像下面举了一个例子T(n),计算发现f(n)较大,同时还要验证正则条件a(f(n/b)) <= cf(n),就是图片The regularity condition部分
在这里插入图片描述
为什么要正则条件?

在递归式T(n) = aT(n/b) + f(n)中

首先, f(n) 可以直观的被解释为把一个规模为n的问题分解成a个规模为n/b的子问题和合并a个子问题的解的代价

其次,af(n/b) 可以被解释为把a个规模为n/b的子问题分解成 a 2 a^2 a2个规模为 n / b 2 n/b^2 n/b2 的子问题和合并 a 2 a^2 a2个子问题解的代价。

那么,条件 af(n/b) ≤ cf(n), for c < 1 和足够大的 n, 可以被解释为上述第一点f(n)合并的代价是上述第二点af(n/b)代价的准确界。

则当一个问题被分解成越来越小的子问题,分解和合并的代价变得越来越小。


例子1
T ( n ) = 5 T ( n / 2 ) + n 2 T(n) = 5T(n/2) + n^2 T(n)=5T(n/2)+n2
这个比较简单,直接套 d < l o g b a d<log_ba d<logba T ( n ) = n l o g 2 5 T(n) = n^{log_25} T(n)=nlog25


例子2
T ( n ) = 27 T ( n / 3 ) + n 3 l g n T(n) = 27T(n/3) + n^3 lg n T(n)=27T(n/3)+n3lgn
对应(2)公式
T ( n ) = ( n 3 l g 2 n ) T(n) = (n^3 lg^2n) T(n)=(n3lg2n)


例子3
T ( n ) = 2 T ( n / 2 ) + n / l g n T(n) = 2T(n/2) + n / lg n T(n)=2T(n/2)+n/lgn
a=2,b=2,f(n)=n/lgn
这里对应(2)公式,但是发现k=-1,不满足k>=0,因此不用主定理法求解


例子4
改变变量法

有时代数操作可以把一个未知的递归式转换成已知可解的递归式

如下Tn,这里b表示不出来,不能用主定理法,但是我们可以替换一下变量
T ( n ) = 2 T ( n ) + l g n T(n) = 2T(\sqrt n) + lg n T(n)=2T(n )+lgn

m = l g n m = lg n m=lgn, 则 n = 2 m n = 2^m n=2m

代回Tn
T ( 2 m ) = 2 T ( 2 m / 2 ) + m T(2^m) = 2T(2^{m/2}) + m T(2m)=2T(2m/2)+m

S ( m ) = T ( 2 m ) S(m)=T(2^m) S(m)=T(2m)得出新的递归式
S(m) = 2S(m/2) + m

用主定理法解得, d = l o g b a d=log_ba d=logba,S(m) = mlgm

用m代回
S ( m ) = T ( 2 m ) = T ( n ) = m l g m = l g n l g l g n S(m) = T(2^m) =T(n)= mlgm = lgnlglgn S(m)=T(2m)=T(n)=mlgm=lgnlglgn


主定理法证明,下面是主定理法一种特殊形式的证明,更一般的情况请查阅《算法导论》

T ( n ) = a T ( n / b ) + c n k T(n) = aT(n/b) + cn^k T(n)=aT(n/b)+cnk

将T(n)递归展开,假设展开了m层变成一个没有递归的完整的求和序列
在这里插入图片描述

令T(1) = c,写成求和公式形式
在这里插入图片描述

那么解决求和部分 ∑ i = 0 m ( b k / a ) i \sum_{i=0}^m(b^k/a)^i i=0m(bk/a)i即可,其实就是等比数列求和,分类讨论三种情况

在这里插入图片描述
等比数列求和r分成大于0等于0小于0情况
在这里插入图片描述
最后结论为
在这里插入图片描述


更一般的情况证明在《算法导论》中,数学分析难度了已经,先放一放先()

### 使用PSO算法优化卷积神经网络(CNN)的方法 #### PSO与CNN结合的方式 粒子群优化(PSO)作为一种高效的全局优化算法,能够有效提升卷积神经网络(CNN)的性能。具体来说,在故障诊断模型中,PSO被用来优化CNN和BiLSTM网络的参数,从而提高了模型的学习效率和诊断精度[^1]。 为了实现这一点,通常会将PSO应用于以下几个方面: - **初始化权重**:使用PSO来寻找更优的初始权重设置,而不是随机初始化。这有助于加速训练过程并改善最终收敛的质量。 - **超参数调优**:除了调整内部连接权值外,还可以利用PSO对诸如学习率、正则化系数等影响较大的超参数进行自动化的搜索空间探索。 - **结构设计**:某些情况下甚至可以通过编码不同的层配置(比如滤波器数量),让PSO参与到最佳架构的选择当中去。 下面给出一段简单的Python伪代码展示如何基于`pyswarms`库实施上述策略之一——即通过PSO优化CNN中的全连接层权重矩阵W: ```python import numpy as np from pyswarms.single.global_best import GlobalBestPSO from keras.models import Sequential from keras.layers import Dense, Conv2D, Flatten def cnn_model(weights): model = Sequential() # 假设已经定义好了前面几层... fc_layer_size = weights.shape[-1] dense_weights = weights.reshape(-1, fc_layer_size) model.add(Flatten()) model.add(Dense(fc_layer_size, activation='relu', input_shape=(None,), use_bias=False)) # 设置预估得到的最佳权重给最后一层 model.get_layer(index=-1).set_weights([dense_weights]) return model # 定义适应度函数计算损失值 def fitness_function(positions): scores = [] for pos in positions: temp_model = cnn_model(pos) # 训练一轮获取当前loss history = temp_model.fit(x_train, y_train, epochs=1, verbose=0) score = -history.history['loss'][0] scores.append(score) return np.array(scores) options = {'c1': 0.5, 'c2': 0.3, 'w': 0.9} optimizer = GlobalBestPSO(n_particles=10, dimensions=fc_layer_neurons * previous_layer_output_dim, options=options) best_cost, best_pos = optimizer.optimize(fitness_function, iters=100) optimized_cnn = cnn_model(best_pos) ``` 这段代码展示了怎样构建一个基本框架,其中包含了创建简单版的CNN以及定义适合于PSO使用的适应度评估逻辑。需要注意的是这里仅针对单个特定部分进行了简化处理;实际项目里可能还需要考虑更多细节因素如多GPU支持下的分布式运算等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值