我有一个大小为n的vector< vector <int> >
矩阵,我希望得到每个i的最小值,它索引[i] [j]并将其放在矢量上,但我不想得到任何索引重复。
我找到了一种理论方法,但我无法用代码编写。
制作2个向量U←{1,...,n},L←{1,...,n}
重复n次
答案 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
我还建议尝试替代算法 - 按相应的值对矩阵索引列表进行排序,然后迭代它,删除不再需要的索引。
编辑:代码实际上与算法的不同之处在于精确的几种方式。这似乎更实用。
答案 1 :(得分:1)
您已经接受了答案,但是您是否面对可以使用Assignment problem解决的Hugarian algorithm,并且可能存在并且已经实施的更有效的算法?< / p>