读书笔记——数据结构(2)算法分析

算法是为求解一个问题需要遵循的、被清楚地制定的简单指令的集合。对于一个问题,一旦给定某种算法并且以某种方式确定其是正确的,那么重要的一步就是确定该算法将需要多少诸如时间或空间等资源量的问题。


典型增长率


估计运行时间

1.for循环

一次for循环的运行时间至多是该for循环内语句的运行时间乘以迭代的次数。

2.嵌套的for循环

从里向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积。

3.顺序语句

将各个语句的运行时间求和即可。(这意味着,其中的最大值就是所得的运行时间。)

4.if/else语句

一个if/else语句的运行时间从不超过判断再加上S1和S2中运行时间长者的总的运行时间。


最大子序列和问题的解


int MaxSubsequenceSum(const int A[],int N)
{
	int ThisSum,MaxSum,j;

	ThisSum=MaxSum=0;
	for(j=0;j<N;j++)
	{
		ThisSum+=A[j];

		if(ThisSum>MaxSum)
		{
			MaxSum=ThisSum;
		}
		else if (ThisSum<0)
		{
			ThisSum=0;
		}
	}

	return MaxSum;
}

--------------------我是分割线-----------------------

网上找联机算法只有这一个例子(求最大子序列的和),被不同的人各种引用……求资料啊求资料!

----------------------------我也是分割线--------------------------

下面的资料摘自:http://zhiqiang.org/blog/science/tcs-classroom-notes-the-best-dating-strategy.html

我想,这是我能找到的最好的资料了……


现假设你在PIE上征友,或者以其它方式,选定了某些约会对象,比如 n=20 个。约会当然得一个一个来,那么假设

  1. 可以将所有已约会的对象按优劣排序,但无法得知他们在所有的人里面的排名。在约会过程中,你知道某人是你目前已见到的最好的,但当时还不能确定是不是所有人里面最好的。
  2. 如果你在约会当时决定放弃某人,后面再没有机会和此人和好——好马不吃回头草。
  3. 选定意中人后,约会结束——骑驴找马是不道德的。

OK,现在目标当然是找到你心目中最喜欢的人。关系定得太早,会因为第2条假设——精彩的还在后头,定得太晚,会因为第3条——而后悔莫及。所以,什么策略才能让你以最大概率找到你最满意的那个人呢?

一个简单而且自然的方法是,待定 k与前 k 个人约会,不做任何选择。继续约会直到遇到比这前k个人还好的那个人为止

通过概率计算得出,这个方法比我们想象中要好得多。通过选取合适的 k=n/e0.37n7,有接近40%的机会选中最好的那位,有几乎70%的机会选中最好或者次好的那位。

可以证明,上面的策略已经是最优的了。(证明在此:37 rule is optimal,英文)。

这个问题在日常生活中有更多应用。比如你打算在30岁前结婚,现在20岁。那么在24岁前先别确定目标,24岁以后遇到比之前都好的就可以定下来。这几乎就是你能达到最好的结果了——假设你的候选人在这十年是均匀或者随机出现的。

这种策略也许能说明为何初恋成功率低?

以上所用都是爱情和婚姻的简化模型,没有考虑爱情中的主观因素。所以,请只把它当作一个脑力游戏



原文地址:https://www.cnblogs.com/wlsandwho/p/4202186.html