Funciones | |
template<class Itor , class Operation > | |
Operation | Aleph::for_each (Itor beg, const Itor &end, Operation op) |
template<class Itor , class Operation > | |
Itor::difference_type | Aleph::count_if (Itor beg, const Itor &end, Operation op) |
template<class Itor , class T > | |
Itor::difference_type | Aleph::count (const Itor &beg, const Itor &end, const T &value) |
template<class Itor , class CompFunc = Aleph::less<typename Itor::value_type>> | |
Itor | Aleph::min_element (Itor beg, const Itor &end, CompFunc op=CompFunc()) |
template<class Itor , class CompFunc = Aleph::greater<typename Itor::value_type>> | |
Itor | Aleph::max_element (const Itor &beg, const Itor &end, CompFunc op=CompFunc()) |
template<class Itor , class UnaryPredicate > | |
Itor | Aleph::find_if (Itor beg, const Itor &end, UnaryPredicate op) |
template<class Itor , class T > | |
Itor | Aleph::find (const Itor &beg, const Itor &end, const T &value) |
template<class Itor , class Size , class T , class BinaryPredicate = Aleph::equal_to<T>> | |
Itor | Aleph::search_n (Itor beg, const Itor &end, Size count, const T &value, BinaryPredicate op=BinaryPredicate()) |
template<class Itor1 , class Itor2 , class BinaryPredicate = Aleph::equal_to<typename Itor1::value_type>> | |
Itor1 | Aleph::search (Itor1 beg, const Itor1 &end, Itor2 searchBeg, const Itor2 &searchEnd, BinaryPredicate op=BinaryPredicate()) |
template<class Itor1 , class Itor2 , class Comp = Aleph::equal_to<typename Itor1::value_type>> | |
bool | Aleph::lexicographical_compare (Itor1 beg1, const Itor1 &end1, Itor2 beg2, const Itor2 &end2, Comp op=Comp()) |
template<typename Ta , template< typename > class Ca, typename Tb = Ta, template< typename > class Cb = Ca> | |
Cb< Tb > | Aleph::map_items (const Ca< Ta > &ca, std::function< Tb(const Ta &)> operation) |
template<template< typename > class Container, typename T , class Operation > | |
T | Aleph::foldl (const Container< T > &container, const T &init, Operation &operation) |
template<typename T , class Compare = Aleph::less<T>> | |
void | Aleph::heapsort (T *array, const size_t n) |
template<typename T , class Compare = Aleph::less<T>> | |
void | Aleph::faster_heapsort (T *array, const size_t n) |
template<typename T , class Compare > | |
void | Aleph::selection_sort (T *a, const size_t n, Compare &cmp) |
template<class Link , class Compare > | |
Link * | Aleph::search_extreme (Link &list, Compare &cmp) |
template<class Compare > | |
void | Aleph::selection_sort (Dlink &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::selection_sort (Dnode< T > &list, Compare &cmp) |
template<typename T , class Equal > | |
int | Aleph::sequential_search (T *a, const T &x, const int l, const int r, Equal &eq) |
template<typename T , class Equal = Aleph::equal_to<T>> | |
int | Aleph::sequential_search (DynArray< T > &a, const T &x, const int l, const int r, Equal &eq) |
template<typename T , class Equal = Aleph::equal_to<T>> | |
Dnode< T > * | Aleph::sequential_search (Dnode< T > &list, const T &x, Equal &eq) |
template<typename T , class Equal > | |
T * | Aleph::sequential_search (DynDlist< T > &list, const T &x, Equal &eq) |
template<typename T , class Compare = Aleph::less<T>> | |
int | Aleph::search_extreme (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare = Aleph::less<T>> | |
int | Aleph::search_min (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare = Aleph::greater<T>> | |
int | Aleph::search_max (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare > | |
T * | Aleph::search_extreme (DynDlist< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
T * | Aleph::search_min (DynDlist< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
T * | Aleph::search_max (DynDlist< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::insertion_sort (T *a, const size_t l, const size_t r, Compare &cmp) |
template<class Compare > | |
void | Aleph::insert_sorted (Dlink &list, Dlink *p, Compare &cmp) |
template<class Compare > | |
void | Aleph::insertion_sort (Dlink &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::merge (T *a, const int l, const int m, const int r, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::mergesort (T *a, const int l, const int r, Compare &cmp) |
template<class Tlist , class Compare > | |
void | Aleph::merge_lists (Tlist &l1, Tlist &l2, Tlist &result, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::merge_lists (Dnode< T > &l1, Dnode< T > &l2, Dnode< T > &result, Compare &cmp) |
template<class Tlist , class Compare > | |
void | Aleph::mergesort (Tlist &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::mergesort (Dnode< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::mergesort (DynDlist< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::quicksort_rec (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::quicksort_rec_min (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::quicksort (T *a, const int l, const int r, Compare &cmp) |
template<class Compare > | |
void | Aleph::quicksort (Dlink &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::quicksort (Dnode< T > &list, Compare &cmp) |
template<typename T , class Compare > | |
void | Aleph::quicksort_insertion (T *a, const int l, const int r, Compare &cmp) |
template<typename T , class Compare > | |
int | Aleph::random_search (T *a, const T &x, const int l, const int r, Compare &cmp) |
template<typename T , class Compare > | |
Dnode< T > * | Aleph::dlink_random_search (Dlink &list, const T &x, Compare &cmp) |
template<typename T , class Compare > | |
Dnode< T > * | Aleph::random_search (Dlink &list, const T &x, Compare &cmp) |
template<typename T , class Compare > | |
T * | Aleph::random_search (DynDlist< T > &list, const T &x, Compare &cmp) |
template<typename T , class Compare > | |
const T & | Aleph::random_select (T *a, const int i, const int n, Compare &cmp) |
template<class Compare > | |
Dlink * | Aleph::dlink_random_select (Dlink &list, const size_t i, Compare &cmp) |
template<typename T , class Compare > | |
Dnode< T > * | Aleph::random_select (Dlink &list, const size_t i, Compare &cmp) |
template<typename T , class Compare > | |
T * | Aleph::random_select (DynDlist< T > &list, const size_t i, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::selection_sort (DynArray< T > &a, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::bubble_sort (DynArray< T > &a, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::insertion_sort (DynArray< T > &a, int l, int r, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::shellsort (DynArray< T > &a, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::heapsort (DynArray< T > &a, Compare &cmp) |
template<class T , class Compare > | |
void | Aleph::quicksort (DynArray< T > &a, Compare &cmp) |
template<class T , class Compare > | |
int | Aleph::search_extreme (DynArray< T > &a, const int l, const int r, Compare &cmp) |
template<class T , class Compare > | |
int | Aleph::search_max (DynArray< T > &a, const int &l, const int &r, Compare &cmp) |
template<class T , class Compare > | |
int | Aleph::binary_search (DynArray< T > &a, const T &x, int l, int r, Compare &cmp) |
template<class T , class Compare > | |
int | Aleph::binary_search (DynArray< T > &a, const T &x, Compare &cmp) |
template<typename T , class Compare > | |
int | Aleph::binary_search_rec (T *a, const T &x, const int &l, const int &r, Compare &cmp) |
Algoritmos genéricos
Aleph-w exporta una amplia gama de algoritmos. Básicamente, las categorías de algoritmos pueden dividirse en:
stlc++
Con excepción de los algoritmos sobre grafos, que están agrupados bajo el móduloGrafos., todos los algoritmos están agrupados bajo esta sección. Para mirar los algoritmos sobre grafos, vaya la sección "Funciones" del módulo Grafos..
A pesar del soporte para para la biblioteca stlc++
, es recomendable emplear algoritmos directos de Aleph-w, pues lo de stlc++
son genéricos y según la implementación del contenedor pueden incurrir en algunas penalidades.
|
inline |
Búsqueda binaria sobre un arreglo dinámico ordenado.
binary_search<T,Compare>(a,x,l,r) realiza la búsqueda de x en el arreglo a comprendida entre los límites inferior l y superior r.
La rutina es genérica y utiliza dos parámetros tipo:
La rutina usa el algoritmo de la búsqueda binaria, lo que exige que el arreglo esté ordenado. Esta condición no se verifica en el algoritmo.
El método siempre retorna un entero comprendido entre [l..r]. Si el elemento es encontrado, entonces el valor de retorno es índice donde éste se encuentra; de lo contrario, se retorna el índice donde se insertaría x para que el arreglo estuviese ordenado.
[in] | a | el arreglo dinámico sobre el cual realizar la búsqueda. |
[in] | x | el elemento a buscar. |
[in] | l | índice izquierdo de búsqueda. |
[in] | r | índice derecho de búsqueda. |
Hace referencia a Aleph::DynArray< T >::access().
|
inline |
Búsqueda binaria sobre un arreglo dinámico ordenado.
binary_search(a,x) realiza la búsqueda de x en el arreglo a comprendida entre 0 y size()
.
La rutina usa el algoritmo de la búsqueda binaria, lo que exige que el arreglo esté ordenado. Esta condición no se verifica en el algoritmo.
El método siempre retorna un entero comprendido entre [0..size()). Si el elemento es encontrado, entonces el valor de retorno es el índice donde éste se encuentra; de lo contrario, se retorna el índice donde se insertaría x para que el arreglo estuviese ordenado.
[in] | a | el arreglo dinámico sobre el cual realizar la búsqueda. |
[in] | x | el elemento a buscar. |
Hace referencia a Aleph::DynArray< T >::size().
|
inline |
Búsqueda binaria recursiva sobre un arreglo ordenado.
binary_search_rec<T,Compare>(a,x,l,r) realiza la búsqueda de x en el arreglo a comprendida entre los límites inferior l y superior r.
La rutina es genérica y utiliza dos parámetros tipo:
La rutina usa el algoritmo de la búsqueda binaria, lo que exige que el arreglo esté ordenado. Esta condición no se verifica en el algoritmo.
El método siempre retorna un entero comprendido entre [l..r]. Si el elemento es encontrado, entonces el valor de retorno es índice donde éste se encuentra; de lo contrario, se retorna el índice donde se insertaría x para que el arreglo estuviese ordenado.
[in] | a | el arreglo sobre el cual realizar la búsqueda. |
[in] | x | el elemento a buscar. |
[in] | l | índice izquierdo de búsqueda. |
[in] | r | índice derecho de búsqueda. |
|
inline |
Ordena un arreglo dinámico por el método de la burbuja.
bubble_sort(a) emplea el método de la burbuja para ordenar el arreglo dinámico de n elementos.
El método de la burbuja tiene un desempeño de . Posiblemente es el método más ineficiente de todos los existentes.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
Hace referencia a Aleph::DynArray< T >::access() y Aleph::DynArray< T >::size().
|
inline |
Cuenta las ocurrencias de los elementos con valor igual a value
.
[in] | beg | iterador al primer elemento del contenedor desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | value | valor a comparar |
value
Hace referencia a Aleph::count_if().
Referenciado por Aleph::inconnected_components(), Aleph::inOrderStack(), Aleph::postOrderStack(), Aleph::preOrderStack(), Aleph::HTList::reverse(), Aleph::ODhashTable< T, Aleph::equal_to< T > >::search(), Aleph::search(), Aleph::simple_preOrderStack(), Aleph::Dlink::split_list() y Aleph::HTList::split_list().
|
inline |
Cuenta las ocurrencias de los elementos cuya operación op
dé cierto.
[in] | beg | iterador al primer elemento del contenedor. |
[in] | end | iterador al último elemento del contenedor. |
[in] | op | operación a efectuar sobre cada elemento. |
Referenciado por Aleph::count().
|
inline |
Búsqueda aleatoria de un elemento en una lista dlink.
dlink_random_search(list,x) se vale del algoritmo de partición del quicksort para buscar el elemento x en la lista list.
El método emplea dos parámetros tipo:
El procedimiento tiene una complejidad esperada de , que es mayor que la mera búsqueda secuencial, pero con el añadido de que luego de la búsqueda la lista queda parcialmente ordenada.
[in,out] | list | lista en la cual se realiza la búsqueda; es parcialmente modificada luego de la búsqueda. |
[in] | x | elemento a buscar. |
Hace referencia a Aleph::Dlink::append(), Aleph::Dlink::concat_list(), Aleph::Dlink::is_empty() y Aleph::Dlink::remove_next().
Dlink* Aleph::dlink_random_select | ( | Dlink & | list, |
const size_t | i, | ||
Compare & | cmp | ||
) |
Selección aleatoria del i-ésimo elemento de una lista basada sobre Dlink.
random_select(list,i) retorna el i-ésimo menor elemento contenido en la lista list según criterio de orden determinado por la clase Compare.
La rutina se sirve de la partición del quicksort para buscar la posición i en tiempo , lo cual es un tiempo substancialmente mejor que el de la búsqueda secuencial ( ).
[in,out] | list | lista donde se buscará el i-ésimo elemento. La lista queda semi-ordenado a través de las sucesivas particiones que se hayan realizado. |
[in] | i | posición que se desea acceder. |
Hace referencia a Aleph::Dlink::append(), Aleph::Dlink::concat_list(), Aleph::Dlink::is_empty() y Aleph::Dlink::remove_next().
void Aleph::faster_heapsort | ( | T * | array, |
const size_t | n | ||
) |
Ordena un arreglo por el método heapsort mejorado.
faster_heapsort(array,n) emplea una versión substancialmente mejorada del heapsort para ordenar el arreglo a de n elementos.
El heapsort tiene un desempeño garantizado de y es estable.
El método emplea dos parámetros tipo:
Una versión sobrecargada faster_heapsort() especializa la comparación al operador "menor que" sobre el tipo T.
[in,out] | array | el arreglo a ordenar. |
[in] | n | la dimensión del arreglo. |
|
inline |
Encuentra el primer elemento de un contenedor cuyo valor sea igual a value
.
[in] | beg | iterador apuntando al primer elemento desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | value | valor a encontrar. predicado. |
Hace referencia a Aleph::find_if().
|
inline |
Encuentra el primer elemento de un contenedor que satisfaga en predicado op
.
[in] | beg | iterador apuntando al primer elemento desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | op | clase que determina si un elemento satisface o no el predicado. |
Referenciado por Aleph::find().
|
inline |
Classic foldl
Let f = operation, init an initial value and container={x1,x2, ... xn}. foldl returns the result of to execute:
f(f(xn, ..., f(x2, f(x1, init))....))
|
inline |
Ejecuta la operación op
sobre cada elemento del contenedor donde esté apuntando los iterador beg
y end
.
[in] | beg | iterador al primer elemento del contenedor desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | op | operación a efectuar sobre cada elemento. |
void Aleph::heapsort | ( | T * | array, |
const size_t | n | ||
) |
Ordena un arreglo por el método heapsort.
heapsort(array,n) emplea el método de heapsort para ordenar el arreglo a de n elementos.
El heapsort tiene un desempeño garantizado de y es estable.
El método emplea dos parámetros tipo:
Una versión sobrecargada heapsort() especializa la comparación al operador "menor que" sobre el tipo T.
[in,out] | array | el arreglo a ordenar. |
[in] | n | la dimensión del arreglo. |
|
inline |
Ordena un arreglo dinámico por el método heapsort.
heapsort(a) emplea el método de heapsort para ordenar el arreglo a de n elementos.
El heapsort tiene un desempeño garantizado de y es estable.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
Hace referencia a Aleph::DynArray< T >::access() y Aleph::DynArray< T >::size().
|
inline |
Inserta un nodo ordenadamente en una lista doblemente enlazada.
insert_sorted(list,p) inserta en una lista basada sobre Dlink el nodo apuntado por p.
El criterio de orden está dado por la clase de comparación Compare.
[in,out] | list | la lista a la cual se le insertará p. |
[in] | p | el nodo a ser insertado. |
Hace referencia a Aleph::Dlink::append() y Aleph::Dlink::Iterator::next().
|
inline |
Ordena un arreglo por el método de inserción.
insertion_sort(a,l,r) emplea el método de selección para ordenar el arreglo a entre los índices l y r.
El método de inserción tiene un desempeño de . Es un método simple, por lo que consume poco tiempo constante. En promedio realiza la mitad de los intercambios que el método de selección. Su tiempo tiende a ser lineal si el arreglo está semi-ordenado. Es un buen método para arreglos pequeños y para particiones realizadas por métodos superiores pero con mayores tiempos constantes.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice izquierdo del arreglo. |
[in] | r | índice derecho del arreglo. |
|
inline |
Ordena según el método de inserción una lista basada en Dlink.
insertion_sort(list) ordena según el método de inserción la lista enlazada list basada en una derivación de Dlink.
El método de inserción tiene un desempeño de .
[in,out] | list | la lista a ordenar. |
Hace referencia a Aleph::Dlink::is_empty() y Aleph::Dlink::remove_next().
|
inline |
Ordena un arreglo dinámico por el método de inserción.
insertion_sort(a) emplea el método de selección para ordenar el arreglo dinámico a.
El método de inserción tiene un desempeño de . Es un método simple, por lo que consume poco tiempo constante. En promedio realiza la mitad de los intercambios que el método de selección. Su tiempo tiende a ser lineal si el arreglo está semi-ordenado. Es un buen método para arreglos pequeños y para particiones realizadas por métodos superiores pero con mayores tiempos constantes.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice izquierdo de la árte del arreglo que se desea ordenar |
[in] | r | índice derecho de la parte del arreglo que se desea ordenar. |
Hace referencia a Aleph::DynArray< T >::access().
|
inline |
Retorna true si el rango [beg1,end1) es menor lexicográficamente que el rango [beg2,end2) según el criterio de comparación op.
|
inline |
This is the classic map on a sequence.
Return a new container with each element of container mapped to the result of operation(item)
|
inline |
Retorna el mayor elemento del contenedor que involucra a los iteradores.
[in] | beg | iterador apuntando al primer elemento desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | op | clase de comparación |
Hace referencia a Aleph::min_element().
|
inline |
Mezcla dos particiones ordenadas almacenadas en un arreglo.
merge() asume como entrada dos particiones ordenadas entre los rangos [l..m] y [m+1..r] y las mezcla en un ordenamiento entre [l..r].
[in] | a | el arreglo |
[in] | l | índice izquierdo del arreglo |
[in] | m | centro del arreglo, de la partición |
[in] | r | índice derecho del arreglo |
|
inline |
Mezcla dos listas ordenadas en una sola.
merge_lists(l1,l2,result) toma dos listas ordenadas l1 y l2 y las fusiona en una sola lista ordenada result según criterio de comparación Compare.
No se verifica si las listas l1 y l2 están ordenadas. Resultados serán incorrectos si no se cumple esta premisa.
[in,out] | l1 | una lista ordenada a fusionar. |
[in,out] | l2 | una lista ordenada a fusionar. |
[out] | result | la lista donde se colocará el resultado. |
|
inline |
Mezcla dos listas ordenadas de tipo Dnode en una sola.
merge_lists(l1,l2,result) toma dos listas ordenadas l1 y l2 y las fusiona en una sola lista ordenada result según criterio de comparación Compare.
No se verifica si las listas l1 y l2 están ordenadas. Resultados serán incorrectos si no se cumple esta premisa.
[in,out] | l1 | una lista ordenada a fusionar. |
[in,out] | l2 | una lista ordenada a fusionar. |
[out] | result | la lista donde se colocará el resultado. |
|
inline |
Ordena un arreglo por el método de mezcla.
mergesort(a,l,r) ordena el arreglo a entre los índices l y r según el método de mezcla según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Compare: clase de comparación.
Este método tiene un desempeño de , pero un consumo de espacio de .
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice inferior. |
[in] | r | índice superior. |
|
inline |
Ordena una lista según el método de mezcla (mergesort).
Ordena mediante el método de mezcla (mergesort) una lista basada en Dlink, según criterio de comparación Compare.
Este método tiene un desempeño determinista de y un consumo de espacio de . Es un muy buen método para listas.
[in,out] | list | la lista a ser ordenada. |
|
inline |
Ordena una lista según el método de mezcla (mergesort).
Ordena mediante el método de mezcla (mergesort) una lista basada en Dnode<T>, según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño determinista de y un consumo de espacio de . Es un muy buen método para listas.
[in,out] | list | la lista a ser ordenada. |
|
inline |
Ordena una lista dinámica según el método de mezcla (mergesort).
Ordena mediante el método de mezcla (mergesort) una lista dinámica según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño determinista de y un consumo de espacio de . Es un muy buen método para listas.
[in,out] | list | la lista a ser ordenada. |
|
inline |
Retorna el menor elemento del contenedor que involucra a los iteradores.
[in] | beg | iterador apuntando al primer elemento desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | op | clase de comparación |
Referenciado por Aleph::max_element().
|
inline |
Ordena un arreglo por el método quicksort sin recursión.
quicksort_rec(a,l,r) ordena el arreglo a entre los índices l y r según el método quicksort según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
Esta versión de quicksort puede ocupar espacio . Utilice quicksort_rec_min() si se desea garantizar un consumo máximo de espacio de en detrimento de un poco más de tiempo constante.
El quicksort es un método probabilístico. En un muy mal caso -muy mala suerte- puede degradarse a . Para paliar, en la medida de la suerte, los malos casos, use quicksort_insertion() que ejecuta heurísticas para paliar los malos casos e invoca al método de inserción para particiones del arreglo pequeñas.
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice inferior. |
[in] | r | índice superior. |
Hace referencia a Aleph::FixedStack< T >::pop(), Aleph::FixedStack< T >::push() y Aleph::FixedStack< T >::size().
Referenciado por Aleph::Map_Matrix_Graph< GT, SA >::copy_list_graph().
void Aleph::quicksort | ( | Dlink & | list, |
Compare & | cmp | ||
) |
Ordena una lista enlazada por el método quicksort.
quicksort(list) ordena una lista según el método quicksort según criterio de comparación Compare.
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
[in,out] | list | la lista a ordenar. |
Hace referencia a Aleph::Dlink::append(), Aleph::Dlink::concat_list(), Aleph::Dlink::is_empty(), Aleph::Dlink::is_unitarian_or_empty() y Aleph::Dlink::remove_next().
void Aleph::quicksort | ( | Dnode< T > & | list, |
Compare & | cmp | ||
) |
Ordena una lista por el método quicksort.
quicksort(list) ordena una lista mediante el método quicksort según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
Esta primitiva puede usarse para listas de tipo Dlist y DynDlist.
[in,out] | list | la lista a ordenar. |
|
inline |
Ordena un arreglo dinámico por el método quicksort sin recursión.
quicksort(a) ordena el arreglo dinámico según el método quicksort según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
Esta versión de quicksort ocupa espacio máximo de .
El quicksort es un método probabilístico. En un muy mal caso -muy mala suerte- puede degradarse a . Para paliar, en la medida de la suerte, los malos casos, use quicksort_insertion() que ejecuta heurísticas para paliar los malos casos e invoca al método de inserción para particiones del arreglo pequeñas.
[in,out] | a | el arreglo a ordenar. |
Hace referencia a Aleph::FixedStack< T >::is_empty(), Aleph::FixedStack< T >::pop() y Aleph::DynArray< T >::size().
|
inline |
Ordena un arreglo por el método quicksort mejorado.
quicksort_insertion(a,l,r) ordena el arreglo a entre los índices l y r según el método quicksort según criterio de comparación Compare.
El procedimiento combina diversas técnicas para acelerar el ordenamiento y a la vez evitar degradación por malos casos.
Los malos casos son tratados mediante una selección del pivote consistente de la mediana entre l, r y el centro de la partición.
Para asegurar un consumo máximo de pila de , el método siempre procede recursivamente a ordenar la partición más pequeña.
Cuando la partición alcanza un tamaño menor o igual a la constante global Aleph::Insertion_Threshold, entonces la partición es ordenada por el método de inserción, el cual es más rápido que el quicksort para tamaños pequeños.
El método emplea dos parámetros tipo:
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice inferior. |
[in] | r | índice superior. |
|
inline |
Ordena un arreglo por el método quicksort.
quicksort_rec(a,l,r) ordena el arreglo a entre los índices l y r según el método quicksort según criterio de comparación Compare.
El método emplea dos parámetros tipo:
Este método tiene un desempeño esperado de y es considerado el método de ordenamiento más veloz.
Esta versión de quicksort puede ocupar espacio . Utilice quicksort_rec_min() si se desea garantizar un consumo máximo de espacio de en detrimento de un poco más de tiempo constante.
El quicksort es un método probabilístico. En un muy mal caso -muy mala suerte- puede degradarse a . Para paliar, en la medida de la suerte, los malos casos, use quicksort_insertion() que ejecuta heurísticas para paliar los malos casos e invoca al método de inserción para particiones del arreglo pequeñas.
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice inferior. |
[in] | r | índice superior. |
|
inline |
Ordena un arreglo según el método quicksort con mínimo consumo de espacio.
El quicksort puramente recursivo puede consumir pila proporcional al tamaño del arreglo a ordenar. Para evitar este problema, en detrimento de un ligero coste de ejecución, quicksort_rec_min() siempre ordena de primero la partición más pequeña. Por los demás, las mismas consideraciones que para quicksort_rec() aplican.
[in,out] | a | el arreglo a ordenar. |
[in] | l | índice inicial por donde se ordena. |
[in] | r | índice final por donde se ordena. |
|
inline |
Búsqueda aleatoria de un elemento en un arreglo.
random_search(a,x,l,r) se vale del algoritmo de partición del quicksort para buscar el elemento x en el arreglo a comprendido entre los límites l y r.
El método emplea dos parámetros tipo:
Compare: clase de comparación.
El procedimiento tiene una complejidad esperada de , que es mayor que la mera búsqueda secuencial, pero con el añadido de que luego de la búsqueda el arreglo queda parcialmente ordenado y, puesto que la selección del pivote es la mediana entre l, r y el centro del arreglo, la búsqueda tiende a ser lineal a medida que se hacen más búsquedas aleatorias.
[in,out] | a | arreglo a buscar; es parcialmente modificado luego de la búsqueda. |
[in] | x | elemento a buscar. |
[in] | l | índice inferior de comienzo de la búsqueda. |
[in] | r | índice superior de término de la búsqueda. |
Dnode<T>* Aleph::random_search | ( | Dlink & | list, |
const T & | x, | ||
Compare & | cmp | ||
) |
Búsqueda aleatoria de un elemento en una lista Dnode<T>.
random_search(list,x) se vale del algoritmo de partición del quicksort para buscar el elemento x en la lista list.
El método emplea dos parámetros tipo:
El procedimiento tiene una complejidad esperada de , que es mayor que la mera búsqueda secuencial, pero con el añadido de que luego de la búsqueda la lista queda parcialmente ordenada.
Una especialización usa la relación "menor que" como criterio de comparación y ahorra la escritura de esa clase.
[in,out] | list | lista en la cual se realiza la búsqueda; es parcialmente modificada luego de la búsqueda. |
[in] | x | elemento a buscar. |
|
inline |
Búsqueda aleatoria de un elemento en una lista dinámica.
random_search(list,x) se vale del algoritmo de partición del quicksort para buscar el elemento x en la lista dinámica list.
El método emplea dos parámetros tipo:
El procedimiento tiene una complejidad esperada de , que es mayor que la mera búsqueda secuencial, pero con el añadido de que luego de la búsqueda la lista queda parcialmente ordenada.
Una especialización usa la relación "menor que" como criterio de comparación y ahorra la escritura de esa clase.
[in,out] | list | lista dinámica en la cual se realiza la búsqueda; es parcialmente modificada luego de la búsqueda. |
[in] | x | elemento a buscar. |
const T& Aleph::random_select | ( | T * | a, |
const int | i, | ||
const int | n, | ||
Compare & | cmp | ||
) |
Selección aleatoria del i-ésimo elemento de un arreglo.
random_select(a,i,n) retorna el i-ésimo menor elemento contenido en el arreglo a de dimensión n.
La rutina se sirve de la partición del quicksort para buscar la posición i en tiempo , lo cual es un tiempo substancialmente mejor que el de la búsqueda secuencial ( ).
El método emplea dos parámetros tipo:
[in,out] | a | arreglo donde se buscará el i-ésimo elemento. El arreglo queda semi-ordenado a través de las sucesivas particiones que se hayan realizado. |
[in] | i | posición que se desea acceder. |
[in] | n | dimensión del arreglo |
out_of_range | si i es mayor o igual a n. |
Dnode<T>* Aleph::random_select | ( | Dlink & | list, |
const size_t | i, | ||
Compare & | cmp | ||
) |
Selección aleatoria del i-ésimo elemento de una lista basada sobre Dlink.
random_select(list,i) retorna el i-ésimo menor elemento contenido en la lista list.
La rutina se sirve de la partición del quicksort para buscar la posición i en tiempo , lo cual es un tiempo substancialmente mejor que el de la búsqueda secuencial ( ).
El método emplea dos parámetros tipo:
[in,out] | list | lista donde se buscará el i-ésimo elemento. La lista queda semi-ordenado a través de las sucesivas particiones que se hayan realizado. |
[in] | i | posición que se desea acceder. |
T* Aleph::random_select | ( | DynDlist< T > & | list, |
const size_t | i, | ||
Compare & | cmp | ||
) |
Selección aleatoria del i-ésimo elemento de una lista dinámica.
random_select(list,i) retorna el i-ésimo menor elemento contenido en la lista dinámica list.
La rutina se sirve de la partición del quicksort para buscar la posición i en tiempo , lo cual es un tiempo substancialmente mejor que el de la búsqueda secuencial ( ).
El método emplea dos parámetros tipo:
[in,out] | list | lista dinámica donde se buscará el i-ésimo elemento. La lista queda semi-ordenado a través de las sucesivas particiones que se hayan realizado. |
[in] | i | posición que se desea acceder. |
|
inline |
Búsqueda de subrangos.
Esta función busca entre el rango dado beg
y end
la primera ocurrencia exacta del subrango searchBeg
y searchEnd
.
De encontrarse una ocurrencia del subrango, la rutina retorna un iterador posicionado en el primer elemento de la primera ocurrencia del subrango. De lo contrario, el iterador de retorno es end
.
Para comparar los elementos entre contenedores, la rutina invoca a la clase predicado op
de la siguiente manera
Donde beg
es la posición actual del rango de búsqueda y pivot
es la posición actual en el subrango.
Nótese que el rango en el cual se busca y el subrango a buscar no sólo pueden referir a contenedores diferentes, sino, también de tipos distintos. Por ejemplo, [beg, end)
podría set a un contenedor de tipo set
, mientras que [searchBeg, searchEnd)
a un contenedor de tipo vector
.
[in] | beg | iterador apuntando al primer elemento del contenedor desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | searchBeg | iterador apuntando al primer elemento del subrango a buscar. |
[in] | searchEnd | iterador al último elemento del subrango a buscar. |
[in] | op | operación de comparación entre elementos de un rango. |
end
.Hace referencia a Aleph::count().
Referenciado por Aleph::OLhashTable< std::pair< Key, Data >, Cmp >::remove() y Aleph::DynHashTable< std::pair< Key, Data >, Cmp, LhashTable >::search().
|
inline |
Búsqueda genérica de un elemento extremo en una lista de nodos Dlink.
search_extreme(list) busca secuencialmente en la lista de nodos list el elemento extremo, mínimo o máximo según el criterio de comparación Compare.
[in] | list | la lista sobre la cual realizar la búsqueda. |
|
inline |
Búsqueda genérica en un arreglo de un elemento extremo.
search_extreme(a, l, r) busca secuencialmente en el arreglo a, entre los índices l y r, el elemento extremo, mínimo o máximo según el criterio de comparación Compare.
[in] | a | el arreglo sobre el cual realizar la búsqueda. |
[in] | l | índice de comienzo de la búsqueda. |
[in] | r | índice de término de la búsqueda. |
|
inline |
Búsqueda genérica de un elemento extremo en una lista de nodos (Dlist<T>).
search_extreme(list) busca secuencialmente en la lista de nodos list el elemento extremo, mínimo o máximo según el criterio de comparación Compare.
[in] | list | la lista sobre la cual realizar la búsqueda. |
Hace referencia a Aleph::Dnode< T >::get_data().
|
inline |
Búsqueda genérica en un arreglo dinámico de un elemento extremo.
search_extreme(a, l, r) busca secuencialmente en el arreglo a, entre los índices l y r, el elemento extremo, mínimo o máximo según el criterio de comparación Compare.
[in] | a | el arreglo sobre el cual realizar la búsqueda. |
[in] | l | índice de comienzo de la búsqueda. |
[in] | r | índice de término de la búsqueda. |
Hace referencia a Aleph::DynArray< T >::access().
|
inline |
Retorna el máximo elemento del arreglo a entre l y r.
|
inline |
Retorna el máximo elemento de la lista list.
|
inline |
Retorna el máximo elemento del arreglo a entre l y r.
|
inline |
Retorna el mínimo elemento del arreglo a entre l y r.
|
inline |
Retorna el mínimo elemento de la lista list.
|
inline |
Retorna la posición del primero de los count
elementos consecutivos que se encuentre en el rango beg
y end
para el cual un predicado es cierto.
El predicado es invocado como:
[in] | beg | iterador apuntando al primer elemento del contenedor desde donde se desea iniciar la búsqueda. |
[in] | end | iterador al último elemento del contenedor. |
[in] | count | cantidad de ocurrencias consecutivas que se desea buscar. |
[in] | value | valor específico del elemento a buscar. |
[in] | op | criterio de comparación |
count
ocurrencias.
|
inline |
Ordena un arreglo por el método de selección.
selection_sort(a,n) emplea el método de selección para ordenar el arreglo a de n elementos.
El método de selección tiene un desempeño de . Debido a su simplicidad de implantación, su coste constante es bajo, por lo que es un buen método para arreglos de dimensión muy pequeña.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
[in] | n | la dimensión del arreglo. |
|
inline |
Ordena por el método de selección una lista doblemente enlazada.
selection_sort(list) sobre una lista derivada de Dlink ordena mediante el método de selección la lista list.
La rutina requiere el parámetro tipo Compare que instrumenta la comparación entre los miembros de la lista. Compare se invoca como Compare()(l1,l2), donde l1 y l2 son dos enlaces de tipo Dlink. El usuario es responsable de instrumentar adecuadamente Compare()() de modo que se accedan los campos de interés y se efectúe la comparación.
[in,out] | list | lista a ser ordenada. |
Hace referencia a Aleph::Dlink::append(), Aleph::Dlink::del() y Aleph::Dlink::is_empty().
|
inline |
Ordena una lista enlazada de tipo Dnode<T> mediante el método de selección.
Ordena la lista list, con nodos de tipo Dnode<T> según el método de selección.
El método de selección tiene un desempeño de . Debido a su simplicidad de implantación su coste constante es bajo, por lo que es un buen método para arreglos de dimensión muy pequeña.
El método emplea dos parámetros tipo:
[in,out] | list | ka lista a ser ordenada. |
|
inline |
Ordena un arreglo dinámico por el método de selección.
selection_sort(a) emplea el método de selección para ordenar el arreglo dinámico de n elementos.
El método de selección tiene un desempeño de . Debido a su simplicidad de implantación, su coste constante es bajo, por lo que es un buen método para arreglos de dimensión muy pequeña.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
Hace referencia a Aleph::DynArray< T >::access() y Aleph::DynArray< T >::size().
|
inline |
Búsqueda secuencial sobre un arreglo.
sequential_search(a,x,l,r) busca secuencialmente, en el arreglo a, entre los índices l y r, respectivamente, la primera ocurrencia de x.
La función maneja dos parámetros tipo:
[in] | a | el arreglo sobre el cual se realiza la búsqueda. |
[in] | x | el elemento a buscar. |
[in] | l | índice izquierdo donde comienza la búsqueda. |
[in] | r | índice derecho donde termina la búsqueda. |
|
inline |
Búsqueda secuencial sobre un arreglo dinámico.
sequential_search(a,x,l,r) busca secuencialmente, en el arreglo a, entre los índices l y r, respectivamente, la primera ocurrencia de x.
La función maneja dos parámetros tipo:
Esta versión sobre arreglos dinámicos salta las posiciones que con certeza no han sido escritas. Sin embargo, tómese en consideración que, según el tamaño del bloque, pueden haber entradas no escritas pero circunscritas en direcciones de memoria válidas. En este sentido, es posible que dentro de aquella clase de entradas se encuentre un elemento con valor x.
[in] | a | el arreglo dinámico sobre el cual se realiza la búsqueda. |
[in] | x | el elemento a buscar. |
[in] | l | índice izquierdo donde comienza la búsqueda. |
[in] | r | índice derecho donde termina la búsqueda. |
Hace referencia a Aleph::DynArray< T >::access() y Aleph::DynArray< T >::exist().
|
inline |
Búsqueda secuencial sobre una lista de nodos.
sequential_search(list,x) busca secuencialmente, en la lista de nodos de tipo Dnode<T> list la primera ocurrencia de x.
La función maneja dos parámetros tipo:
[in] | list | la lista sobre el cual se realiza la búsqueda. |
[in] | x | el elemento a buscar. |
|
inline |
Búsqueda secuencial sobre una lista dinámica DynDlist.
sequential_search(list,x) busca secuencialmente, en la lista dinámica list (DynDlist<T>) la primera ocurrencia de x.
La función maneja dos parámetros tipo:
[in] | list | la lista dinámica sobre el cual se realiza la búsqueda. |
[in] | x | el elemento a buscar. |
Hace referencia a Aleph::Dnode< T >::get_data().
|
inline |
Ordena un arreglo dinámico por el método de shell.
shellsort(a) emplea el método de selección para ordenar el arreglo dinámico a.
El método shell tiende a un desempeño de , pero en la práctica es considerablemente menor.
El método emplea dos parámetros tipo:
[in,out] | a | el arreglo a ordenar. |
Hace referencia a Aleph::DynArray< T >::access() y Aleph::DynArray< T >::size().