主题:请教大家一个比较难的问题
iphenix
[专家分:0] 发布于 2006-06-22 15:37:00
一个按升序排列的正整数数组有N(100000左右)个元素,这些正整数有比较小的整数,也有大数
比如2,2^200的数,各类的数都有。
当第i个元素被前i-1个元素任何一个整除时,去掉第i个元素,处理完这个数组的时间规模最小为?具体如何实现
回复列表 (共8个回复)
沙发
euc [专家分:4310] 发布于 2006-06-21 21:54:00
n^2 ?
板凳
iphenix [专家分:0] 发布于 2006-06-22 08:37:00
我做得也是n^2,但是有人说有更快得方法
3 楼
boxertony [专家分:23030] 发布于 2006-06-22 11:21:00
我下面的程序应该比n^2更快,但时间复杂度一时算不出来,呵呵。但从测试数据来看,数据量每增加1倍,消耗的时间增加1倍多,因此,时间复杂度应该是接近线性的。
int BinarySearch(int a[], int l, int h, int k)
{
int mid;
while(l <= h)
{
mid = (l+h) >> 1;
if(a[mid] == k)
return mid;
else if(a[mid] > k)
h= mid-1;
else
l = mid+1;
}
return -1;
}
void sieve(int a[], int n)
{
int *b = new int[n];
int pos, new_pos;
memcpy(b, a, sizeof(int)*n);
for(int i=0; i<n-1; ++i)
{
if(a[i] == 0)
continue;
pos = i;
for(int j=a[i]*2; j<=b[n-1]; j+=a[i])
{
new_pos = BinarySearch(b, pos+1, n-1, j);
if(new_pos >= 0)
{
a[new_pos] = 0;
pos = new_pos;
}
}
}
delete []b;
}
4 楼
euc [专家分:4310] 发布于 2006-06-22 12:03:00
nlogn ?
5 楼
rickone [专家分:15390] 发布于 2006-06-22 13:31:00
这些数的范围大不大?如果不大,可以用‘筛法’做。
6 楼
iphenix [专家分:0] 发布于 2006-06-22 14:52:00
有大数
比如有2 ,6,也有类似于2^200这样的数,数组元素的个数大概是100000
7 楼
boxertony [专家分:23030] 发布于 2006-06-22 16:17:00
有2^200这样的数,你怎么存放?64位的整数最大才 2^64-1,难道再用数组存放?
8 楼
iphenix [专家分:0] 发布于 2006-06-22 16:27:00
是的,我是用java编的,里面可以存2^200的大数
如果有大数,这个方法是不是就不行了啊
我来回复