SlideShare a Scribd company logo
1 of 99
Download to read offline
¿Fastware?
Fernando Pelliccioni
componentsprogramming.com/
@ferpelliccioni
fpelliccioni@gmail.com
Búsqueda Lineal
Range find(Range, E)(Range r, E e) {
for (; !r.empty; r.popFront) {
if (r.front == e) break;
}
return r;
}
Código en lenguaje de programación D.
¡Perdón!
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
Versión C++98
(sin especificaciones)
Estructuras de Datos
Lineales
Estructuras de Datos
Lineales
Estructuras de Datos
Lineales
Estructuras de Datos
Lineales
Rangos
Rangos
Rangos
Rangos
half-open ranges
[first, last)
Rangos
Rangos
Rangos
Rangos
char const s[] = “Hello”;
print(begin(s), end(s));
print(s+1, s+4);
> Hello
> ell
>
s:
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
Búsqueda lineal
H e l l o , _ W o r l d !
$
,element:
range
string s = “Hello, World!”;
auto c = find(begin(s), end(s), ','));
print(c, end(s));
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
string s = “Hello, World!”;
auto c = find(begin(s), end(s), '?'));
print(c, end(s));
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
template <typename I, typename T>
I find(I f, I l, T const& x) {
while (f != l && *f != x) ++f;
return f;
}
¿Cómo podemos
mejorar el algoritmo?
Búsqueda Lineal
con Centinela
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
size_t i = 0;
{
scope(exit) r[$ - 1] = c;
for (;; ++i)
if (r[i] == e) break;
}
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
r[$ - 1] = c;
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
H e l l o , _ W o r l d !
$
,element:
range
string s = “Hello, World!”;
auto r = find(s, ',');
print(r);
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d !
$
,element:
range
$ - 1
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d !
$
,element:
range
$ - 1
!c:
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d ,
$
,element:
range
!c:
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ,
$
,
=
range
Range find(Range, E)(Range r, E e) {
...
r[$ - 1] = c;
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
H e l l o , _ W o r l d !
$
$ - 1
!c:
range
string s = “Hello, World!”;
auto r = find(s, '?');
print(r);
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d !
$
?element:
range
$ - 1
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d !
$
?element:
range
$ - 1
!c:
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
H e l l o , _ W o r l d ?
$
?element:
range
!c:
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
size_t i = 0;
for (;; ++i)
if (r[i] == e) break;
H e l l o , _ W o r l d ?
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
r[$ - 1] = c;
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
H e l l o , _ W o r l d !
$
$ - 1
!c:
range
?element:
Range find(Range, E)(Range r, E e) {
...
r[$ - 1] = c;
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
H e l l o , _ W o r l d !
$
?
=
range
Range find(Range, E)(Range r, E e) {
...
r[$ - 1] = c;
if (i + 1 == r.length && c != e)
++i;
return r[i .. $];
}
H e l l o , _ W o r l d !
$
range
¿Qué imprime?
int[] a = [1, 2, 3, 4];
auto r = find(a, 3);
print(r);
int[] a = [1, 2, 3, 4];
auto r = find(a, 3);
print(r);
> [3, 4]
>
Todo muy lindo, ¿no?
¿Qué imprime?
int[] a = [];
auto r = find(a, 3);
print(r);
int[] a = [];
auto r = find(a, 3);
print(r);
> core.exception.RangeError@alexandrescu.d(27):
Range violation
>
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1];
r[$ - 1] = e;
...
}
Range find(Range, E)(Range r, E e) {
auto c = r[$ - 1]; <<<<<<<<<
r[$ - 1] = e;
...
}
¿Qué imprime?
Usando find() sin Centinela
string s = “Hello, World!”;
auto r = find(s, 'W');
print(r);
> World!
>
string s = “Hello, World!”;
auto r = find(s, 'W');
print(r);
¿Qué imprime?
Usando find() con Centinela
string s = “Hello, World!”;
auto r = find(s, 'W');
print(r);
> World!
>
string s = “Hello, World!”;
auto r = find(s, 'W');
print(r);
¿?
> World!
> o, World!
> W, World!
> Xorld!
> X?%$j!
>
Para poder usar
el find() con
Centinela de forma
segura, tengo que
usar mecanismos de
sincronización de Threads
(Mutexes)
Entonces, ¿Es últil
el algoritmo de
búsqueda lineal
con Centinela?
Sí,es útil.
El problema con la
implementación de Andrei
es que está cambiando
la semántica
de un algoritmo conocido,
donde uno no espera que se
modifiquen datos.
Conclusión: Especificar y usar
nombres correctos.
En la próxima charla veremos
como implementarla correctamente
en C++ usando Concepts.
¡Gracias!
Fernando Pelliccioni
componentsprogramming.com/
@ferpelliccioni
fpelliccioni@gmail.com
- Video:
https://www.youtube.com/watch?v=AxnotgLql0k
- Filminas:
http://www.slideshare.net/AndreiAlexandrescu2/accu-keynote-by-andrei-alexandrescu
- Donald Knuth llama a los centinelas "dummy records" y los usa en su
Algorithm Q (Quick sequential search)
The Art of Computer Programming, Vol. 3 "Sorting and Searching",
2nd Edition, Chapter 6.1 "Sequential Searching".
Referencias:

More Related Content

What's hot (18)

IMG
IMGIMG
IMG
 
Diploma DISAM.PDF
Diploma DISAM.PDFDiploma DISAM.PDF
Diploma DISAM.PDF
 
Solucionario 3er parcial mat 103
Solucionario 3er parcial mat 103Solucionario 3er parcial mat 103
Solucionario 3er parcial mat 103
 
Doctor, doctor
Doctor, doctorDoctor, doctor
Doctor, doctor
 
Pertemuan 1 - Algoritma dan Struktur Data 1
Pertemuan 1 - Algoritma dan Struktur Data 1Pertemuan 1 - Algoritma dan Struktur Data 1
Pertemuan 1 - Algoritma dan Struktur Data 1
 
9 Katesismo Grade Sch Private
9 Katesismo Grade Sch Private9 Katesismo Grade Sch Private
9 Katesismo Grade Sch Private
 
Niagara AX Certificate
Niagara AX CertificateNiagara AX Certificate
Niagara AX Certificate
 
Cer 1.PDF
Cer 1.PDFCer 1.PDF
Cer 1.PDF
 
[電子書][道教][符咒]咒符進階
[電子書][道教][符咒]咒符進階[電子書][道教][符咒]咒符進階
[電子書][道教][符咒]咒符進階
 
штатний розпис ОДТРК
штатний розпис ОДТРКштатний розпис ОДТРК
штатний розпис ОДТРК
 
IT engineer's certificate.PDF
IT engineer's certificate.PDFIT engineer's certificate.PDF
IT engineer's certificate.PDF
 
Oracle Database Admin Certified Associate
Oracle Database Admin Certified AssociateOracle Database Admin Certified Associate
Oracle Database Admin Certified Associate
 
Attestation Stage chine
Attestation Stage chineAttestation Stage chine
Attestation Stage chine
 
Nurse_diplom's.PDF
Nurse_diplom's.PDFNurse_diplom's.PDF
Nurse_diplom's.PDF
 
hoda HRM Certificate
hoda HRM Certificatehoda HRM Certificate
hoda HRM Certificate
 
IMG_0006
IMG_0006IMG_0006
IMG_0006
 
شهادة الجامعة الالمانية عدوى
شهادة الجامعة الالمانية عدوىشهادة الجامعة الالمانية عدوى
شهادة الجامعة الالمانية عدوى
 
Certificates (Frank Morgan)
Certificates (Frank Morgan)Certificates (Frank Morgan)
Certificates (Frank Morgan)
 

¿Fastware?