| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1656 人关注过本帖
标题:求寻找空缺的序号
只看楼主 加入收藏
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
以下是引用cnfarer在2012-6-18 14:07:34的发言:

locate for zyh>recc()
?"最小空缺号:",recc();
还是得排序吧.
2012-06-18 14:22
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
sql语句就能解决吧
以前写过
现在不知道怎么写了
本来也学的不好
有个笨法
在没有任何索引优化的情况下
仅供参考
程序代码:
Select zyh From ypjgk Into Cursor temp Order By zyh
Select temp
Go Bottom 

lnMax = temp.zyh
Create Cursor temp1 (aa N)
For i = 1 To lnMax
    Insert Into temp1 Values (i)
Next

Select aa From temp1 Where aa Not in (Select zyh From ypjgk) Into Cursor temp3
Browse 

 

个性太多,无法显示
2012-06-18 14:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 2楼 arefeng
第1种方案,不要做scan循环,由于已经索引,用seek来搜索序号是否存在,则不受数据规模影响。是循环数组(序数不断步进就是了),不是循环数据表。不过,这实际上与循环表没多大差别,单机下是一样的,但网络共享模式下,则是SEEK快了。可以换一种方式,跳跃搜,每次步进10(具体多大,经实际测试确定),skip 10,看编号是不是正好也是相差10,如果是,就再跳10,如果不是,则必定在这10条记录内有所需要的东西。用折半查找算法的思路做,也是可以的。没有实际的数据测试,不好谈论。

找个序号用筛选,是得不偿失的。

[ 本帖最后由 TonyDeng 于 2012-6-18 15:28 编辑 ]

授人以渔,不授人以鱼。
2012-06-18 15:02
make_sail
Rank: 1
来 自:内蒙古呼和浩特
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-3-2
收藏
得分:0 
程序代码:
SELECT MIN(zyh) as imin FROM ypjgk INTO CURSOR p_min
SELECT p_min
GO top
iMin = p_min.imin        &&得到最小的 ZYH
SELECT zyh, RECNO()+iMin-1 as irec FROM ppp ORDER BY zyh INTO CURSOR p_orderby
SELECT TOP 1 * FROM p_orderby WHERE zyh<>irec ORDER BY zyh INTO CURSOR p_minres
SELECT p_minres
GO top
?"最小的断号:", irec


[ 本帖最后由 make_sail 于 2012-6-18 15:47 编辑 ]
2012-06-18 15:45
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用arefeng在2012-6-18 10:52:13的发言:

不科学啊, 主要是用select生成重新排序后的临时表的方法不合理.

如果源表记录数很多的话,这种排序法太浪费了,实在没有必要.
什么是科学的,探讨下。

坚守VFP最后的阵地
2012-06-18 20:11
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
回复 13楼 TonyDeng
同意.
严重同意!!
建议楼主采用Tony的思路, 比较优化, 步进量可以为总记录数量的百分之一左右应该就可以确保任何情况下的性能了.
2012-06-18 20:22
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
回复 15楼 sdta
实现功能的时候, 尽量考虑一下性能问题,
而且如果有条件的情况下(比如能够理解消化一些方法),
尽量用较优化的方案来实现,
这就是我所认为的科学的意思.

比如楼主这个需求,
有很多种方法可以实现的情况下,
速度更快/占用系统资源更少/应用面更广的方案理当被优先采用.

当然如果有理解上的困难,
追求性能优化之前, 还是先确保实现功能.
毕竟大多数对性能有提升的方法都不是容易理解的.
同时大多数情况下, 硬件性能确实可以掩盖软件性能问题.
收到的鲜花
  • sdta2012-06-18 20:50 送鲜花  10朵   附言:我很赞同
2012-06-18 20:45
ptyy803
Rank: 2
来 自:上海
等 级:论坛游民
威 望:2
帖 子:193
专家分:64
注 册:2009-6-11
收藏
得分:0 
通过大家给我的启示,使我得到了很好的思路,下面与大家一起分享
CLEAR
cZyh=1
SELECT ypjgk
SET ORDER TO zyh    && 必须已经建立了索引
GO TOP
DO WHILE !Eof()
   IF zyh=cZyh
      cZyh=cZyh+1
   ELSE
      cMinZyh=cZyh
      ? "最小的空缺号:",cMinZyh
      EXIT
   ENDIF
   SKIP
ENDDO


[ 本帖最后由 ptyy803 于 2012-6-18 20:54 编辑 ]
2012-06-18 20:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用ptyy803在2012-6-18 20:52:53的发言:

通过大家给我的启示,使我得到了很好的思路,下面与大家一起分享
CLEAR
cZyh=1
SELECT ypjgk
SET ORDER TO zyh    && 必须已经建立了索引
GO TOP
DO WHILE !Eof()
   IF zyh=cZyh
      cZyh=cZyh+1
   ELSE
      cMinZyh=cZyh
      ? "最小的空缺号:",cMinZyh
      EXIT
   ENDIF
   SKIP
ENDDO
DO  ENDDO 循环,效率是最低的,可以测试下。

坚守VFP最后的阵地
2012-06-18 20:55
ptyy803
Rank: 2
来 自:上海
等 级:论坛游民
威 望:2
帖 子:193
专家分:64
注 册:2009-6-11
收藏
得分:0 
请教19楼sdta:那最快的循环效率是什么语句?
2012-06-18 21:49
快速回复:求寻找空缺的序号
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032695 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved