| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2947 人关注过本帖, 1 人收藏
标题:请大神帮忙写张表格,就是将总数量为28的两个元素的所有排列与组合都写进表 ...
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 60楼 shuxin211
粗粗看了一下,对照测试了一下。
B B B B B B B B B B B B B B B B B B B B B B B B B B B
B B P B B P B B P B B P B B P B B P B B P B B P B B P
B P B B P B B P B B P B B P B B P B B P B B P B B P B
B P P B P P B P P B P P B P P B P P B P P B P P B P P
P B B P B B P B B P B B P B B P B B P B B P B B P B B
P B P P B P P B P P B P P B P P B P P B P P B P P B P
P P B P P B P P B P P B P P B P P B P P B P P B P P B
P P P P P P P P P P P P P P P P P P P P P P P P P P P

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...         0
0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 ...  19173961
0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 ...  38347922
0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 ...  57521883
1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 ...  76695844
1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 ...  95869805
1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 ... 115043766
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 134217727

先将提供的BP表(27位)转换成二进制和10进制数值,作测试对照参考。
只显示结果:
程序代码:
CLEAR
SET TALK OFF
CREATE CURSOR bpb (bpn I, bp1 I, bp2 I, bpi I)
INSERT INTO bpb VALUES (        0, 0, 0, 1)
INSERT INTO bpb VALUES ( 19173961, 0, 0, 1)
INSERT INTO bpb VALUES ( 38347922, 0, 0, 1)
INSERT INTO bpb VALUES ( 57521883, 0, 0, 1)
INSERT INTO bpb VALUES ( 76695844, 0, 0, 1)
INSERT INTO bpb VALUES ( 95869805, 0, 0, 1)
INSERT INTO bpb VALUES (115043766, 0, 0, 1)
INSERT INTO bpb VALUES (134217727, 0, 0, 1)

nBits = 27
nBPk = 0
n位数 = 3
DO WHILE .T.
    nRet = MESSAGEBOX("P...是"+0h0D+"B...否", 3+32+512, "提示")
    IF nRet == 2
        EXIT
    ENDIF
    nBP = IIF(nRet == 6, 1, 0)
    nBPk = nBPk + 1
    nBit = MOD(nBPk, n位数)
    nBit = IIF(nBit == 0, n位数, nBit)

    CLEAR
    建BP表(nBits)
    ?
    ? " nBP="+IIF(nBP==0,"B","P"), " nBPk="+TRANSFORM(nBPk), " nBit="+TRANSFORM(nBit)
    ?
    ? " BP       BPi        BP2       BPi+1"
    nB = 0
    nP = 0
    SELECT bpb
    SCAN
        REPLACE bpb.bp1 WITH 取bp(bpb.bpn, nBit, nBits),;
                bpb.bp2 WITH 取bp(bpb.bpn, nBPk+1, nBits)
        ? " " + IIF(bpb.bp1==0, "B", IIF(bpb.bp1==1, "P", "-"))
        ?? bpb.bpi
        ?? "        "+IIF(bpb.bp2==0, "B", IIF(bpb.bp2==1, "P", "-"))
        ?? bpb.bpi + IIF(bpb.bp1 == nBP, -1, 1)
        REPLACE bpb.bpi WITH bpb.bpi + IIF(bpb.bp1 == nBP, -1, 1)
        nB = nB + IIF(bpb.bp2 == 0, bpb.bpi, 0)
        nP = nP + IIF(bpb.bp2 == 1, bpb.bpi, 0)
    ENDSCAN
    ?
    ? " B="+TRANSFORM(nB), " P="+TRANSFORM(nP)
ENDDO
RETURN

FUNCTION 取bp(bpn, nBit, nBits)
    IF !BETWEEN(bpn, 0x00000000, 0xFFFFFFFF) OR !BETWEEN(nBit, 1, nBits)
        RETURN -1
    ENDIF
    RETURN BITRSHIFT(BITLSHIFT(bpn, 32 - nBits + nBit - 1), 31)
ENDFUNC

FUNCTION 建BP表(nBits)
    LOCAL i, nBP
    SELECT bpb
    SCAN
        ? bpb.bpn, "..."
        FOR i = 0 TO nBits-1
            nBP = BITRSHIFT(BITLSHIFT(bpb.bpn, 32 - nBits + i), 31)
            ?? " " + IIF(nBP==0, "B", "P")
        ENDFOR
    ENDSCAN
ENDFUNC
2015-08-29 20:54
shuxin211
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-8-26
收藏
得分:0 
以下是引用吹水佬在2015-8-29 20:54:03的发言:

粗粗看了一下,对照测试了一下。
B B B B B B B B B B B B B B B B B B B B B B B B B B B
B B P B B P B B P B B P B B P B B P B B P B B P B B P
B P B B P B B P B B P B B P B B P B B P B B P B B P B
B P P B P P B P P B P P B P P B P P B P P B P P B P P
P B B P B B P B B P B B P B B P B B P B B P B B P B B
P B P P B P P B P P B P P B P P B P P B P P B P P B P
P P B P P B P P B P P B P P B P P B P P B P P B P P B
P P P P P P P P P P P P P P P P P P P P P P P P P P P

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...         0
0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 ...  19173961
0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 ...  38347922
0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 ...  57521883
1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 ...  76695844
1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 ...  95869805
1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 ... 115043766
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 134217727

先将提供的BP表(27位)转换成二进制和10进制数值,作测试对照参考。
只显示结果:

CLEAR
SET TALK OFF
CREATE CURSOR bpb (bpn I, bp1 I, bp2 I, bpi I)
INSERT INTO bpb VALUES (        0, 0, 0, 1)
INSERT INTO bpb VALUES ( 19173961, 0, 0, 1)
INSERT INTO bpb VALUES ( 38347922, 0, 0, 1)
INSERT INTO bpb VALUES ( 57521883, 0, 0, 1)
INSERT INTO bpb VALUES ( 76695844, 0, 0, 1)
INSERT INTO bpb VALUES ( 95869805, 0, 0, 1)
INSERT INTO bpb VALUES (115043766, 0, 0, 1)
INSERT INTO bpb VALUES (134217727, 0, 0, 1)

nBits = 27
nBPk = 0
n位数 = 3
DO WHILE .T.
    nRet = MESSAGEBOX("P...是"+0h0D+"B...否", 3+32+512, "提示")
    IF nRet == 2
        EXIT
    ENDIF
    nBP = IIF(nRet == 6, 1, 0)
    nBPk = nBPk + 1
    nBit = MOD(nBPk, n位数)
    nBit = IIF(nBit == 0, n位数, nBit)

    CLEAR
    建BP表(nBits)
    ?
    ? " nBP="+IIF(nBP==0,"B","P"), " nBPk="+TRANSFORM(nBPk), " nBit="+TRANSFORM(nBit)
    ?
    ? " BP       BPi        BP2       BPi+1"
    nB = 0
    nP = 0
    SELECT bpb
    SCAN
        REPLACE bpb.bp1 WITH 取bp(bpb.bpn, nBit, nBits),;
                bpb.bp2 WITH 取bp(bpb.bpn, nBPk+1, nBits)
        ? " " + IIF(bpb.bp1==0, "B", IIF(bpb.bp1==1, "P", "-"))
        ?? bpb.bpi
        ?? "        "+IIF(bpb.bp2==0, "B", IIF(bpb.bp2==1, "P", "-"))
        ?? bpb.bpi + IIF(bpb.bp1 == nBP, -1, 1)
        REPLACE bpb.bpi WITH bpb.bpi + IIF(bpb.bp1 == nBP, -1, 1)
        nB = nB + IIF(bpb.bp2 == 0, bpb.bpi, 0)
        nP = nP + IIF(bpb.bp2 == 1, bpb.bpi, 0)
    ENDSCAN
    ?
    ? " B="+TRANSFORM(nB), " P="+TRANSFORM(nP)
ENDDO
RETURN

FUNCTION 取bp(bpn, nBit, nBits)
    IF !BETWEEN(bpn, 0x00000000, 0xFFFFFFFF) OR !BETWEEN(nBit, 1, nBits)
        RETURN -1
    ENDIF
    RETURN BITRSHIFT(BITLSHIFT(bpn, 32 - nBits + nBit - 1), 31)
ENDFUNC

FUNCTION 建BP表(nBits)
    LOCAL i, nBP
    SELECT bpb
    SCAN
        ? bpb.bpn, "..."
        FOR i = 0 TO nBits-1
            nBP = BITRSHIFT(BITLSHIFT(bpb.bpn, 32 - nBits + i), 31)
            ?? " " + IIF(nBP==0, "B", "P")
        ENDFOR
    ENDSCAN
ENDFUNC

吹水版主果然厉害,写出这么复杂的代码,可惜我一点都看不懂,都不知道怎么用,看来还有很长的路要走啊,靠自己写恐怕暂时是不成了。
2015-08-29 21:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
没有基础,一切都是空谈。

坚守VFP最后的阵地
2015-08-29 22:03
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 62楼 shuxin211
只是测试代码,没用的。
按你说的算法和对照提供的EXCEL,每选择一次B或P时,最终算出B和P的值。
2015-08-29 22:37
shuxin211
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-8-26
收藏
得分:0 
以下是引用吹水佬在2015-8-29 22:37:55的发言:

只是测试代码,没用的。
按你说的算法和对照提供的EXCEL,每选择一次B或P时,最终算出B和P的值。

就是这个意思,然后根据算出的BP值来确定投向和数量,这个数量是要除以总的组合数的,我举例里面除了8,所以3个0后面应该是1,然后会慢慢上升。没想到在VFP里面实现起来这么困难,本以为这么简单的算法会很容易搞定才决定自学的。
2015-08-29 22:48
shuxin211
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-8-26
收藏
得分:0 
以下是引用sdta在2015-8-29 22:03:11的发言:

没有基础,一切都是空谈。

我的算法很简单,没想到在VFP里实现起来还是比较有难度的。
2015-08-29 22:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
不是已经有方法了吗

坚守VFP最后的阵地
2015-08-30 00:31
shuxin211
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-8-26
收藏
得分:0 
以下是引用sdta在2015-8-30 00:31:47的发言:

不是已经有方法了吗

你的那个方法已经可以写出全部组合了,但是后面的算法吹水版主的代码目前看不懂怎么用,慢慢琢磨吧。再此谢谢你们的指点。
2015-08-30 01:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 68楼 shuxin211
我的思路也是按你的意思去构想。

不同点是你需要设定一个BP表,我就不需要这个BP表,因目前只理解到如何统计每次选择B或P时统计B和P的数值。当时考虑过,只统计B和P的数值,是否可以不需要这个BP表。BP表至少要28*268435456个元素,对于VFP来说,规模不算小,不一定好处理,但比较直观且算法简单,直接读写表的字段就可以。

测试时采用一个计算表 bpb 来处理:
CREATE CURSOR bpb (bpn I, bp1 I, bp2 I, bpi I)
其中:
bpn 就是那个BP表每条记录转换成10进制的数值,如果是完整的如0,1,2,.....,bpn可不要,直接从记录号换算。
bp1 这个是每次选择B或P后,需确定用来做比对的BP记录(BP表中的那个字段的记录)。
bp2 这个是比对后的BP记录,用来统计B和P数值。
bpi 这个是存放上次比对计数结果和本次比对后的计数结果,也就是存放比对前后的计数结果。

在此将BP表转换成10进制数值来表示,把对表字段的读取变为对数值的位的读取,主要目的是想减少资源的占用,减少BP表装载时的耗费。但运用起来未必高效,它需要做数据转换操作。

如果对数据的位操作运算不了解,可能会感觉有点复杂。数据的位操作运算是计算机最基本的运算,最好弄懂它,它需要对二进制数有所认识。
2015-08-30 08:41
shuxin211
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-8-26
收藏
得分:0 
以下是引用吹水佬在2015-8-30 08:41:28的发言:

我的思路也是按你的意思去构想。

不同点是你需要设定一个BP表,我就不需要这个BP表,因目前只理解到如何统计每次选择B或P时统计B和P的数值。当时考虑过,只统计B和P的数值,是否可以不需要这个BP表。BP表至少要28*268435456个元素,对于VFP来说,规模不算小,不一定好处理,但比较直观且算法简单,直接读写表的字段就可以。

测试时采用一个计算表 bpb 来处理:
CREATE CURSOR bpb (bpn I, bp1 I, bp2 I, bpi I)
其中:
bpn 就是那个BP表每条记录转换成10进制的数值,如果是完整的如0,1,2,.....,bpn可不要,直接从记录号换算。
bp1 这个是每次选择B或P后,需确定用来做比对的BP记录(BP表中的那个字段的记录)。
bp2 这个是比对后的BP记录,用来统计B和P数值。
bpi 这个是存放上次比对计数结果和本次比对后的计数结果,也就是存放比对前后的计数结果。

在此将BP表转换成10进制数值来表示,把对表字段的读取变为对数值的位的读取,主要目的是想减少资源的占用,减少BP表装载时的耗费。但运用起来未必高效,它需要做数据转换操作。

如果对数据的位操作运算不了解,可能会感觉有点复杂。数据的位操作运算是计算机最基本的运算,最好弄懂它,它需要对二进制数有所认识。

吹水版主的理解是完全正确的,我的思路其实就是延续了excel里面的设计思路,一环接着一环的往后走然后得到结果就行了,过程很直观,你说的数据量的问题将28减少到26应该差不多了,6000多万条记录,是28的四分之一,我最开始设计的是B+P=32,接近43亿的数据量,即使是在sql server里恐怕也是个不小的工程,如果用sql server的话还得结合其它的开发语言,难度就更大了,所以压缩到B+P=28,希望在VFP里面实现,现在看来可能得压缩到26才行。用我的思路的话解决BP表与K线记录表循环对比得出BP各自的适时数量,问题基本就解决了,后面的事情比较简单。用你的思路来做肯定更科学,优化的比较好,毕竟省了几个环节,虽然涉及到数据转换,总体效率应该会有提升,但是对于菜鸟来说难以完成。我在用excel的时候就不喜欢对数据位进行操作,因为直接对单元格进行操作要简单直接的多,菜鸟都是这样的吧。
2015-08-30 18:09
快速回复:请大神帮忙写张表格,就是将总数量为28的两个元素的所有排列与组合都写 ...
数据加载中...
 
   



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

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