当前位置: 技术问答>linux和unix
大家练练算法吧..>@
来源: 互联网 发布时间:2016-02-06
本文导语: 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型: int do_dup(int a[],int N) | o(N)的时间必然以巨大的空间消耗为代价。 分配一个足...
数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
int do_dup(int a[],int N)
int do_dup(int a[],int N)
|
o(N)的时间必然以巨大的空间消耗为代价。
分配一个足够大的空间,对空间与数之间进行匹配,这个匹配取决于数的取值范围。
如果输入的数是0-65535之间的整数,那么只要65536个空间,分别记录这65535个数出现的次数,线性扫描,将当前数的关联空间加一,如果为2,则表示出现重复。
如果输入的数是0-65535之间的小数,有效数字1位,那么需要65535*10个空间,空间标号与数的匹配函数就是 f(x) = x * 10....
依此类推.......如果允许分配的空间足够大,就可以在o(N)时间内完成该需求。
分配一个足够大的空间,对空间与数之间进行匹配,这个匹配取决于数的取值范围。
如果输入的数是0-65535之间的整数,那么只要65536个空间,分别记录这65535个数出现的次数,线性扫描,将当前数的关联空间加一,如果为2,则表示出现重复。
如果输入的数是0-65535之间的小数,有效数字1位,那么需要65535*10个空间,空间标号与数的匹配函数就是 f(x) = x * 10....
依此类推.......如果允许分配的空间足够大,就可以在o(N)时间内完成该需求。