标题:求:一个好像很简单的问题,愣是想不到一个很简单的算法?
只看楼主
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
结帖率:100%
 问题点数:0 回复次数:43 
求:一个好像很简单的问题,愣是想不到一个很简单的算法?
设:
有8个字符型字段,A1...A8 (C) 12——
A1、A2、A3、A4、A5、A6、A7、A8
它们的值,有可能相同,也有可能不同,例如:
A1 ="七仙女"
A2 ="黄大仙"
A3 ="黄大仙"
A4 ="黄大仙"
A5 ="黄小仙"
A6 ="黄大仙"
A7 ="黄大仙"
A8 ="王母娘娘"
求:
如何迅速计算出8个字段的“重合率”,并将结果填入A9字段。
比如上例,A9 = 5/8 = 0.625(即62.5%)
搜索更多相关主题的帖子: 算法 重合 字段 结果 计算 
2023-03-11 12:57
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
如果有多个字段有重合,如何将结果保存A9中
A1 ="七仙女"
A2 ="黄大仙"
A3 ="黄大仙"
A4 ="黄大仙"
A5 ="七仙女"
A6 ="黄大仙"
A7 ="黄大仙"
A8 ="王母娘娘"
OCCURS()应该有用处吧

[此贴子已经被作者于2023-3-11 15:56编辑过]


坚守VFP最后的阵地
2023-03-11 13:15
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用sdta在2023-3-11 13:15:44的发言:
OCCURS()应该有用处吧


高!一语点醒梦中人啊!
2023-03-11 14:11
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
2023-03-11 15:45
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用sdta在2023-3-11 13:15:44的发言:
如果有多个字段有重合,OCCURS()应该有用处吧


能想到的初步算法是:

lnMaxRate = 0
lcMaxA = ""
lcAll_A = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8    &&A1...A8有效字符不超过10位,而字段宽度预设为12,右边皆有空格

lcA  = A1
lnRate = OCCURS(lcA, lcAll_A)
if lnRate > lnMaxRate
    lcMaxA = lcA
    lnMaxRate = lnRate
endif

lcA  = A2
lnRate = OCCURS(lcA, lcAll_A)
if lnRate > lnMaxRate
    lcMaxA = lcA
    lnMaxRate = lnRate
endif

lcA  = A3
lnRate = OCCURS(lcA, lcAll_A)
if lnRate > lnMaxRate
    lcMaxA = lcA
    lnMaxRate = lnRate
endif

...

replace A9 with lnMaxRate, MaxA with lcMaxA

==================

不知有无更简洁的算法?
2023-03-13 11:50
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
搞成这样可否
2023-03-13 12:39
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
Create Cursor test ( ;
     a1 V(10),a2 V(10),a3 V(10),a4 V(10),a5 V(10),a6 V(10),a7 V(10),a8 V(10) ;
     ,rate Y,maxa V(10))
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "七仙女","黄大仙","黄大仙","黄大仙","黄小仙","黄大仙","黄大仙","王母娘娘")
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "七仙女","黄大仙","七仙女","黄大仙","七仙女","七仙女","黄小仙","王母娘娘")

Select test
Scan all
    Release aaa,bbb
    nn = Recno()
    Copy To array aaa fields like 'a?' RECORD nn
    Dimension aaa[Alen(aaa,2),1]
    Create Cursor temp (ax V(10))
    Append From array aaa
    Select ax, Count(*) from temp group by ax order by 2 desc into array bbb
    Use in temp
    Select test
    Replace next 1 maxa with bbb[1,1], rate with bbb[1,2] / Alen(aaa,1)
EndScan
Browse
2023-03-13 14:56
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
细节楼主没说清楚(2楼的情况如何处理,多个值有重复内容)

坚守VFP最后的阵地
2023-03-13 15:10
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用sdta在2023-3-13 15:10:53的发言:
细节楼主没说清楚(2楼的情况如何处理,多个值有重复内容)


感谢关注!
这个算法,目的就是获取在8个字段当中,重复次数最多的一个重复项,以及此重复项的重复率。
多个值有重复内容,取重复次数最多的那一个值。
2023-03-13 15:23
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用csyx在2023-3-13 14:56:09的发言:

Create Cursor test ( ;
     a1 V(10),a2 V(10),a3 V(10),a4 V(10),a5 V(10),a6 V(10),a7 V(10),a8 V(10) ;
     ,rate Y,maxa V(10))
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "七仙女","黄大仙","黄大仙","黄大仙","黄小仙","黄大仙","黄大仙","王母娘娘")
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "七仙女","黄大仙","七仙女","黄大仙","七仙女","七仙女","黄小仙","王母娘娘")
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "黄小仙","黄大仙","黄小仙","黄大仙","黄小仙","七仙女","黄小仙","王母娘娘")
Insert into test (a1,a2,a3,a4,a5,a6,a7,a8) values ( ;
    "王母娘娘","王母娘娘","黄大仙","黄大仙","黄小仙","王母娘娘","王母娘娘","王母娘娘")

Select test
Scan all
    Release aaa,bbb
    nn = Recno()
    Copy To array aaa fields like 'a?' RECORD nn
    Dimension aaa[Alen(aaa,2),1]
    Create Cursor temp (ax V(10))
    Append From array aaa
    Select ax, Count(*) from temp group by ax order by 2 desc into array bbb
    Use in temp
    Select test
    Replace next 1 maxa with bbb[1,1], rate with bbb[1,2] / Alen(aaa,1)
EndScan
Browse



这个算法非常简洁!
远比我写的那一大堆啰哩啰嗦的8次机械比较算法,简洁了不知多少倍!
就是有些艰涩,我得逐句逐句好好消化一下子。
2023-03-13 15:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511512-1-1.html




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

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