summary(2)
来源:互联网 发布:网络女主播 可以娶 编辑:程序博客网 时间:2024/05/21 00:56
上周遇到的一些有趣问题:
1. 给定n个任意顺序的实数,它们对应数轴上的n各点,请在O(n)的时间内找到相邻距离最大的两点。
思路: 如果不考虑复杂度问题,可以先排序,然后遍历一遍就能找到结果;但是因为如果是基于比较的排序的复杂度是O(nlogn),不予考虑,但是似乎可以从计数排序和桶排序等线性时间排序想,首先计数排序解决的问题要能转换成:“假设n个输入的每一个元素都是介于0到k之间的整数,k是整数。基本思想是对每个输入元素x, 确定出小于x的元素个数,有了这个信息就可以直接将元素定位在最终顺序数组中”,所以计数排序可以排除。
那么桶排序呢?先来了解一下桶排序的前提条件和要解决的问题:假设输入有一个随机过程产生,该过程将元素均匀而独立地分布在区间[0,1)之间;桶排序只能是保证当输入符合均匀分布时,即可以以线性期望时间运行。基本思想是:把区间[0,1)划分成n个大小相同的子区间,或称为桶。然后将n个输入扔到桶中,先对各个桶中的元素排序,然后在收集一遍就得到顺序序列。 但是要想用桶排序来解决这个问题是不行的,因为这n个实数不一定满足均匀分布的特点。 但是其实我们还是可以顺着这个桶的思路走,不是一般性地:我们可以用O(1)时间将这n个数转换成【0,1】之间的数,我们是要求相邻距离最大的两点,可以把区间均分成n+1个桶,每个子区间的大小是1/(n+1)根据鸽巢原理,n个数放入n+1个桶中,至少有一个桶是空的;所以我们可以获得相邻距离最大值的下界是1/(n+1), 那么最大相邻间距两点出现的距离只可能是跨子区间的两点,如果它们落在同一个区间则距离必然小于1/(n+1); 那么我们可以在o(n)的时间内找出每个子区间的最大值和最小值,然后在计算间隔距离,找到最大的。O(n)时间按复杂度,需要开辟2n的额外空间。
2. 关于算法导论第二章《入门》
1. 归并排序中可以对小数组采用插入排序,这样更快。
2. 循环不变式
用于帮助我们认识和证明算法的正确性。它有三个性质:
l 初始化:它在循环的第一轮迭代开始之前,应该是正确的
l 保持:如果在循环的某次迭代开始之前是正确的,那么在下一次迭代开始前也要保持正确
l 终止:当循环结束的。。。
证明算法的正确性,类似于数学归纳法。
3. 逆序对问题:
l 插入排序的运行时间和输入数组的逆序对之间的数量关系?
l 如何在O(NlogN)时间内求出所有逆序对数。 以归并排序为基础。
3. 重复子串检测问题(待续)
- summary(2)
- Asterisk Summary - 2
- some C++ summary 2
- Git use summary (2)
- work summary(2)
- LC 2 pointer summary
- Quartz 2D Summary
- Summary:learn python 2
- Summary
- summary
- summary
- Summary
- Summary
- summary
- Summary
- summary
- summary
- summary
- Sql部分概念 主键外键
- 尚观Day05:yum安装,进程查看,grub启动管理
- CloseHandle()函数的使用
- 多核危机:Scala vs. Erlang
- 2009 Google Code Jam Qualification Round 题解
- summary(2)
- abc
- 大宝
- 我的心情
- 转发:一个总经理的11个经典面试问题
- 现在开始
- JAVA初学问题
- 怎么用Trancate清空两个有主外键关联的表?
- rundll32 执行DLL中的某个函数