一个C#计算重复度的例子 求助 有点类似于海量数据

[复制链接]
查看11 | 回复10 | 2021-1-27 05:29:48 | 显示全部楼层 |阅读模式
各位大神们好~
我有一个计算重复度的例子:
外循环有1000个,数据为List,具体里面是1,2,4,7,13这样的数字,长度不定
内循环有300000个,数据为List,里面是1,2,3,7,29这样的数字,长度为6
自己用以下C#算法,求每种组合的重复度计算出即可。
ListlistA=newList();
listA=XXX;//这里给listA初始化1000个数字串
ListlistListB=newList();
listListB=XXX;//这里给listA初始化300000个数字串
foreach(varitemAinlistA){
foreach(varitemBinlistListB){
intcfd=getcfd(itemA,itemB)
}
}
补充个方法
intgetcfd(listlista,listlistb){
intcfd=0;
foreach(varitemINTinlista){
if(listb.contains(itemINT))cfd++;
}
returncfd;
}
上述计算,整个过程太耗时间了。
我查过网络,按两层循环优化过代码,没有明显改变。后来把getcfd方法中的改为dictionary的containsKey略能好一点,
看哪位大神,能把计算的时间降下来。
比如算法结构方面,能降低时间复杂度也行。
比如是使用多线程、缓存,减少计算次数也行。

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
余弦相似度?
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
不知道你具体场景,余弦忽略距离只算特征
看你原始算法,似乎只想算占比
我个人认为,可以先把最大,最小弄出来。没交集的直接过
或者先比余弦特征,余弦近似在具体比欧式特征

回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
引用2楼wanghui0380的回复:不知道你具体场景,余弦忽略距离只算特征
看你原始算法,似乎只想算占比
我个人认为,可以先把最大,最小弄出来。没交集的直接过
或者先比余弦特征,余弦近似在具体比欧式特征

的确只是计算两个list的重复度。
具体场景,是intcfd=getcfd(itemA,itemB)计算过后,把满足CFD范围条件的list打印出来。只是这个判断我去掉了。
上述代码中,能优化的我就用了containsKey,听说时间复杂度是O(1)。

回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
我其实都没看懂题目。
ListlistA=newList();
listA=XXX;//这里给listA初始化1000个数字串
ListlistListB=newList();
listListB=XXX;//这里给listA初始化300000个数字串
然后题目的List又在哪里。。并且我也不知道上面的List到底放字符串还是List
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
哪里有重复?
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
用并行循环应该能提升一点速度:Parallel.For/ForEach
如果List涉及插入删除修改的话用ConcurrentBag
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
引用6楼沉沦假象的回复:用并行循环应该能提升一点速度:Parallel.For/ForEach
如果List涉及插入删除修改的话用ConcurrentBag

目前试过Parallel,CPU4核的跑满,感觉还是慢。想从结构上调优下。
ConcurrentBag,我今天查下。
感谢~
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
引用7楼随风过境的回复:Quote: 引用6楼沉沦假象的回复:用并行循环应该能提升一点速度:Parallel.For/ForEach
如果List涉及插入删除修改的话用ConcurrentBag

目前试过Parallel,CPU4核的跑满,感觉还是慢。想从结构上调优下。
ConcurrentBag,我今天查下。
感谢~

还有一种方法叫位图法,因为你的这个集合都是int,可以尝试直接用数组下标进行比较
回复

使用道具 举报

千问 | 2021-1-27 05:29:48 | 显示全部楼层
把数据塞到临时表,然后用sql查出来,怎么样


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行