似乎没有那么复杂

来源: 说了就走 2009-07-29 21:45:44 [] [博客] [旧帖] [给我悄悄话] 本文已被阅读: 次 (803 bytes)
回答: 似乎很明显说了就走2009-07-28 16:07:49
我再把想法写清楚些,你看看是不是这样:

这个array是a[1],a[2],...,a[n].假设一开始a[k]=k,目的是通过常数个变量和O(n)时间让a[k]=f(k).这里f(k)是某个一一对应函数。

假设f(k)及其反函数g(k) (对任何k=1,2,...n都有f(g(k))=g(f(k))=1)都可以通过O(1)的计算得出。如果这点不成立,肯定没有O(n)的算法(假设在大于1的循环中的数有O(n)个)

下面的大致算法:

for(k=1;k<=n;k++)
{
if(a[k]==f(k)) continue; //该数(以及所在的循环)已经满足条件了
//不符合条件的k是某个循环里第一个(最小的)不正确的数
for(t=k;f(t)!=k;t=f(t))
{
a[t]=f(t);
}
a[t]=k;
//经过这个操作,k所在的循环的所有数字都到了最终要求的位置。
}

除了个数为1的循环,所有循环都被置换一次,也就是任何一个k都只被置换一次。每个置换之前有一个O(1)的判断,所以总数还是O(n),而变量只有两个。

所有跟帖: 

回复:似乎没有那么复杂 -康MM- 给 康MM 发送悄悄话 康MM 的博客首页 (104 bytes) () 07/30/2009 postreply 07:33:36

我觉得我解释不清楚 -说了就走- 给 说了就走 发送悄悄话 说了就走 的博客首页 (1593 bytes) () 07/30/2009 postreply 11:56:00

主要是难以判断一个位置有没有排好。 -乱弹- 给 乱弹 发送悄悄话 乱弹 的博客首页 (355 bytes) () 07/30/2009 postreply 17:30:25

你可以run一下这个程序,对任何n都适用 -说了就走- 给 说了就走 发送悄悄话 说了就走 的博客首页 (357 bytes) () 07/30/2009 postreply 20:47:50

你一直在假设a[k]=k。没有这个假设你的算法不成立 -康MM- 给 康MM 发送悄悄话 康MM 的博客首页 (0 bytes) () 07/31/2009 postreply 07:14:51

那么请问你的假设是什么? -说了就走- 给 说了就走 发送悄悄话 说了就走 的博客首页 (216 bytes) () 07/31/2009 postreply 18:16:46

还是问冬瓜太郎吧,他说可以就可以 -康MM- 给 康MM 发送悄悄话 康MM 的博客首页 (177 bytes) () 08/02/2009 postreply 10:25:52

你说得很有道理 -说了就走- 给 说了就走 发送悄悄话 说了就走 的博客首页 (2675 bytes) () 08/02/2009 postreply 13:50:02

我还是觉得我们在说两件不同的事 -康MM- 给 康MM 发送悄悄话 康MM 的博客首页 (0 bytes) () 08/06/2009 postreply 17:49:24

请您先登陆,再发跟帖!

发现Adblock插件

如要继续浏览
请支持本站 请务必在本站关闭Adblock

关闭Adblock后 请点击

请参考如何关闭Adblock

安装Adblock plus用户请点击浏览器图标
选择“Disable on www.wenxuecity.com”

安装Adblock用户请点击图标
选择“don't run on pages on this domain”