| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2338 人关注过本帖, 1 人收藏
标题:请大神指导查询,比对问题
只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
利用字符Str1在C1,C2出现的次数?OCCURS(Str1,C1)>=OCCURS(Str1,C2)
如果C1包含C2,那么C2中每个字符出现的次数,肯定是大于或者等于。。
你们想到的真牛?
用AT()函数不行,AT返回的是出现的位置,表2的出现2个以上字符时,计算错误。

[此贴子已经被作者于2015-10-28 17:15编辑过]

2015-10-28 17:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
用CHRTRAN()可能也可以,想想......。


[此贴子已经被作者于2015-10-28 20:46编辑过]

2015-10-28 20:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
用CHRTRAN()还是存在重复问题
2015-10-28 20:46
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
吐:SDTA 老师:
如果按照楼主的题意:表一约数千(假设5000),表二约100
用 Occurs() 函数约 1+ 秒,好像还可以接受的。

Close Databases
*!*    表3 : 包含,Query : 不包含:
Clear
Create Cursor 表1 (序号 I, 结果 C(5))

gnLower = 0
gnUpper = 99999
=Rand(-1)
For I = 1 To 5000
    Insert Into 表1 Values(I, Right("00000" + Transform(Int((gnUpper - gnLower + 1) * Rand( ) + gnLower)), 5))
Endfor

gnLower = 0
gnUpper = 999
=Rand(-1)
Create Cursor 表2 (序号 I, 结果 C(3))
For I = 1 To 100
    Insert Into 表2 Values(I, Right("000" + Transform(Int((gnUpper - gnLower + 1) * Rand( ) + gnLower)), 3))
Endfor

T1 = Seconds( )
Select *, 00000 As 序号2, "   " As 包含 From 表1 Readwrite Into Cursor 表3

Select 表2
Scan
    Select 表3
    Replace All 表3.序号2 With 表2.序号, 表3.包含 With 表2.结果 For ;
        Occurs(Substr(表2.结果, 1, 1), 表3.结果) >= Occurs(Substr(表2.结果, 1, 1), 表2.结果) And ;
        Occurs(Substr(表2.结果, 2, 1), 表3.结果) >= Occurs(Substr(表2.结果, 2, 1), 表2.结果) And ;
        Occurs(Substr(表2.结果, 3, 1), 表3.结果) >= Occurs(Substr(表2.结果, 3, 1), 表2.结果) And ;
        Empty(表3.包含)
    Select 表2
Endscan
Select 表3
Go Top
Browse Last Nowait
Select 序号, 结果 As 不包含 From 表2 Where 结果 Not In (Select 包含 From 表3) Into Cursor Query
Browse Last Nowait
Wait Window "耗时 : " + Transform(Seconds( ) - t1) + " 秒"

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-10-28 21:20
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 44楼 aaaaaa
这点数据,速度确实有点慢了

坚守VFP最后的阵地
2015-10-28 22:26
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:2 
SDTA 版主你好,请你演示一个快速计算的示例好吗?
表一约10W条,表二月1K条,结果要秒杀,
可以做到吗?
您一定行的。
谢谢。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-10-29 08:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
试过几种字符串处理的方法,计数法最快,排序法最慢,还有排除法。
分析一下实际数据,从实际出发,可能会有更快的算法。
2015-10-29 08:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用wjx6769在2015-10-28 15:16:53的发言:
所以,开奖结果是否有重复不重要,重要的是开奖结果里是否包含有表2(0-9组成的不重复的3位数(120个号))。如果在一定期数里,还有没开出来的3位数,那么我就可以考虑买这个3位数,按照一定的比例追着买一定的期数。出了,就中奖了。

下载实际开奖数据测试了一下,大约在最近100期内才出现没开出来的3位数,这样看来,要处理的数据量并不多?
2015-10-29 10:04
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:2 
好热闹啊!俺也来插一腿。看看俺的代码是否简洁,算法是否高效。
程序代码:
LOCAL cFor,cStr,cChr,nNum
CLEAR
CLOSE TABLES ALL
USE 表1 IN 0
SELECT 0
USE 表2
SCAN FOR !EMPTY(结果)
    cFor = ''                            && 保存搜索条件
    cStr = ALLTRIM(表2.结果)            && 去除左右空格
    DO WHILE !EMPTY(cStr)                && 生成搜索条件
        cChr = LEFT(cStr,1)                && 获取取第一个字符
        nNum = OCCURS(cChr,cStr)        && 该字符的个数
        cStr = CHRTRAN(cStr,cChr,'')    && 从变量中删除该字符
        cFor = cFor + " AND OCCURS('"+ cChr +"',结果)>=" + TRANS(nNum)    && 组合搜索条件
    ENDDO
    cFor = SUBSTR(cFor,6)                && 去除条件中开头的“ ANDSELECT 表1                            && 从表1中查找满足条件的记录
    LOCATE FOR &cFor
    IF !FOUND()                            && 若未找到,则显示之
        ? 表2.结果
    ENDIF   
ENDSCAN 


[此贴子已经被作者于2015-10-29 11:50编辑过]


泉城飞狐
2015-10-29 11:49
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
*WINXP VFP6.0环境下运行
****T1=SECONDS()
* 生成测试数据表
CREATE CURSOR JGB (不包含 C(3)) && 保存不包含的数据
CREATE CURSOR 表1 (结果 C(5))
=RAND(-1)
FOR I = 1 TO 99999
    INSERT INTO 表1 VALUES(PADL(INT(RAND()*I),5,"0") )
ENDFOR
INDEX ON 结果 TAG JGB
*BROWSE
* 生成120个不重复三位数据,由小到大排列
CREATE CURSOR tt (X N(1))
FOR I=0 TO 9
    INSERT INTO tt VALUES (I)
ENDFOR

SELECT STR(A.X,1)+STR(B.X,1)+STR(C.X,1)+"  " 对照 FROM tt A ;
    Inner JOIN tt B ON B.X>A.X ;
    Inner JOIN tt C ON C.X>B.X ORDER BY 1 INTO CURSOR 表2

T1=SECONDS()

SELECT 表2
*BROWSE
SCAN
    SELECT 表1
    SCAN
        CSTR=结果
        FOR I=1 TO 3
            NLEN=AT(SUBSTR(表2.对照,I,1),CSTR) && 查找替换位置
            IF NLEN>0
                CSTR=STUFF(CSTR,NLEN,1,"")
            ENDIF
        ENDFOR
        IF LEN(CSTR)=2
            EXIT
        ENDIF
    ENDSCAN
    IF LEN(CSTR)>2
        INSERT INTO JGB VALUES (表2.对照)
    ENDIF
ENDSCAN
MESSAGEBOX("共用时:"+TRANSFORM(SECONDS()-T1,"9999999.999")+" 秒")
* 浏览不包含的数据
SELECT JGB
BROWSE


[此贴子已经被作者于2015-10-29 12:46编辑过]


坚守VFP最后的阵地
2015-10-29 11:54
快速回复:请大神指导查询,比对问题
数据加载中...
 
   



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

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