编程

mxdqwe 2008-07-01 04:10:36
设计程序按从大到小的次序依次输出函数f(a,b)=2*a*a+b*b的最小的100个函数值及相应的两个参数的值,其中a和b均为自然数。
要求:
(1)作为函数值的存储结构应尽可能节省空间。
(2)所设计算法及整个程序的时间复杂度尽可能小。
我用的是Visual Studio
悬赏100分!谢谢大家!帮帮忙!急急急
...全文
151 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sssssjjjj 2008-07-02
  • 打赏
  • 举报
回复
11楼
sssssjjjj 2008-07-02
  • 打赏
  • 举报
回复
你修正后的算法跟我在13楼写的算法思路是一样的
tailzhou 2008-07-02
  • 打赏
  • 举报
回复
这实际上就相当与m路归并排序;

sssssjjjj 2008-07-02
  • 打赏
  • 举报
回复
你的i,j什么时候自加?2)中两步执行完了以后吗?
第一次执行2)时
[6:1,2]入堆,A[1]=2
[9:2,1]入堆,还是A[1]=2 ??
"A[i]==j表示a==i,b==j已入堆",那是不是应该A[2]=1了
tailzhou 2008-07-02
  • 打赏
  • 举报
回复
不过确实有点bug;

修正为:
假设输出最小的m个函数值
使用最小堆保存候选值;

1) 对所有的1<=i<=m,[2+i*i:1,i]入堆;
2) 堆的最小值[k:i,j]出堆并输出; 同时[2*i*i+(j+1)*(j+1):i,j+1]入堆;
3) 重复2),直到输出了m个元素;

修正后的算法的时间复杂度为O(mlogm),空间复杂度为O(m);
tailzhou 2008-07-02
  • 打赏
  • 举报
回复
" 三楼师父的设计〔9:2,1〕是不是没有入堆呢?"

怎么会没入堆?

2) 堆的最小值[k:i,j]出堆并输出;
若 A[i] <j+1,则[2*i*i+(j+1)*(j+1):i,j+1]入堆,A[i]=j+1;
若 A[j] <i+1,则[2*(i+1)*(i+1)+j*j:i+1,j]入堆,A[j]=i+1;

[3:1,1]出堆后,就会将[9:2,1]与[8:1,2]入堆呀;

sssssjjjj 2008-07-02
  • 打赏
  • 举报
回复
提供一个思路:
定义结构体数组A[m+1](eg:A[1].b=1;A[1].sum=3表示f(1,1)=3)
1)初始时A[1].b=1;A[1].sum=3;
2)取.sum最小的A[i]输出;
A[i].b=A[i].b+1; A[i].sum=2*i*i + A[i].b*A[i].b;
如果A[i+1].sum==0,设置A[i+1].b=1; A[i+1].sum = 2*(i+1)*(i+1) + 1;
3)重复2直到输出100个
sssssjjjj 2008-07-02
  • 打赏
  • 举报
回复
首先自我检讨一下,沙发坐得太急,1楼程序写错了,没有考虑a=1,b=2到a=2,b=1时b减小的情况。
不过二位的好像也不太对:
lz程序中的old_a,old_b好像没更新过哦!
三楼师父的设计〔9:2,1〕是不是没有入堆呢?
mxdqwe 2008-07-02
  • 打赏
  • 举报
回复
的确!谢谢 提醒!你 能帮帮忙吗?

tailzhou 2008-07-02
  • 打赏
  • 举报
回复
他的程序的输出?


tailzhou
幸福的尾巴
等级:
发表于:2008-07-01 22:43:205楼 得分:0
jy02684358 的代码的原理?

我执行了下,好象你的程序计算出来的前几个数是 3 6 9 11 18

但12,17没有看到;

12=2*2*2+2*2
17=2*2*2+3*3



mxdqwe 2008-07-02
  • 打赏
  • 举报
回复
?我验证过了啊!通过!
tailzhou 2008-07-02
  • 打赏
  • 举报
回复
我原来的算法其实也是这个意思,但在这个地方有点小问题;

2) 堆的最小值[k:i,j]出堆并输出;
若 A[i] <j+1,则[2*i*i+(j+1)*(j+1):i,j+1]入堆,A[i]=j+1;
若 A[j] <i+1,则[2*(i+1)*(i+1)+j*j:i+1,j]入堆,A[j]=i+1;

应该是:
2) 堆的最小值[k:i,j]出堆并输出;
同时 [2*i*i+(j+1)*(j+1):i,j+1]入堆;
若j==1,则[2*(i+1)*(i+1)+1*1:i+1,1]也入堆;
tailzhou 2008-07-01
  • 打赏
  • 举报
回复
lz有验证这个代码的正确性么?
mxdqwe 2008-07-01
  • 打赏
  • 举报
回复
谢谢你啦!和你们分享一下高手做的!
#include "stdafx.h"
#include <iostream>
using namespace std;

bool charge_a(int a,int o_a,int h)
{
bool flag;

int sum=2*(a*a-o_a*o_a);

if(sum>h)
flag=false;
else flag=true;

return flag;
}

bool charge_b(int b,int o_b,int h)
{
bool flag;

int sum=b*b-o_b*o_b;

if(sum>h)
flag=false;
else flag=true;

return flag;
}

int return_high_a(int a,int o_a)
{
int h=2*(a*a-o_a*o_a);
return h;
}
int return_high_b(int b,int o_b)
{ int h=b*b-o_b*o_b;
return h; }
int terurn_result(int a,int b)
{
int result=2*a*a+b*b;
return result;
}
int _tmain(int argc,_TCHAR*argv[])
{
int new_a=2,old_a=1,new_b=2,old_b =1;
int a[100],flag=1;
int sum=0,high=6;
a[sum++]=terurn_result(1,1);
while(sum<100)
{
switch(flag)
{
case 1:
if(charge_b(new_b,old_b,high))
{
a[sum] = terurn_result(old_a,new_b);
new_b++;
sum++;
}
else
{
flag=2;
high=return_high_b(new_b,old_b);
}
break;
case 2:
if(charge_a(new_a,old_a,high))
{
a[sum]=terurn_result(new_a, old_b);
new_a++;
sum++;
}
else
{
flag=1;
high=return_high_a(new_a,old_a);
}
break;
}
}
for(int j=0;j<100;j++)
cout<<a[j]<<endl;
getchar();
return 0;
}
tailzhou 2008-07-01
  • 打赏
  • 举报
回复
3) 重复2),直到输出了m个元素;
tailzhou 2008-07-01
  • 打赏
  • 举报
回复
假设输出最小的m个函数值
使用最小堆保存候选值;
再使用辅助数组A[m]={0},A[i]==j表示a==i,b==j已入堆;

1) [3:1,1]入堆,A[1]=1;
2) 堆的最小值[k:i,j]出堆并输出;
若 A[i]<j+1,则[2*i*i+(j+1)*(j+1):i,j+1]入堆,A[i]=j+1;
若 A[j]<i+1,则[2*(i+1)*(i+1)+j*j:i+1,j]入堆,A[j]=i+1;
3) 重复2),直到输出了100个元素;

可以看到堆的大小<=m,出堆操作==m次,所以入堆操作<=2m次; 每次出或入堆的复杂度为o(logm);

所以总的时间复杂度为O(mlogm);
空间复杂度为O(m);
mxdqwe 2008-07-01
  • 打赏
  • 举报
回复
没有完成的程序嘛?怎么只有算法?
sssssjjjj 2008-07-01
  • 打赏
  • 举报
回复
int a=0;
int b=0;
result[0][0]=0;
result[0][1]=0;
result[0][2]=0;
for(int i=1;i<100;i++)
{
if(4*a+1<2*b)
{
a++;
result[i][0]=result[i-1][0]+4*a+2;
}
else
{
b++;
result[i][0]=result[i-1][0]+2*b+1;
}
result[i][1]=a;
result[i][2]=b;
}

33,028

社区成员

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

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