摘要: 1. 简述 给定平面上N个点的坐标,找出距离最近的两个点。2. 思路 暴力的方法是C(N,2),N^2的复杂度。 二分的方法,比如首先将所有的点根据横坐标排序,递归二分。终止条件:直到只有一个点或者两个点的时候返回,一个点时返回空,两个点时返回这两个点构组对。递归过程:先计算左边N/2个点之间的最近点对,计算右边N/2个点之间的最近点对,然后计算左边点与右边点构成的最近点对。这样复杂度公式:T(n) = 2T(n/2) + n^2/4,根据主定理,得到T(n)=n^2/4,还是N^2级别的。 二分的方法进一步化简,复杂度都浪费在(左边的某个点,右边的某个点)这的组合上了。假设MinDistLe 阅读全文
posted @ 2011-09-30 18:09 xiaodongrush 阅读(2378) 评论(2) 推荐(0) 编辑
摘要: 1. 简述 对于一个由N个正数组成的数组,需要比较多少次才能把最大值和最小值找出来?2. 思路 1) 就是遍历一遍,分别统计最大值和最小值,2*N。 2) 每次遍历两个数字,比较一下这两个数字,大的数字更新最大值,小的数字更新最小值,一共是N/2次,每次比较3次,一共就是3*N/2次比较。 扩展问题就是求N个元素的数组中第二大的数,需要比较的次数,以及是否可以是使用类似的分治思想降低比较次数。感觉有点像Top-2,每次先与次大的比,如果大于次大的,更新次大的,然后与最大的比,如果大于最大的,更新最大的。次数可以这样算,每个数大于最大的,小于次大的,以及介于两者之间的可能性假设相同,那么次数的期 阅读全文
posted @ 2011-09-30 14:27 xiaodongrush 阅读(653) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 斐波那契数列的递归公式为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2), n>1。尽可能快的计算f(n)。2. 思路 一个就是公式解,算特征方程的方法,好像是线性代数部分的,有点忘了,这里直接给答案吧:根据递归公式,f(n)=f(n-1)+f(n-2),知道f(n)的特征方程为 x*x = x + 1,根为s1=(1+sqrt(5))/2 和s2=(1-sqrt(5))/2。那么存在A,B使得:f(n)=A*s1^n + B*s2^n,代人f(0)=0,f(1)=1,得到A=sqrt(5)/5,B=-sqrt(5)/5。即f(n)=A*s1 + B*s2。 阅读全文
posted @ 2011-09-30 13:59 xiaodongrush 阅读(1140) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。 比如N=99时,M=1 122 334 455 667 789,N * M=111 111 111 111 111 111。2. 思路 实际上两个思路,一个就是给N,遍历M,判断N*M是否满足条件的数值;另一个就是给N,遍历满足条件的数值,判断数值能否被N整除。根据样例数据发现,N=99时,第一个方法的复杂度为:M=1 122 334 455 667 789,第二个方法的复杂度为2^15=32 * 1024。即由0和1组成的数值实际上是十分稀疏的,从这边遍历更快。这一点与编程之美 阅读全文
posted @ 2011-09-30 12:27 xiaodongrush 阅读(1579) 评论(0) 推荐(1) 编辑