数据结构与算法学习笔记1

首先呢,考研数据结构和算法是得分关键,题目有简单的,也有复杂的,在时间复杂度和空间复杂度上都要求高效率,要想花较短的时间得到大把的分数需要自己考虑清楚,平时多多积累。用O(n)的时间复杂度和O(1)的空间复杂度写出来的算法往往是最好的,一般没什么大问题一般都给满分,但是这种算法比较难思考,时间复杂度一般没啥问题,都是在空间复杂度上做文章。考研的时间紧张,题量较大,花费较短的时间得到大把的分数才是关键,提个醒。。。一起学习,共同考上研究生,加油啊!!!每日一道数据结构算法题,一段时间总结一次,就一定有质的变化。
2011年计算机联考真题
一个长度为L的升序序列S,处在第n/2个位置的数称为S的中位数,例如:S1=(11,13,15,17,19),则中位数是15,S2=(2,4,6,8,20),S1和S2的中位数是11,现在有两个等长的升序序列A和B,设计高效算法,找出它们的中位数。

拿到这样一个问题,好像很好写,用归并排序的思想,设定两个指针,left和right,给它们排序合并到一个新的数组中,中位数就找出来啦!是不是很简单?但是这样就用到了O(2n)的空间复杂度了,算法不够高效,在考场想不出其他的方法就用这个,好写,思路简单,分数一大半得到。
接下来写个标准答案。
算法思想:设A和B的中位数是a和b。
1.若a=b,则中位数就是a或者b。
2.若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的长度要相等。
3.若a<b,则与2相反。
在保留的两个升序序列中,重复1.2.3.,直到两个序列中只含一个元素为止,较小者即为所求的中位数。

   **int M_Search(int A[],int B[],int n){
    int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;  //分别表示序列A和B的首位数、末尾数和中位数
	while(s1!=d1||s2!=d2){
		m1=(s1+d1)/2;
		m2=(s2+d2)/2;
		if(A[m1]==B[m2])
			return A[m1];
		if(A[m1]<B[m2]){
			if((s1+d1)%2==0){
				s1=m1;
				d2=m2;
			}
			else{
				s1=m1+1;
				d2=m2;
			}
		}
		else{
			if((s2+d2)%2==0){
				d1=m1;
				s2=m2;
			}
			else{
				d1=m1;
				s2=m1+1;
			}
		}
	}
	return A[s1]<B[s1]?A[s1]:B[s2];
}**

本题运用了类似二分查找的方法,比较大小,一步一步将序列减小,最后成为一个数,算法的时间复杂度是O(log2n),空间复杂度为O(1),两个方面都虐暴第一个。可能,这就是算法吧。。。本次总结一题。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值