簡體   English   中英

我應該使用哪種類型的稀疏向量?

[英]What type of sparse vector should I use?

數據

我有N索引的不同(排序)向量( std::vector<unsigned int> )。 索引在[0; L-1]。 這是有關此數據的兩個經驗法則:

  • 任何地方僅存在約0.1%到10%的可能指數
  • 如果在給定向量中找到索引,則可能會在其他向量中再次找到索引。

因此,具有N=10向量和L = 200的可能數據集可能是

{45, 110, 119, 145, 170}
{9, 45, 110, 145, 178, 170}
{45, 145}
{45, 178, 183}
{45, 53, 110, 170}
{9, 119, 123, 179}
{9, 45, 119, 130, 131, 170, 190, 199}
{9, 45, 110, 170, 199}
{31, 45, 145}
{9, 178, 183}

目標

我想計算每個索引的頻率。 我會做類似的事情

std::vector<double> computeFrequencies(std::vector<std::vector<unsigned int>>& data)
{
    assert(data.size() == N);

    std::vector<double> frequencies(L);
    for (unsigned Ni = 0 ; Ni < N ; Ni++)
    {
        for (unsigned i = 0 ; i < data[Ni].size() ; i++)
        {
            assert(data[Ni][i] < L)
            frequencies[data[Ni][i]]++;
        }
    }

    for (unsigned i = 0 ; i < L; i++)
    {
        frequencies[i] /= (double) N;
    }

    return(frequencies);    
}

然后,我將再次循環遍歷一次由computeFrequencies函數返回的對象。

for (unsigned i = 0 ; i < L; i++)
{
    foo(frequencies[i]);
}

對象frequencies包含很多零,因此我應該使用稀疏矢量。 我對稀疏矩陣了解不多。 我應該使用哪種類型的稀疏向量?

我正在考慮使用boost::numeric::ublas::coordinate_matrix<double><double>因為當我遍歷所有N向量時,我會不斷添加新的非零值,並且我認為坐標矩陣將非常適合處理接着就,隨即。 請注意,通常來說,對於此功能,我更擔心RAM的使用而不是計算時間。

看起來稀疏的向量表示形式不太適合您的問題。

要完成您描述的任務:

  1. 將已排序的向量合並到單個已排序的向量中。 時不時地在這里彈出如何進行有效的K向合並: 使用K向合並合並N個排序的文件
  2. 遍歷新向量,並計數每個條目的重復項數量(這很容易,因為它們將在一起),以獲取您的頻率並在您使用時對其進行foo

您甚至可以同時執行兩個步驟,完全避免了將數據復制到新結構中的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM