tpl1rec-2013.cpp
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
mergekw: Dado un vector de listas ordenadas hacer una fusion
K-way, es decir juntar todas las listas en una sola,
tambien ordenada. El algoritmo K-way consiste en
recorrer los primeros elementos de las listas (atencion que algunas
pueden estar vacias), tomar el menor e insertarlo al fin de la lista
#L# Esto se realiza hasta que todas las listas esten vacias. El
algoritmo es similar a la fusion de dos listas, pero generalizado a
#K# listas.
splitlist: Dado un vector de listas #VL1# y un entero
#M# devolver otro vector de listas #VL2# donde las listas
tienen a lo sumo M elementos.
join-list: Dado un vector de listas #VL1# escribir una
funcion que va juntando listas de #VL1# hasta que
todas tengan longitud #>=M#.
[Tomado en el Recup TPL1 de 2013-09-19].
keywords: lista
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <cstdio>
#include <climits>
#include <cassert>
#include "Evaluar.hpp"
void print(list<int> &L,const char*s=NULL) {
if (s) printf("%s: ",s);
printf("(",s);
list<int>::iterator q = L.begin();
while (q!=L.end()) printf("%d ",*q++);
printf(")\n");
}
void print(vector<list<int> > &VL,const char*s=NULL) {
if (s) printf("%s:\n",s);
for (int j=0; j<VL.size(); j++) {
printf("VL[%d]: ",j);
print(VL[j]);
}
}
void mergekw(vector<list<int> > &VL,list<int> &L) {
L.clear();
int N = VL.size();
#if 0
for (int j=0; j<N; j++) {
printf("VL[%d]: ",j);
print(VL[j]);
}
#endif
while (1) {
int allempty=1, min=INT_MAX, jmin=-1;
for (int j=0; j<N; j++) {
if (!VL[j].empty()) {
allempty=0;
list<int>::iterator q = VL[j].begin();
if (*q<min) {
min=*q;
jmin=j;
}
}
}
if (allempty) break;
VL[jmin].erase(VL[jmin].begin());
L.push_back(min);
}
// print(L,"L: ");
}
void split_list(vector<list<int> > &VL1,int M,
vector<list<int> > &VL2) {
// print(VL1,"VL1");
VL2.clear();
int N = VL1.size();
for (int j=0; j<N; j++) {
list<int> &L = VL1[j];
while (L.size()>M) {
VL2.push_back(list<int>());
list<int> &dest = VL2.back();
list<int>::iterator q = L.begin();
for (int j=0; j<M; j++) {
dest.push_back(*q);
q = L.erase(q);
}
}
if (!L.empty()) VL2.push_back(L);
}
// print(VL2,"VL2");
}
void join_list(vector<list<int> > &VL1,int M,
vector<list<int> > &VL2) {
// print(VL1,"VL1");
VL2.clear();
int N = VL1.size();
list<int> tmp;
for (int j=0; j<N; j++) {
list<int> &L = VL1[j];
tmp.insert(tmp.end(),L.begin(),L.end());
if (tmp.size()>=M) {
VL2.push_back(tmp);
tmp.clear();
}
}
if (!tmp.empty()) VL2.push_back(tmp);
// print(VL2,"VL2");
}
int main()
{
aed::Evaluar ev;
ev.evaluar1(mergekw);
ev.evaluar2(split_list);
ev.evaluar3(join_list);
return 0;
}
Generated by GNU Enscript 1.6.6.