寻找矩阵的极小值

3 篇文章 0 订阅

本题的前置问题:寻找数组的峰值

题意

极小值定义为比该元素上下左右四个值都小,则该元素为极小值。要求返回矩阵中的任意一个极小值,时间复杂度为O(nlogn),矩阵隐式给出,只能通过query(x,y)来访问matrix[x][y]

若是直接遍历,或者从任意一个值开始向最小的值搜索,时间复杂度都是O(n^2)

解法

前置问题中数组的峰值是用二分来查找的,实际上从时间复杂度可以看出本题也是用二分来做。极小值小于周围四个数字,实际上就是在当前行当前列都是极小值。那么如果我们固定一列,寻找最小值(最小值一定在列上是极小值)。在该最小值处考察它的所在行,若该元素左右值都大于它,则该元素就是极小值。若左右值有一个小于或两个都小于,根据固定列划分矩阵为左右两半,那么该元素左右较小值所在半边一定存在解。因为以较小值为起点,向该半区搜索,每次沿周围最小值走,由于固定列的值都比该较小值大,因此搜索路径不会穿过固定列。

因此我们就排除了一个半区,那么在有解的半区再次取中间列,继续寻找。
注意如果想要行列同时二分是不可以的,比如先找固定列,找到半区后再找固定行,划分上下半区,这种二分是不对的。在一些情况下是不一定有解的,破坏了二分的性质。

代码

#include <iostream>
using namspace std;
int main(){
	cin>>n;
	int l = 0,r = n - 1;
	while(l < r){
		int mid = (l + r) >> 1;
		int k;//记录该列最小值的行数
		int val = INT_MAX;
		for(int i = 0;i < n;i++){
			int t = query(i,mid);
			if(t < val){
				val = t;
				k = i;
			}
		}
		int left = mid ? query(k,mid - 1) : INT_MAX;//mid有可能是0,比如l一直不动就是0,那么mid不断变小最后向下取整为0.mid为0时,说明左侧没有区域了,设置成最大值
		int right = mid + 1 < n ? query(k,mid + 1) : INT_MAX;//mid有可能是右边界,此时说明右侧没有区域了,设置成最大值。
		if(val < right && val < left) return val;
		if(val < left)l = mid + 1;
		else r = mid;
	}
	int k;//如果在二分过程中没有找到解,那么最后l==r,在该列上找到最小值就是解
	int val = INT_MAX;
	for(int i = 0;i < n;i++){
		int t = query(i,mid);
		if(t < val){
			val = t;
			k = i;
		}
	}
	return val;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阵的低秩逼近是一种大规模矩阵低秩近似表示技术,是从大规模、复杂的数据中 寻求数据潜在信息的一种强有力方法。非负矩阵分解( Nonnegative MatrixFactorization, NMF)) 是矩阵的低秩逼近方法之一,它是指被分解的矩阵和分解结果矩阵的数值都 是非负的。由于该方法符合数据的真实物理属性,数据的可解释性强,分解结果能够表 示事物的局部特征,且模型符合人们对于客观世界的认识规律(整体是由局部组成的) 等优点, 模型和算法自提出以来得到了广泛研究和应用,已经被成功地应用到许多领域。 当模型数据的指标集多于两个时,模型数据就可以表示成张量的形式,因此张量可以看 成是向量和矩阵在高维空间的推广。对于张量代数理论及其应用的研究也是近来研究的 一个热点。非负矩阵分解与张量分解理论与应用方面的研究虽然取得了很多成果,但仍 然有一些问题需要进一步解决,如寻找好的非负矩阵分解算法,在线数据模型如何应用 非负矩阵分解,非负矩阵分解在具体问题中的进一步应用等。另外,大规模的非负性约 束给所有分解算法带来了求解的困难,影响了非负矩阵分解模型的应用效率,如果取消 一部分非负性约束会提高算法的效率,但得到的特征子空间会如何变化?这也是一个前 人没有进行研究的工作,围绕非负矩阵与张量分解及其应用的研究,本文从几个方面对 于非负矩阵与张量分解进行了以下研究工作: 1. 给出了基于轮换极小化原则的一个非负矩阵分解二次规划模型算法。 借助于内点 罚函数,把子问题的求解转化为一个无约束的二次规划问题模型来求解,再把二次规划 模型求解归结到一个线性方程组的求解,在求解过程中引入了一个降维策略,在一定程 度上降低了问题的求解规模,并给出了算法的收敛性证明,数值试验表明算法能够提取 到局部特征且得到的非负矩阵分解算法具有好的收敛性。 2. 研究了基于非负矩阵分解的一个局部图像识别策略和算法,利用非负矩阵分解算 法提取到的残缺测试图像的局部特征进行有效识别,论文主要研究了残缺区域为已知情 况下的局部图像识别问题,并给出相应的数值试验。 3. 对于训练集图像数据有缺失的识别问题进行了研究。本文首先对图像数据缺失模 式进行了分类,划分了数据缺失模式的三种类型,给出了三种数据缺失模式下利用非负 矩阵分解算法来提取局部特征的模型,分析了三种模型的特点和计算量,通过数值试验 对三种模型提取局部特征能力的进行了比较比较,指出了各种模型的适用于不同实际问山东科技大学博士学位论文 摘要 题时的优缺点。 4.在利用特征子空间进行线人脸识别问题中,当增加或者减少训练样本时,相应地 特征子空间就要发生改变,由于人脸图像数据规模较大,如果对新的训练样本重新进行 特征提取则浪费已有的计算结果和计算资源。 本文给出了一个处理在线人脸识别的算法, 对于训练集增量和减量的情况推导了基于非负矩阵分解的在线迭代公式, 数值试验表明, 该算法可以节约一定的计算时间和计算量,且逼近效果与对训练集数据重新计算得到的 结果相比较更好。 5.在非负矩阵分解中,编码矩阵的非负性约束使得算法求解起来速度较慢,并且, 在实际问题中,由于往往只需要部分分解结果(基矩阵)是非负的。如果我们对于矩阵 分解实行部分非负约束,不仅可以提高算法的效率,还可以节省计算和存储资源,但这 时相应的模型和算法会有什么变化,提取到的特征子空间有什么变化?还能不能表示局 部特征?另外,在非负矩阵分解中,提取局部特征的能力是和模型有关系还是和算法有 关系?本文从这些角度进行了一定的研究,得到了一些结论并进行了数值试验验证。 6.作为向量和矩阵的推广,张量相当于一个高维的矩阵。由于张量模型可以处理指 标集为多维的数据, 所以在描述实际问题时相比矩阵模型其更能接近于实际问题的属性, 因此能更好地描述实际问题。本文对于Web社区发现,给出了一个基于张量的模型及其 相应的算法。模型考虑了权威值,中心值,文本值三个指标,同矩阵模型相比较,由于 张量模型可以很好地保留模型数据的内在本质特征,得到的社区发现模型结果更准确, 可以有效地防止主题漂流的现象,数值试验表明,算法是有效的。 最后, 针对非负矩阵和张量分解研究现状和存在的问题,提出了进一步研究的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值