请达人分析一个小算法时间复杂度

JohnsonElizeee 2010-12-05 11:56:31
一个无序数组,0到n-1,随机取一个替换另外一个,如{0,3,2,1} ==> {0,3,2,3},这就有一个重复的数了:3
要求求出这个重复数,要求TC为O(N)。
帮忙分析下面这个,时间复杂度是多少?详细点哦:)
当然更希望给出O(N)的正解:)


#include <stdio.h>

int duplicated(int a[], int N)
{
int i = 0, ai;
while(i<N) {
ai = a[i];
if(ai == i)
i++;
else if(ai != a[ai]) {
a[i] ^= a[ai];
a[ai] ^= a[i];
a[i] ^= a[ai];
}
else
return a[i];
}
return -1;
}

int main()
{
int ary[] = {1,6,2,4,3,7,5,3};
int d = duplicated(ary, 8);
printf("d=%d\n", d);
return 0;
}
...全文
142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
JohnsonElizeee 2010-12-18
  • 打赏
  • 举报
回复
不应该
acdbxzyw 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jonsenelizee 的回复:]

引用 3 楼 joanlynnlove 的回复:

每一次都能将元素交换到最终位置上


呵呵,谢谢,昨晚确实草稿了几下,但发现不简单,因为只有在(ai == i)时才i++;要把一个元素放到“正确”的位置上,可能经过了好几次的交换值操作,循环被调用了多次,但又发现(ai == a[ai])的情况发生得还挺快,给个数组,没几下就找到这个重复数了,所以不敢肯定这个算法的时间复杂度。

……
[/Quote]
呵呵,那是你没比划清楚,每次交换都能把一个元素放到正确位置的,不用多次交换。
JohnsonElizeee 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 joanlynnlove 的回复:]

每一次都能将元素交换到最终位置上
[/Quote]

呵呵,谢谢,昨晚确实草稿了几下,但发现不简单,因为只有在(ai == i)时才i++;要把一个元素放到“正确”的位置上,可能经过了好几次的交换值操作,循环被调用了多次,但又发现(ai == a[ai])的情况发生得还挺快,给个数组,没几下就找到这个重复数了,所以不敢肯定这个算法的时间复杂度。

谢谢谢谢
acdbxzyw 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jonsenelizee 的回复:]

真的不能再笨了,昨晚可能太晚了,脑子锈住了:
given array, as {0,5,2,3,4,5,6} //LEN is the length of array
int his[LEN] = {0}; // history, record read data

for each data in array {
if(his[data] == 0) ……
[/Quote]
呵呵,我就说位图就可以了。

贴出的程序应该是O(n)的,
楼主可以在纸上比划一下,每一次都能将元素交换到最终位置上,n个元素就是O(n)了。
JohnsonElizeee 2010-12-06
  • 打赏
  • 举报
回复
真的不能再笨了,昨晚可能太晚了,脑子锈住了:
given array, as {0,5,2,3,4,5,6} //LEN is the length of array
int his[LEN] = {0}; // history, record read data

for each data in array {
if(his[data] == 0) his[data] = 1;
if(his[data] == 1) return data;
}

当然,用bitmap也是可以的
不过,int duplicated(int a[], int N)这个实现还是挺有技巧的,呵呵。
yui 2010-12-06
  • 打赏
  • 举报
回复
应用计数排序思想可以达致O(n)时间复杂度

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧