2015-04-04 27 views
1

我有一个vector< vector <int> >矩阵大小为n的和我想要得到的最小值对于每个i和其指数法[i] [j],并把它在载体上,但我不想重复任何索引。获取从矩阵最小值和索引而不重复指数C++

我已经找到了一种理论的方式,但我不能在代码中写。

请2个矢量ù←{1,...,N},L←{1,...,N}
重复n次

  • BE(U,L)∈U× L从矩阵[u,l]≤矩阵[i,j],∀i∈U,∀j∈L
  • S [u]←l
  • Do U←U- {u} y L←L- {l}
+1

你的问题不是很清楚:你想找到的价值和最小元素在基体(最小值和argmin)的位置?或者是什么? – 2015-04-04 11:27:06

+1

对于每一列我想要最小元素的行索引,但在下一列中,我不想重复以前选择的行索引。 – Trouner 2015-04-04 11:38:54

+0

@Trouner所以在下一列中,如果min元素在同一行,你想要第二个最小的元素? – 2015-04-04 11:49:04

回答

2

您可以直接对此算法进行编码

typedef vector<vector<int>> Matrix; 
typedef pair<size_t, size_t> Index; 
typedef vector<Index> IndexList; 

IndexList MinimalSequence(const Matrix& matrix) { 
    IndexList result; 

    set<size_t> U, L; 
    for (size_t i = 0; i < matrix.size(); ++i) { // consider square 
     U.insert(i); 
     L.insert(i); 
    } 

    while (U.size()) { // same as L.size() 
     int min = numeric_limits<int>::max(); 
     Index minIndex; 
     for (auto u: U) 
      for (auto l: L) 
       if (matrix[u][l] < min) { 
        minIndex = make_pair(u, l); 
        min = matrix[u][l]; 
       } 

     U.erase(minIndex.first); 
     L.erase(minIndex.second); 
     result.push_back(minIndex); 
    } 

    return result; 
} 

也是你的问题是不能以这种方式清楚:你想从矩阵的整体最小的元素开始(如您的公式说的),然后移动到下一个最小? 还是你想从左到右移动列?我根据公式实施它。

注意,在公式中设置非负整数的是set<size_t>上插入()和删除()可供选择。对于所有的while循环

我也建议尝试替代算法 - 由有相应的值进行排序矩阵指数列表,然后迭代它删除您不想再索引。

编辑:代码实际上不同于算法在几个方面是精确的。这似乎更实际。重复

  • 过程,直到一套指标用完的 - 这等于n
  • 回报结构是2D指数列表和编码比阵列
更多信息
相关问题