社区
数据结构与算法
帖子详情
编程
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
打赏
收藏
编程
设计程序按从大到小的次序依次输出函数f(a,b)=2*a*a+b*b的最小的100个函数值及相应的两个参数的值,其中a和b均为自然数。 要求: (1)作为函数值的存储结构应尽可能节省空间。 (2)所设计算法及整个程序的时间复杂度尽可能小。 我用的是Visual Studio 悬赏100分!谢谢大家!帮帮忙!急急急
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
C++
编程
实例100篇
C++
编程
实例100篇,里面有很多很基础的
编程
实例,可以作为参考。
C#经典
编程
-220例
C#经典
编程
-220例 超经典的C#
编程
教程,免费下载
C#网络应用
编程
(第2版)PDF附源代码
C#网络应用
编程
不管你是做B/S或C/S这本收非常值得一看,里面的和CP UDP P2P多线程,winform模拟提交表单等都讲了,非常的全,收获甚多.
python趣味
编程
100例(99个)
python如今很流行,AI的首选工具;python趣味
编程
100例(99个),学习
编程
不枯燥。
C#网络核心
编程
C#网络核心
编程
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章