各位大神們好~
我有一個計算重復度的例子:
外回圈有1000個,資料為List<string>,具體里面是 1,2,4,7,13這樣的數字,長度不定
內回圈有300000個,資料為List<list<int>>,里面是 1,2,3,7,29這樣的數字,長度為6
自己用以下C#演算法,求每種組合的重復度計算出即可。
List<list<int>> listA=new List<list<int>>();
listA = XXX;//這里給listA初始化1000個數字串
List<list<int>> listListB=new List<list<int>>();
listListB = XXX;//這里給listA初始化300000個數字串
foreach(var itemA in listA){
foreach(var itemB in listListB){
int cfd=getcfd(itemA,itemB)
}
}
補充個方法
int getcfd(list<int> lista,list<int> listb){
int cfd=0;
foreach(var itemINT in lista){
if(listb.contains(itemINT)) cfd++;
}
return cfd;
}
上述計算,整個程序太耗時間了。
我查過網路,按兩層回圈優化過代碼,沒有明顯改變。后來把getcfd方法中的改為dictionary的containsKey略能好一點,
看哪位大神,能把 計算的時間降下來。
比如演算法結構方面,能降低時間復雜度也行。
比如是使用多執行緒、快取,減少計算次數也行。
uj5u.com熱心網友回復:
余弦相似度?uj5u.com熱心網友回復:
不知道你具體場景,余弦忽略距離只算特征看你原始演算法,似乎只想算占比
我個人認為,可以先把最大,最小 弄出來。沒交集的直接過
或者先比余弦特征,余弦近似在具體比歐式特征
uj5u.com熱心網友回復:
的確只是計算 兩個list的重復度。
具體場景,是 int cfd=getcfd(itemA,itemB) 計算過后,把滿足CFD范圍條件的list列印出來。只是這個判斷我去掉了。
上述代碼中,能優化的我就用了 containsKey,聽說時間復雜度是O(1)。
uj5u.com熱心網友回復:
我其實都沒看懂題目。List<list<int>> listA=new List<list<int>>();
listA = XXX;//這里給listA初始化1000個數字串
List<list<int>> listListB=new List<list<int>>();
listListB = XXX;//這里給listA初始化300000個數字串
然后題目的 List<string> 又在哪里。。并且我也不知道上面的List<list<int>>到底放字串還是List<int>
uj5u.com熱心網友回復:
哪里有重復?uj5u.com熱心網友回復:
用并行回圈應該能提升一點速度:Parallel.For/ForEach如果List涉及插入洗掉修改的話用ConcurrentBag
uj5u.com熱心網友回復:
目前試過Parallel,CPU4核的跑滿,感徑訓是慢。想從結構上調優下。
ConcurrentBag,我今天查下。
感謝~
uj5u.com熱心網友回復:
還有一種方法叫位圖法,因為你的這個集合都是int,可以嘗試直接用陣列下標進行比較
uj5u.com熱心網友回復:
把資料塞到臨時表,然后用sql查出來,怎么樣
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/17948.html
標籤:C#
上一篇:遞回遍歷問題
