从矩阵中获取最小值和索引而不重复索引C ++

时间:2015-04-04 11:24:41

标签: c++ matrix

我有一个大小为n的vector< vector <int> >矩阵,我希望得到每个i的最小值,它索引[i] [j]并将其放在矢量上,但我不想得到任何索引重复。

我找到了一种理论方法,但我无法用代码编写。

制作2个向量U←{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}

2 个答案:

答案 0 :(得分: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>,其中insert()和erase()可用。因为所有都是while-loop

我还建议尝试替代算法 - 按相应的值对矩阵索引列表进行排序,然后迭代它,删除不再需要的索引。

编辑:代码实际上与算法的不同之处在于精确的几种方式。这似乎更实用。

    重复
  • 过程直到索引集合耗尽 - 等于n
  • 返回结构是2d索引的列表,并编码比数组
  • 更多的信息

答案 1 :(得分:1)

您已经接受了答案,但是您是否面对可以使用Assignment problem解决的Hugarian algorithm,并且可能存在并且已经实施的更有效的算法?< / p>