免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: emacsnw
打印 上一主题 下一主题

[算法] 请教一道看似简单,却不平凡的算法题! [复制链接]

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
11 [报告]
发表于 2010-02-27 11:44 |只看该作者
没法证明哪个较优,缺少必要因子

论坛徽章:
0
12 [报告]
发表于 2010-02-27 12:47 |只看该作者
可以证明的,等下我拿出证明

论坛徽章:
0
13 [报告]
发表于 2010-02-27 16:06 |只看该作者
回复 11# A.com
没证明出来,还要想想,好像确实如你所说。 如果确定 n的范围[0-N],但不确定具体的值,应该有各种情况下,有跟N相关的平均最佳方法。
上面的证明貌似也有问题,这个问题跟N也比较密切。 假如上面的证明正确,为4N,假设4N步的时候,正好在端点。那么在N+1的情况下,
虽然只差一个点,也需要 多走2N步。 因此,那时候,则需要 6N步左右。

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
14 [报告]
发表于 2010-02-27 18:39 |只看该作者
假设n是有限的人在x坐标处,那么最优的办法是向某一方向走到头(最大步数n-x或|x-n|),如果路上没有门,则反向走到头(最大步数n)。全程最大步数是2n-x或者是n+x。但是,现在n是无穷大,故以上方法中的n只能作为振荡中的第一个周期的振幅m。至于后面每个周期振幅增加多少个m我们且不去管他。单单这个m就没法证明取3比取4较优或者是取4比取3较优。因为无论m多大或多小,只有在结果确定,也就是门的位置确定以后你才能知道他m具体什么值才是最优值(等于到门的步数)。现在因为缺少必要的那个门的位置的因子,所以就证明不出m多大才最优。

论坛徽章:
0
15 [报告]
发表于 2010-02-27 19:06 |只看该作者
本帖最后由 peidright 于 2010-02-27 19:20 编辑

回复 14# A.com

界 应该是 (3n, kn),  实际上这个k应该是趋近于3,也就是最小的k是达不到的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
16 [报告]
发表于 2010-02-27 19:06 |只看该作者
本帖最后由 cjaizss 于 2010-02-27 21:04 编辑

找这么一个可导函数,f(x),要求其n(n为所有自然数)阶导数越大越好.
然后第一次向左f(1)步,第二次向右f(2)步,第三次向左f(3)步.............
这样的好处是,随着n增大,其最坏系数越来越接近3(3是没有办法避免的)
比如我取f(x)=2^(x^2)

论坛徽章:
0
17 [报告]
发表于 2010-02-27 19:33 |只看该作者
郁闷了,思维越来越迟钝,13楼我的回复又错了。工作中把握不住思考,工作,学习的关系,真是悲哀。
觉得这里主要是这样一个问题迷惑了我。n的不确定。一但n确定,肯定明智的选择是3N, 而一旦n不确定,实际最优步长是跟n相关的,这里N是个奇点。 类似于

y = (1/x)    x>0
    3N       x=0;
类似这种函数

论坛徽章:
0
18 [报告]
发表于 2010-02-27 19:58 |只看该作者
如果墙不是无限延伸的
那最好的办法应该是向左走到头然后向右走到头
呵呵

论坛徽章:
0
19 [报告]
发表于 2010-02-27 21:59 |只看该作者
本帖最后由 xyfree 于 2010-02-28 04:43 编辑
1. 你面对一堵左右无限延伸的墙;
2. 该墙有且只有1扇门,它在离你 n 步远的地方;
3. 你不知道 n 的大小,也不知道门在你左边还是右边;
4. 你一次能够向左或者向右走一步,你只有走到门所在的位置才能出去。
请设计一个O(n)的算法,找到这扇门。
请问在最坏情况下,你这个O(n)算法的常数系数最小是多少?也就是说,在最坏情况下,你找到门需要走的步数
S <= K*n+C, K和C都是常数,求最小的K。
emacsnw 发表于 2006-01-18 03:41



假定墙的长度为L ,L 趋近于无穷时,墙在我的左边和和在我右边的概率是相等的。(这一步的证明过程忘了)
因此,一般情况下,每回合尝试若干次并回归出发点后,左右两方相等步长的区域内的墙都已经尝试过的话,
都能够把问题的状态归纳为出发前的状况,算法可以继续有效演算。


这个算法的时间复杂度对于总次数是O(n)的,证明过程如下:

设在第r回合尝试中,根据不同的回合,尝试向左或向右次数为t,有t(r)。
则该回合尝试中所走的总次数 s(r) = 2t(r) + 2t(r) = 4t(r) (向左走t次,然后向右走2t次,再向左走t次回到起点)

到门之前总的尝试走的次数可以表示为 s(0) + s(1) + s(2) + ... + s(k),记为 S
其中k必然小于等于n,因为即使最保守的策略,t=r,在第r回合中也只需走n次即可找到门。
于是,总的次数可以表示为不定积分 S =∫s(r)dr = s(0) + s(1) + s(2) + ... + s(k)

对于固定的策略来说,t(r) 是一个 m次多项式,
即 t 对 r 的函数必然可以表示为 t = k[0]× r^m + k[1]× r^(m-1) + ... +k[m] 的形式

不难求得
∫s(r)dr = 4(k[0]× r^(m-1) + k[1]× r^(m-2) + ... + k[m-1])r
            = t(k[0]× r^(m-1) + k1× r^(m-2) + ... + k[m-1])

因为找到门的时候,r是确定的常数,即(k[0]× r^(m-1) + k1× r^(m-2) + ... + k[m-1])是一个常数c
所以,找到门的时候尝试的次数 S(t) = ct

于是,算法的时间复杂度函数呈O(n) 形式。命题得证。



前面算法合理的前提是,墙无限长,因此门在我左边或者右边的概率是相等的
并且因为算法的每一步尝试,即针对不同步长的尝试失败之后,我回到原来的位置,这时候不改变概率。


在某种策略下,在第r回合当我尝试往左边和右边各走t次的时候,我找到这个门的概率是 t/n。
因为实际上门在未知方向的n步之外,但我在左右两个方向上各只尝试了t次。
把向某个方向走t次看做是一次独立试验,如果门在这个方向上,那我走n步的时候必然发生目标事件。
概率就等于样本除以总量得到某一次尝试就找到门的概率是t/n。

这样在这种策略下,经过若干回合尝试,终于找到了门。
因为在最坏的情况下最终必然找到了门,就可以表示为当r和n都趋向于无穷大的时候,找到门的概率是1。

所以有以下极限
lim[ r->∞, n->∞] s(0)/n + ( s(1)-s(0) )/n + ( s(2)-s(1) )/n + ... + ( s(r)-s(r-1) )/n = 1
结果是 lim[ r->∞, n->∞] s(r)/n = 1。

------------------------- 下面证实是错的 ----------------- 悲剧了

因为 s(r) = 4t(r)
所以尝试找门的策略应该是 t=r,这样可以满足上面的式子
就是说,改变每回合尝试向某个方向走的次数时,都只比上一次增加1次,就是向左和向右各增加一次。

即有 k = 4, m = 1
由c = (k[0]× r^(m-1) + k1× r^(m-2) + ... + k[m-1]) 得 c = 4
因为 S(t) = ct,
所以 S = 4n

论坛徽章:
0
20 [报告]
发表于 2010-02-27 23:14 |只看该作者
看不懂楼上的证明,证明O(n),举一个O(n)的例子就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP