| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2728 人关注过本帖
标题:求:一个好像很简单的问题,愣是想不到一个很简单的算法?
取消只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:18 
求:一个好像很简单的问题,愣是想不到一个很简单的算法?
设:
有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
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用sdta在2023-3-11 13:15:44的发言:
OCCURS()应该有用处吧


高!一语点醒梦中人啊!
2023-03-11 14:11
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册: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
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用sdta在2023-3-13 15:10:53的发言:
细节楼主没说清楚(2楼的情况如何处理,多个值有重复内容)


感谢关注!
这个算法,目的就是获取在8个字段当中,重复次数最多的一个重复项,以及此重复项的重复率。
多个值有重复内容,取重复次数最多的那一个值。
2023-03-13 15:23
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册: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
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用csyx在2023-3-13 15:54:27的发言:

2. dimension aaa[...]  相当于行转列


哈哈哈哈,就是“行转列”,我一时转不过弯来!
数据拿到手时,我一直就没想清楚:这个……列数据如何group by?结果一直就陷在这死胡同里出不来啦。

非常感谢!
2023-03-13 16:45
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用csyx在2023-3-13 15:54:27的发言:

如果数据是:【王母,大姐,二姐,三姐,四姐,五姐,六姐,七妹】我不知谁该排第一
或者:【张三,李四,王五,赵六,张三,李四,王五,赵六】谁又该排第一


这个无所谓,只需找出第一个第一,并列第一者就忽略呗,反正不违背初衷:
找出最大次数的重复者,并统计重复率。
2023-03-13 17:19
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
非常感谢sam_jiang和诸位网友的帮助!

玩大一点点,为这算法增加一点点通用性或难度:

假设:
A1...A18
皆为整型数值字段
求:
获取重复次数最多的一个字段值,及其重复次数。

这一回,若打算再勉强用OCCURS(),恐怕就必须先Str(),然后才能OCCURS()啦。
不知还有没有能上天入地的奇门遁甲法门?

2023-03-13 21:30
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2023-3-13 23:14:22的发言:

条件好像不够充分?
18个字段 ..... 最多的一个字段值,这“18个”与“一个”是什么关系。
试举例说明


哈哈哈哈,纯属信口胡诌的,说得也不严谨。
例如,假设一行记录是一位学生各科的分数:
98,95,74,92,65,92,92,77,92,88,92,……
统计当中出现最多的一个分数值,以及出现的次数。
上例可能是:92,5次。

2023-03-13 23:27
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用csyx在2023-3-14 07:20:08的发言:
看不出有多大不同,算法逻辑还一样。


感谢csyx、吹版的关注!
其实,我突发奇想将数据类型改为整型值,重点在于挑战OCCURS()。
在此,我毫不掩饰对于OCCURS()的偏爱。
事关,此函数若用OCCURS()来实现,那么,代码哪怕放到几十年后阅读,仍然无需注释秒懂,因逻辑简单,一目了然。
然而,整型值无法直接OCCURS(),用str()转换,最大长度为11字节,效率上难免大打折扣!

当然,可能有其他奇技淫巧,能够缩减字节数。比方说:
N1=1314520520
C1=TRANSFORM(N1,"@0")
C1=right(C1,8)
这样能将长度变为8字节。

此外,还有更变态的,只可惜VFP似乎遇到0xFFFF的字符会越界出错:
N1=0xFFFFFFFF
NL = BitRshift(N1,16)
NR = BitAnd(N1, 0xFFFF)
CL = chr(NL)
CR = chr(NR)
当数值为0xFFFF(十进制值65535)时,我过不了chr()这一关,无法构造出内码值为0xFFFF的字符串来,这一点比较遗憾。
退而求其次,这么弄:
Nsrc=0xFFFFFFFF
N1 = BitRshift(Nsrc,24)
N2 = BitAnd(BitRshift(Nsrc,16), 0xFF)
N3 = BitAnd(BitRshift(Nsrc,8), 0xFF)
N4 = BitAnd(Nsrc, 0xFF)
N2C = chr(N1)+chr(N2)+chr(N3)+chr(N4)
现在,N2C就是四字节的由整型值内码构造出来的字符串了。

那么,OCCURS()或许仍是值得依赖的。


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

2023-03-14 09:17
快速回复:求:一个好像很简单的问题,愣是想不到一个很简单的算法?
数据加载中...
 
   



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

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