2014-03-03 118 views
0

如果有更快的方法從向量列表中找到特定向量?我做矢量比較,這需要永遠做,我有數百萬記錄。C++比較向量,更快的方式

我使用OpenMP

這是我迄今爲止

#pragma omp parallel for 
          for(int i=0;i<crossed.size();i++){ 
            #pragma omp flush (exit) 
            if(!exit && (crossed[i]== vectors)){ 

              loop = i; 
              found = true; 
              exit = true; 
              #pragma omp flush (exit) 
            } 
          } 

          if(found == false){ 
            crossed.push_back(vectors); 
            cross.push_back(0); 
          } 
          else{ 
            cross[loop] = cross[loop]+1; 
          } 
+0

什麼問題你在解決?也許有一種數據結構或算法比矢量矢量更適合。也許你可以對數據進行排序,然後進行二分搜索? – Jens

+0

如果您必須比較這樣的多個向量,則可以考慮存儲每個向量的哈希信息並比較哈希值。您仍然需要將兩個向量與哈希值相等進行比較,但是您可以立即清除不同的哈希值 - 這會爲您帶來很多速度。 –

+0

我想弄清楚圖形是否同構。爲了做到這一點,我必須乘以阿爾法向量中的每個點,然後檢查是否可以找到重複一次。然後我將它們計數並與其他圖形進行比較以找到非同構圖。如果你們瞭解數學,那麼找出更快的算法會很有幫助 – Hans

回答

2

是的,如果你願意改變你的數據結構的位。

加快比較的一個簡單方法是使用校驗和。我的意思是,從字面上檢查總和。在構建矢量時,保持每個矢量的總和(只要符合數據類型,溢出無關緊要)。然後,而不是比較整個向量,只比較總和 - 如果總和匹配,那麼只有比較向量。

走得更遠,你可以通過你的校驗和排序載體...這可能僅僅是值得的,如果你有很多的載體,因爲它從n個減少你校驗搜索到的log(n)

+0

+1 /散列雖然會比總數好。而且,不需要「通過校驗和對矢量進行排序」 - 只需對單個校驗和/矢量ID索引進行排序即可。 –

+0

每次將元素添加到矢量中時,都必須重新計算標準哈希......有數百萬個元素,我想你會失去很多時間。 –

+0

一個向量散列,它將所有元素散列*與*相和,這對於該場景是合理的方法...散列方面區分總和弱的情況,例如, {10,-10}對{0,0},{1,9}對{10},而總和有助於例如{3,3,3}與{3}。 Trickier具有O(1)cpu和mem方式來生成對處理插入/擦除的命令敏感的值,例如{1,3} vs {3,1}或{1,3,5} vs {5,1,3} - 也可能在相鄰元素之間的差異散列中異或(例如,對於上述情況{2} vs { -2},{2,2} vs {-4,2}) - 雖然有:--(。 –