首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个小弟我觉得很复杂的有关问题(应该是循环吧)

2012-04-08 
一个我觉得很复杂的问题(应该是循环吧)一个10000个元素的一维数组,每个元素都是一个数。我想实现从前20个元

一个我觉得很复杂的问题(应该是循环吧)
一个10000个元素的一维数组,每个元素都是一个数。我想实现从前20个元素中找出极大值,然后从这个元素的后20个元素开始找极小值(极大值极小值之间的距离必须不小于20个点),再从极小值点的后20个元素开始找极大值。。。依次类推,最后找出所有的极值对就行了。每次找到的极值都必须满足一个条件(> X),否则就不是符合的点,找下一个来配对。怎么实现,高手支招。我比较笨。

[解决办法]
int a[10000]={??}, x=??; //定义并完成初始化,x是需要满足的条件
int max[250], min[250]; // 分别保存 250个极大值和250个极小值
int t, i, j; //辅助变量

for(i=0; i <250; i++) //250 次循环
{
t=a[i*40];
for(j=i*40+1; j <i*40+20; j++) //20 数字中寻找极大值
if(a[j]> t)t=a[j];
max[i]=t; //保存到 max 数组中

t=a[i*40+20];
for(j=i*40+20+1; j <i*40+40; j++) //寻找极小值
if(a[j] <t && a[j]> x)t=a[j]; //对于极小值增加 > x 的条件校验
min[i]=t; //保存
}

// OK
[解决办法]
flagswitch=true;//find max first
do{
endflag=checkValid(arrayTail,from);//从from到数组末尾距离是否小于20
if(flagswitch){
findMax(from,arrayTail,resultSet);//计算从from 开始的极大值
flagswitch=false;//下次计算极小值
}else{
findMin(from,arrayTail,resultSet);//计算从from开始的极小值
flagswitch=true; //下次计算极大值
}
if(!endflag) from+=20;//从上次计算的极值点开始到数组末尾还有至少20个元素,可移动,不会越界
}while(!endflag)

[解决办法]
停机条件就是上一次极值位置与数组末尾少于20个元素,则计算尾巴的极值,并终止计算。
过滤数据可以在findMax,findMin中实现,不满足条件的进行更新resultSet的操作。
resultSet最好是一个指向链表头的地址,那么find***需要实现或调用链表追加的操作
[解决办法]
jixingzhong(瞌睡虫·星辰)你的程序有点问题吧,如果你找到了极大值的话应该就记下这个极大值所对应的下标,因为是从这个位置开始向后退20个数来寻求极小值,想楼上所说的那样,必须要记住位置和数值......
if( a[ j ] > t )
{
t = a[ j ] ;
Pos = j ;
}
[解决办法]
极端情况下,应该可能出现5000个极大,5000个极小

每次找到的极值都必须满足一个条件(> X),否则就不是符合的点,找下一个来配对。

你这里说得不清楚啊,如果后边20个都 <X,怎么处理?继续找下一段20个?下面我不处理 <x的情况,你自己考虑加上吧

int a[10000]={??}, x=??; //定义并完成初始化,x是需要满足的条件
int max[5000], min[5000]; // 分别保存 5000个极大值和5000个极小值,记录在a中的下标值
int index=0,count1=1,count2=1; //辅助变量
bool flag=true;

max[0]=0,min[0]=1;

while( count1 <10000) //10000 次循环
{
if(flag)//求极大
{
if(a[count1]> a[max[index]])
{
max[index]=count1;
min[index]=count1+1;
}
else if(a[count1] <a[min[index]])
{
min[index]=count1;
}
if(count2==20)
{
flag=false;
count2=1;
}
else ++count2;
++count1;
}
else//求极小
{
if(a[count1] <a[min[index]])
{
min[index]=count1;
max[index+1]=count1+1;
}
else if(a[count1]> a[max[index+1]])
{
max[index+1]=count1;
}
if(count2==20)
{
flag=true;
++index;
count2=1;
}
else ++count2;
++count1;
}
}
//处理越界
if(max[index]> =10000) max[index]=0;
if(min[index]> =10000) min[index]=0;

// OK



手边没有c++,没有经过编译调试,希望算法思路已经能够表达清楚。。。

热点排行