triskele/include/ArrayTree/triskeleSort.tpp
Git Merciol e097095f3b nouveau fichier : include/ArrayTree/ArrayTreeBuilder.hpp
nouveau fichier : include/ArrayTree/ArrayTreeBuilder.tpp
	nouveau fichier : include/ArrayTree/Border.hpp
	nouveau fichier : include/ArrayTree/GraphWalker.hpp
	nouveau fichier : include/ArrayTree/Leader.hpp
	nouveau fichier : include/ArrayTree/Weight.hpp
	nouveau fichier : include/ArrayTree/Weight.tpp
	nouveau fichier : include/ArrayTree/triskeleArrayTreeBase.hpp
	nouveau fichier : include/ArrayTree/triskeleSort.hpp
	nouveau fichier : include/ArrayTree/triskeleSort.tpp
	modifié :         include/Attribute.hpp
	modifié :         include/Attributes/AreaAttribute.hpp
	supprimé :        include/BuildTree.hpp
	supprimé :        include/DAPTree/Border.hpp
	supprimé :        include/DAPTree/DAPTreeBuilder.hpp
	supprimé :        include/DAPTree/DAPTreeBuilder.tpp
	supprimé :        include/DAPTree/GraphWalker.hpp
	supprimé :        include/DAPTree/ParRnk.hpp
	supprimé :        include/DAPTree/Weight.hpp
	supprimé :        include/DAPTree/baseDAPTree.hpp
	supprimé :        include/DAPTree/sort.hpp
	nouveau fichier : include/IImage.hpp
	nouveau fichier : include/IImage.tpp
	supprimé :        include/ImageInterface.hpp
	supprimé :        include/ImageInterface.tpp
	modifié :         include/QuadTree/QuadTreeBuilder.hpp
	modifié :         include/Tree.hpp
	nouveau fichier : include/TreeBuilder.hpp
	supprimé :        include/TreeOfShapesGeraud/ToSBuilder.hpp
	supprimé :        include/TreeOfShapesGeraud/ToSutils.hpp
	modifié :         include/XMLTree/XMLTreeBuilder.hpp
	supprimé :        include/baseDef.hpp
	supprimé :        include/getType.hpp
	nouveau fichier : include/triskeleBase.hpp
	renommé :         include/dealThreads.hpp -> include/triskeleDealThreads.hpp
	nouveau fichier : include/triskeleDealThreads.tpp
	renommé :         include/debug.hpp -> include/triskeleDebug.hpp
	nouveau fichier : include/triskeleGdalGetType.hpp
	modifié :         otb-module.cmake
	nouveau fichier : src/ArrayTree/triskeleArrayTreeBase.cpp
	modifié :         src/Attribute.cpp
	modifié :         src/Attributes/AreaAttribute.cpp
	modifié :         src/CMakeLists.txt
	supprimé :        src/DAPTree/GraphWalker.cpp
	supprimé :        src/DAPTree/ParRnk.cpp
	supprimé :        src/DAPTree/baseDAPTree.cpp
	supprimé :        src/DAPTree/sort.cpp
	modifié :         src/QuadTree/QuadTreeBuilder.cpp
	modifié :         src/Tree.cpp
	supprimé :        src/TreeOfShapesGeraud/ToSBuilder.cpp
	supprimé :        src/TreeOfShapesGeraud/ToSutils.cpp
	modifié :         src/XMLTree/XMLTreeBuilder.cpp
	supprimé :        src/debug.cpp
	modifié :         src/testMain.cpp
	nouveau fichier : src/triskeleDebug.cpp
	supprimé :        tests/ToSGeraudCoord.txt
	supprimé :        tests/ToSGeraudIdx.ods
2017-11-26 18:38:11 +01:00

53 lines
1.6 KiB
C++

#ifndef _OTB_TRISKELE_ARRAY_TREE_SORT_TPP
#define _OTB_TRISKELE_ARRAY_TREE_SORT_TPP
// ========================================
template <typename T>
inline vector<T> getRandReduce (vector<T> index, T reduceCount);
template <typename E, typename WeightT, typename DimImg, typename WeightFunct>
inline DimImg mergeSort (E *dst, const vector<E *> &tab, const vector<DimImg> &tabSize, const WeightFunct &weightFunct);
// ========================================
template <typename T>
inline vector<T> getRandReduce (vector<T> index, T reduceCount) {
T size = index.size ();
if (reduceCount >= size)
return index;
for (T i = 0; i < size; ++i) {
T j = rand () % size;
T tmp = index [i];
index [i] = index [j];
index [j] = tmp;
}
vector<T> result (&index [0], &index[reduceCount]);
return result;
}
template <typename E, typename WeightT, typename DimImg, typename WeightFunct>
inline DimImg mergeSort (E *dst, const vector<E *> &tab, const vector<DimImg> &tabSize, const WeightFunct &weightFunct) {
DimImg count = 0;
vector<DimImg> curIdx (tab.size (), 0);
for (;;) {
int minIdx = -1;
WeightT minLevel = 0;
for (DimImg i = 0; i < curIdx.size (); ++i) {
if (curIdx[i] >= tabSize[i])
continue;
if (minIdx >= 0 &&
!weightFunct.isWeightInf (tab[i][curIdx[i]], minLevel))
continue;
minIdx = i;
minLevel = tab[i][curIdx[i]];
// LOG ("set minIdx:" << minIdx << " minLevel:" << minLevel);
}
if (minIdx < 0)
break;
*dst++ = tab[minIdx][curIdx[minIdx]++];
++count;
}
return count;
}
#endif // _OTB_TRISKELE_ARRAY_TREE_SORT_TPP