高分求算法!!!

lz_zxf 2003-04-29 01:17:42
一个表顺序固定,要求算出这个表中相邻10条记录的金额的最大.
我只知道穷举,有没有更好的办法?谢谢
...全文
52 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
marki 2003-05-02
  • 打赏
  • 举报
回复
OK,謝謝你給我指出不足,我以後作東西時
要多繃一根弦了~
sbw 2003-05-02
  • 打赏
  • 举报
回复
早上对你的程序进行了测试,结果如下:

1000 0.126
10000 0.700
100000 6.845
1000000 70.394

顺便测试了一千万条记录的时间:
我的:213.412秒
你的:718.628秒

这是在同一机器上测得的结果,我不否认你的机器比我的要快,对于程序来说在同一机器上运行比较才具有可比性。

另:不要再说我的程序有问题了,因为我的程序的结果和你程序的结果是一样的,如果否认我的结果,那就等于否认了你自己的结果了。当然我的程序不是一点问题没有,比如:没有考虑到删除的记录,或记录少于10便会出错,如果全部记录为很大的负数(超过程序里的:max=-999999这个数)程序也会有问题(当然你的程序里也有同样的问题)。

希望以后多指教。
marki 2003-05-01
  • 打赏
  • 举报
回复
*// 真是粗心,這下無毛病,測試了一下,
*// 速度也挺快,1百萬條絕對30秒內:)

m.testnum=1000000 && 測試記錄數

CREATE CURSOR tB (qty N (5))

FOR i=1 TO m.testnum
INSERT INTO tB (qty) VALUES (RAND()*100000)
NEXT


SELECT * FROM tB INTO CURSOR tB1
m.maxnum = _TALLY
*//上面的語句主要是排除帶刪除標記
*//的記錄,這樣它的記錄序號就不會有
*//問題了
s1=second()

a=0
b=0
x=1
SELECT tB1
GO TOP
SCAN
IF m.maxnum-x = 9
EXIT
ENDIF

FOR i=1 TO 10
a=a+qty
SKIP
NEXT

IF a>b
b=a
c=recno()-10
ENDIF

SKIP -10

a=0
x=x+1

SELECT tB1
ENDSCAN
SELECT tB1

? "查找到記錄號為:"+STR(c)+"及後9條記錄和符合要求!"
? "最大和為:"+STR(b)
LOCATE FOR RECNO()=c
s2=second()
? "測試記錄為:"+PADL(m.testnum,8,' ')+"條"
? "共耗時:"+STR(s2-s1,12,4)+"秒"
sbw 2003-05-01
  • 打赏
  • 举报
回复
明天见,呵呵。
marki 2003-05-01
  • 打赏
  • 举报
回复
呵~睡個好覺~
sbw 2003-05-01
  • 打赏
  • 举报
回复
我等着你。

另:多谢指教。

:)
sbw 2003-05-01
  • 打赏
  • 举报
回复
你把我的程序注释一下如何?
marki 2003-05-01
  • 打赏
  • 举报
回复
你這樣處理不行,我看到了,不能解決問題
sbw 2003-05-01
  • 打赏
  • 举报
回复
对于你的第二个程序:
m.testnum=1000000 && 測試記錄數

CREATE CURSOR tB (qty N (5))

FOR i=1 TO m.testnum
INSERT INTO tB (qty) VALUES (RAND()*100000)
NEXT


SELECT * FROM tB INTO CURSOR tB1
m.maxnum = _TALLY
*//上面的語句主要是排除帶刪除標記
*//的記錄,這樣它的記錄序號就不會有
*//問題了
s1=second()

a=0
b=0
x=1
SELECT tB1
GO TOP
SCAN
IF m.maxnum-x = 9
EXIT
ENDIF

FOR i=1 TO 10
a=a+qty
SKIP
NEXT

IF a>b
b=a
c=recno()
ENDIF

SKIP -10

b=IIF(a>b,a,b)

a=0
x=x+1
SELECT tB
ENDSCAN
SELECT tB1

? "查找到記錄號為:"+STR(c)+"的記錄符合要求!"
LOCATE FOR RECNO()=c
s2=second()
? "測試記錄為:"+PADL(m.testnum,8,' ')+"條"
? "共耗時:"+STR(s2-s1,12,4)+"秒"

对于你程序中考虑到没有删除的记录,我表示佩服,我确实没有考虑这一点,对于你的程序我没有时间去研究,今晚喝(酒)得有点过了。对不起。明天我会分析的。
sbw 2003-05-01
  • 打赏
  • 举报
回复
你在我的程序里的do while 之前是什么?你再看看。




marki 2003-05-01
  • 打赏
  • 举报
回复
用for 來累加是要在現有記錄號上遞增的
求和完畢後,需返回之前記錄,再求和!
marki 2003-05-01
  • 打赏
  • 举报
回复
你這個程序沒有問題!
注意:
你在這是用的匯總函數
calc sum(number) to b for recno()>0.and.recno()<11

而之前程序是
do while 外層遞增
for 在裡層遞增
導致什麼,你想想

我在程序中用到了 skip-10,外層我用scan
sbw 2003-05-01
  • 打赏
  • 举报
回复
我把另外的一个程序也贴出来吧,你看看。
sec=seconds()
set talk off
close all
use b1
a=recc()
jlh=0
calc sum(number) to b for recno()>0.and.recno()<11
for i=1 to a-9
calc sum(number) to c for recno()>i.and.recno()<i+11
if c>b
jlh=i+1
b=c
endif
endfor
?jlh
?seconds()-sec

marki 2003-05-01
  • 打赏
  • 举报
回复
從你上面的程序是看不到這一點的
sbw 2003-05-01
  • 打赏
  • 举报
回复
对于1-10,2-11这个已经考虑在内了。而不是1-10.11-20.
marki 2003-05-01
  • 打赏
  • 举报
回复
你的思路和我不一樣,和樓主也有差別哦~
sbw 2003-05-01
  • 打赏
  • 举报
回复
因为在解决这个问题的时候我另外编制了一个穷举的另一个程序,而两个程序的结果是一样的。
marki 2003-05-01
  • 打赏
  • 举报
回复
仔細看看吧,你每10求和時,記錄有回復嗎,
你的程序只能這樣
1-10,11-20...
而不是
1-10,2-11,...
sbw 2003-05-01
  • 打赏
  • 举报
回复
没有问题,我已验证过。
marki 2003-05-01
  • 打赏
  • 举报
回复
最後一個,才是正確的,呵~
加载更多回复(35)
基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip 【备注】 项目多为高分毕设,评审平均分达到95分以上,都经过本地验证,运行OK后上传,可直接运行起来。 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java、JavaScript、c#、游戏开发、小程序开发学习者、深度学习等专业方向。 也可作为课程设计、期末大作业。包含:项目源码、数据库、项目说明等,该项目可以直接作为毕设、课程设计使用。 也可以用来学习参考借鉴!

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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