@码代码的张洋 两篇博客笔记 及一些杂乱笔记

归并排序递归版
void MergeSort(int* a, int low, int high, int* b)//Merge a[low...high] with space of b[]
{
if(low==high) return;
int mid=(low+high)/2;
MergeSort(a, low, mid,b);
MergeSort(a, mid+1,high,b);
Merge(a,low, mid,high,b);//Merge a[low...mid] and a[mid+1...high] to array b
Copy(b,a);//copy b[] to a[]
}


T(n)=2T(n/2)+O(n)
T(n)=O(nlogn);

当年学习DS和alg的时候都是学copy版的递归,后来发现还有直接在merge里申请临时数组,相当于就地merge,这是这种每次递归调用都要申请空间,

不过最大也只是到了O(n),因此空间复杂度是一样的。



时间复杂度nlogn 里面都省略掉底数,之前一直认为默认2,其实多数是这样的,但是为什么可以省略还有探究,
昨天看到 @码代码的张洋 一篇日志http://blog.codinglabs.org/articles/why-logarithm-base-of-asymptotic-time-complexity-always-two.html
了解到了,通过一个对数换底公式,log3n和log2n只差了 一个1/log2(3),也即一个常数,对于
时间复杂度这种多数情况忽略常数的,二者是一样的,故底数多少都没有本质区别

还有大神另一篇 http://blog.codinglabs.org/articles/linear-algebra-for-recursion.html
计算菲薄那次数列通项的方法,假设是通项是C*q^(n)(线性方程组的某某性质之类的),然后代入求解q,然后再由第1,2项来求c,因为当时尹师兄大神提到当时面试某家公司的说让他求这个时间复杂度。

另外还有最近微博极其火的烫烫烫,是微软VC(VS)里才有的问题,它默认未初始化的栈空间为0xCC,因为这天指令对应了INT3中端,可以debug时候正确处理这个错误,不致于产生其他不可预知的错误,然后0xCC超过了ASCII码0-127,因此调试器将其处理为宽字符,两个一起作为一个汉字,0XCCCC,而之前的VS中调试器默认的字符集是MBCS,对应的是烫字,这估计是巧合,现在据说不用这个字符集了,可能产生这个烫现象比较少


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值