Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass[12pt]{article}
- \usepackage[utf8]{inputenc}
- \usepackage[spanish]{babel}
- \usepackage[pdftex]{graphicx}
- \usepackage{float}
- \usepackage{booktabs}
- \usepackage[table,xcdraw]{xcolor}
- \usepackage{ltxtable}
- \usepackage{listings}
- \lstset{language=Haskell}
- \usepackage{color}
- \begin{document}
- \begin{titlepage}
- \begin{minipage}{2.6cm}
- \includegraphics[width=\textwidth]{fceia.pdf}
- \end{minipage}
- \hfill
- %
- \begin{minipage}{6cm}
- \begin{center}
- \normalsize{Universidad Nacional de Rosario\\
- Facultad de Ciencias Exactas,\\
- Ingeniería y Agrimensura\\}
- \end{center}
- \end{minipage}
- \hspace{0.5cm}
- \hfill
- \begin{minipage}{2.6cm}
- \includegraphics[width=\textwidth]{unr.pdf}
- \end{minipage}
- \vspace{0.5cm}
- \begin{center}
- \normalsize{\sc Estructuras de Datos II}\\
- \vspace{0.5cm}
- \large{Trabajo Práctico II}\\
- \Large{\bf Secuencias}\\
- \vspace{5cm}
- \normalsize
- Román Castellarin\\
- Juan Ignacio Suarez\\
- \vspace*{0.5cm}
- \small{ \today }
- \end{center}
- \end{titlepage}
- \newpage
- \section{Implementacion basada en Arrays Persistentes}
- \begin{tabular}{@{}lcc@{}}
- \toprule
- & W & S \\ \midrule
- filterS p x & $O(|x| + \sum\limits_{i=0}^{|x|-1} W[p\ x_i])$ & $(\log |x| + \max\limits_{i=0}^{|x|-1} S[p\ x_i])$ \\
- reduceS f e s & $ O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ & $ O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ \\
- scanS & $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} W[x\oplus y])$ & $O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} S[x\oplus y])$ \\
- showtS & $O(1)$ & $O(1)$ \\ \bottomrule
- \end{tabular}
- \subsection{filterA es $O(|x| + \sum\limits_{i=0}^{|x|-1} W[p\ x_i])$ en trabajo.\\ y $O(\log |x| + \max\limits_{i=0}^{|x|-1} S[p\ x_i])$ en profundidad.}
- \begin{table}[h]
- \begin{lstlisting}
- filterA p x = A.flatten (mapA g x)
- where g y = if p y then singletonA y else emptyA
- \end{lstlisting}
- \caption{Definicion de filterA}
- \end{table}
- \begin{table}[h]
- \begin{lstlisting}
- emptyA = A.fromList []
- singletonA x = A.fromList [x]
- mapA f x = A.tabulate g (A.length x)
- where g n = f (x ! n)
- \end{lstlisting}
- \caption{Definicion de emptyA, singletonA y mapA}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} \texttt{singletonA} y \texttt{emptyA} son $O(1)$ en trabajo y profundidad.
- \textit{Dem:} Ambas hacen una cantidad constante de operaciones independientemente de la entrada.
- \item \textbf{Lema:} \texttt{mapA f s} es $O( \sum\limits_{i=0}^{|s|-1} W[f\ s_i] )$ en trabajo y $O( \max\limits_{i=0}^{|s|-1} S[f\ s_i] )$ en profundidad.
- \textit{Dem:} Se desprende como corolario de las cotas de \texttt{tabulate g n} con $g\ i = f\ s_i$ y $n=|s|$.
- \end{itemize}
- Concentremonos en la definicion de \texttt{filterA} presentada arriba:
- \begin{itemize}
- \item Del primer lema, resulta que $W[g\ y]\in O(W[p\ y])$ y $S[g\ y]\in O(S[p\ y])$.
- \item Del segundo lema, resulta que \texttt{map\ g\ x} es $O(\sum\limits_{i=0}^{|x|-1} W[p\ x_i])$ en trabajo y $O(\max\limits_{i=0}^{|x|-1} S[p\ x_i])$ en profundidad.
- \item Es necesario calcular primero \texttt{map\ g\ x} para luego aplicar el \texttt{flatten}, por lo que las profundidades y trabajos se suman ya que no se realizan en paralelo.
- \item Tenemos entonces por la especificacion dada de \texttt{flatten} que \texttt{filter\ p\ x} es $O(|x| + \sum\limits_{i=0}^{|x|-1} W[p\ x_i])$ en trabajo ya que $|g\ y| \in O(1)$, mientras que en profundidad es $O(\log |x| + \max\limits_{i=0}^{|x|-1} S[p\ x_i])$.
- \end{itemize}
- \subsection{reduceA es $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ en trabajo,\\
- y $ O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ en profundidad.}
- Utilizaremos $\mathcal{O}_r(\oplus,e,s)$ para denotar el conjunto de aplicaciones de $\oplus$ al invocar \texttt{reduceA $\oplus$ e s}. Notemos que para reducir una secuencia de largo $n$ por aplicacion repetida de $\oplus$ (en cualquier orden) hacen falta $n-1$ aplicaciones, por lo que cardinalidad de este conjunto es $O(|s|)$.
- Para el analisis general de costo, supondremos primero que $W[x \oplus y]$ es $O(1)$, y luego deduciremos el caso general.
- \begin{table}[h!]
- \begin{lstlisting}
- reduceA f e s = case A.length s of
- 0 -> e
- _ -> f e (reduceByContraction f s)
- where reduceByContraction f s = case A.length s of
- 1 -> s ! 0
- _ -> reduceByContraction f (contractA f s)
- \end{lstlisting}
- \caption{Definicion de reduceA}
- \end{table}
- \begin{table}[h!]
- \begin{lstlisting}
- contractA f s | n == 1 = s
- | even n = A.tabulate g (n//2)
- | otherwise = A.tabulate g' (n//2 + 1)
- where n = A.length s
- g i = f (s ! (2*i)) (s ! (2*i + 1))
- g' i = if i == (n//2) then s ! (2*i) else g i
- \end{lstlisting}
- \caption{Definicion de contractA}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} Para $W_\oplus,S_\oplus \in O(1)$, \texttt{contractA $\oplus$ s} es $O(|s|)$ en trabajo y $O(1)$ en profundidad:
- \textit{Dem:} Corolario de las cotas de \texttt{tabulate g n} con $g\ i = s_{2i}\oplus s_{2i+1}$ y $n\in O(|s|)$.
- \end{itemize}
- \begin{itemize}
- \item Veamos que como \texttt{contract} reduce la longitud de la secuencia en un factor de $1/2$, \texttt{reduceByContraction} solo recursa $O(\log |s|)$ veces, y por lo tanto (usando el lema anterior) resulta $O(\log |s|)$ en profundidad.\\
- En simbolos: $S(n) = S(n/2) + O(1) \Rightarrow S \in O(\log n)$
- \item Para el trabajo, (usando el lema anterior) veamos que obtenemos una serie geometrica, por lo que resulta $O(|s|)$.\\
- En simbolos: $W(n) = W(n/2) + O(n) \Rightarrow S \in O(n)$
- \end{itemize}
- Para una especificacion de costos general, notemos que solo debemos agregarle al trabajo obtenido, el trabajo de cada operacion ($x\oplus y$) hecho, y la profundidad no puede empeorar mas que en un factor $\max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y]$.
- Por lo que finalmente obtenemos:
- $$O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$$ en trabajo, y
- $$ O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$$ en profundidad.
- \subsubsection{scanA es $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} W[x\oplus y])$ en trabajo,\\
- y $ O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} S[x\oplus y])$ en profundidad.}
- \begin{table}[h]
- \begin{lstlisting}
- scanA f e s = (scan_seq, scan_last)
- where (scan_seq, scan_last) = (scanA' f e s) ||| (reduceA f e s)
- scanA' f e s = case A.length s of
- 0 -> emptyA
- 1 -> singletonA e
- n -> tabulateA g n
- where s' = scanA' f e (contractA f s)
- g i | even i = s' ! (i//2)
- | otherwise = f (s' ! (i//2)) (s ! (i-1))
- \end{lstlisting}
- \caption{Definicion de scanA}
- \end{table}
- Analogamente a como hicimos para el analisis de reduceA, supondremos primero que $\oplus$ es $O(1)$ en trabajo y profundidad, y consideraremos el conjunto $\mathcal{O}_s(\oplus,e,s)$ de aplicaciones de $\oplus$ al invocar \texttt{scanS $\oplus$ e s}.
- \begin{itemize}
- \item \textbf{Lema:} Para $W_\oplus,S_\oplus \in O(1)$, \texttt{scanA' $\oplus$ e s} es $O(|s|)$ en trabajo y $O(\log |s|)$ en profundidad.
- \textit{Dem:} De manera similar al analisis de reduceA, vemos que la recurrencia para el trabajo es $W(n) = W(n/2) + O(n)$, donde el $O(n)$ viene del trabajo de \texttt{tabulateA} y \texttt{contractA}, y el $W(n/2)$ del trabajo de la llamada recursiva (contractA reduce en un factor de 1/2 la secuencia). De donde el trabajo resulta $O(|s|)$. De la misma forma, la recurrencia para la profundidad es $S(n) = S(n/2) + O(1)$ donde el $O(1)$ viene de la profundidad de \texttt{contractA} y \texttt{tabulateA}, ambas $O(1)$. Resulta asi una profundidad de $O(\log |s|)$
- \end{itemize}
- Realicemos ahora un analisis general de costos.
- \begin{itemize}
- \item Veamos que \texttt{scanA} consiste esencialmente de dos llamadas en paralelo, una a \texttt{scanA'} y otra a \texttt{reduceA}.
- \item Es muy importante notar que por esta razon, $\mathcal{O}_r(\oplus,e,s) \subseteq \mathcal{O}_s(\oplus,e,s)$
- \item Por lo ya demostrado arriba, el trabajo de \texttt{scanA} queda $O(W[scanA'] + W[reduceA]) =$ $$O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} W[x\oplus y])$$
- \item Para la profundidad, obtenemos $O(\max (S[scanA'], S[reduceA])) = $ $$O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_s(\oplus,e,s)} S[x\oplus y])$$
- \end{itemize}
- \subsubsection{showtA es $O(1)$ en trabajo y profundidad.}
- \begin{table}[h]
- \begin{lstlisting}
- showtA x | n == 0 = EMPTY
- | n == 1 = ELT (x ! 0)
- | otherwise = NODE (takeA x m) (dropA x m)
- where n = A.length x
- m = n//2
- \end{lstlisting}
- \caption{Definicion de showtA}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} \texttt{takeA, dropA} son $O(1)$ en trabajo y profundidad.
- \textit{Dem:} Corolario de las cotas de \texttt{subArray}.
- \end{itemize}
- \texttt{showtA} realiza una cantidad constante de operaciones ya que no recursa e invoca funciones que realizan trabajo y profundidad constante.
- \section{Implementacion basada en Listas}
- \begin{tabular}{@{}lcc@{}}
- \toprule
- & W & S \\
- \midrule
- filterS & $O(|s| + \sum\limits_{i=0}^{|s|-1} W[f\ s_i])$ & $O(|s| + \max\limits_{i} S[f\ s_i] )$ \\
- showtS & $O(|s|)$ & $O(|s|)$ \\
- reduceS & $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ & $O(|s| + \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ \\
- scanS & $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ & $O(|s| + \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ \\
- \bottomrule
- \end{tabular}
- \subsection{filterL es $O(|s| + \sum\limits_{i=0}^{|s|-1} W[f\ s_i])$ en trabajo, y $O(|s| + \max\limits_{i} S[f\ s_i] )$ prof.}
- \begin{table}[h]
- \begin{lstlisting}
- filterL f [] = []
- filterL f (x:xs) =
- let (x',xs') =
- (if f x then [x] else []) ||| (filterL f xs)
- in x'++xs'
- \end{lstlisting}
- \caption{Definicion de filterL}
- \end{table}
- \begin{itemize}
- \item \textbf{Trabajo de filterL:}
- Teniendo como segundo argumento el largo de la secuencia $s$:
- $$ W_{filterL}(f, 0) = c_0 $$
- $$ W_{filterL}(f, n) = 1 + ( 1 + W(if\ f\ s_0\ then\ [x]\ else\ []) + W_{filterL}(f, n-1) ) + W(x'++xs') = $$
- Como el costo de 'if' es constante (además de construir el resultado), vemos rápidamente que el costo de esta primer expresión es $W(f\ s_0) + k$.
- Además, siendo $x'$ la asignación de este resultado, vemos que $x'++xs'$ también será de costo constante pues $x'$ será $[]$ o $[x]$ y la función $++$ depende del tamaño del primer argumento. Siguiendo:
- $$ = c_1 + W(f\ s_0) + W_{filterL}(f, n-1) = ... = \sum\limits_{i=0}^{n-1} c_i + \sum\limits_{i=0}^{n-1} W[f\ s_i] $$
- Donde se desprende $\sum\limits_{i=0}^{n-1} c_i$ de orden lineal más la sumatoria de costos de $f$ en los valores de la secuencia. Es decir:
- $$ W_{filterL} \in O(n + \sum\limits_{i=0}^{n-1} W[f\ s_i] ) = O(|s| + \sum\limits_{i=0}^{|s|-1} W[f\ s_i]) $$
- \item \textbf{Profundidad de filterL:}
- Similar a como analizamos el trabajo, tenemos:
- $$ S_{filterL}(f, 0) = c_0 $$
- $$ S_{filterL}(f, n) = 1 + ( 1 + max\{ S(if\ f\ s_0\ then\ [x]\ else\ []), S_{filterL}(f, n-1)\} ) + S(x'++xs') = $$
- Así como sucedía con el costo también sucede con la profundidad, en el caso del 'if' también tenemos $S(f\ s_0) + k$ y la profundidad de $++$ seguirá siendo constante. Siguiendo:
- $$ = c_1 + max\{ S(f\ s_0), S_{filterL}(f, n-1) \} = $$
- $$ = c_1 + max\{ S(f\ s_0), c_2 + max\{S(f\ s_1), S_{filterL}(f, n-2) \} \} \ (1) $$
- Sea $S_f$ tal que $S_f = \max\limits_{0<=i<n} S(f\ s_i)$.
- Volviendo a $(1)$, reemplazando con $S_f$ nos queda:
- $$ (1) \leq $$
- $$ c_1 + max\{ S_f, c_2 + max\{S_f, S_{filterL}(f, n-2) \} \} \leq $$
- $$ c_1 + max\{ S_f, c_2 + max\{S_f, ... max\{ S_f, c_0 \} ... \} \} = $$
- Considerando el peor caso $c_0 < S_f$, esto resulta en:
- $$ = \sum\limits_{i=0}^{n-1} c_i + S_f $$
- Nuevamente se desprende de la primer sumatoria un orden lineal, sumado a $S_f$, el cual por definición era el máximo $S(f\ s_i)$ para algún $i$. Por lo tanto:
- $$ S_{filterL} \in O(n + \max\limits_{i} S[f\ s_i] ) = O(|s| + \max\limits_{i} S[f\ s_i] ) $$
- \end{itemize}
- \subsection{showtL es $O(|s|)$ en trabajo, y $O(|s|)$ prof.}
- \begin{table}[h]
- \begin{lstlisting}
- showtL [] = EMPTY
- showtL [x] = ELT x
- showtL s = let mid = div (lengthL s) 2
- (l,r) = (takeL s mid) ||| (dropL s mid)
- in NODE l r
- \end{lstlisting}
- \caption{Definicion de showtL}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} \texttt{takeL y dropL} son $O(|s|)$ en trabajo y $O(|s|)$ en profundidad.
- \textit{Dem:} Se desprende de la definción $takeL\ s\ n = take\ n\ s$, $dropL\ s\ n = drop\ n\ s$, y la documentación oficial de las mismas.
- \item \textbf{Trabajo y profundidad de showtL:}
- Notar que EMPTY y ELT son constructores de TreeView, por lo que tienen trabajo y profundidad constante. Resulta instantáneo el análisis del trabajo:
- $$ W_{showtL}(0) = c_0 $$
- $$ W_{showtL}(1) = c_1 $$
- $$ W_{showtL}(n) = 1 + W_{takeL}(n/2) + W_{dropL}(n/2) $$
- $$ W_{showtL}(n) = c_2 + W_{takeL}(n/2) + W_{dropL}(n/2) $$
- Donde teníamos $W_{takeL} \in O(|s|)$ y $W_{dropL} \in O(|s|)$, por lo tanto:\\
- $$ W_{showtL} \in O(|s|) $$
- \item \textbf{Profundidad de showtL:}
- De forma análoga al análisis anterior:
- $$ S_{showtL}(0) = c_0 $$
- $$ S_{showtL}(1) = c_1 $$
- $$ S_{showtL}(n) = 1 + max\{ S_{takeL}(n/2), W_{dropL}(n/2) \} $$
- $$ S_{showtL}(n) = c_2 + max\{ S_{takeL}(n/2), W_{dropL}(n/2) \} $$
- Donde tenemos $S_{takeL} \in O(|s|)$ y $S_{dropL} \in O(|s|) \Rightarrow max\{ S_{takeL}(n/2), W_{dropL}(n/2) \} \in O(|s|)$ Luego:
- $$ S_{showtL} \in O(|s|) $$
- \end{itemize}
- \subsection{reduceL es $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ en trabajo, y $O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ prof.}
- \begin{table}[h]
- \begin{lstlisting}
- reduceL f e [] = e
- reduceL f e [x] = f e x
- reduceL f e s = reduceL f e (contractL f s)
- contractL f [] = []
- contractL f [x] = [x]
- contractL f (x:y:xs) = let (x',xs') = f x y ||| contractL f xs
- in x':xs'
- \end{lstlisting}
- \caption{Definicion de reduceL y contractL}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} \texttt{contractL} es $O(|s| + \sum\limits_{i=0}^{|s|/2} W[s_{2i} \oplus s_{2i+1}])$ en trabajo y $O(|s| + \max\limits_{0 \leq i \leq |s|/2} S[s_{2i} \oplus s_{2i+1}])$ en prof.
- \textit{Dem:}
- De la definición de contractL:
- $$ W_{contractL}(\oplus, 0) = c_0 $$
- $$ W_{contractL}(\oplus, 1) = c_1 $$
- $$ W_{contractL}(\oplus, n) = 1 + W(s_0 \oplus s_1) + W_{contractL}(\oplus, n-2) \leq \sum\limits_{i=0}^{n/2} W[s_{2i} \oplus s_{2i+1}] + \sum\limits_{i=0}^{n/2} c_i $$
- Notar que la longitud de la lista es $n/2 = |s|/2$ pues por cada elemento nuevo quitamos 2 elementos en $n-2$ de la secuencia original en la siguiente recursión. De esto obtenemos un término lineal sumado a el trabajo de aplicar la función en cada par de la secuencia, por lo tanto:
- $$ W_{contractL} \in O(n + \sum\limits_{i=0}^{n/2} W[s_{2i} \oplus s_{2i+1}]) = O(|s| + \sum\limits_{i=0}^{|s|/2} W[s_{2i} \oplus s_{2i+1}]) $$
- Similarmente con la profundidad:
- $$ S_{contractL}(\oplus, 0) = c_0 $$
- $$ S_{contractL}(\oplus, 1) = c_1 $$
- $$ S_{contractL}(\oplus, n) = 1 + max\{ S(s_0 \oplus s_1), S_{contractL}(\oplus, n-2) \} $$
- Donde en cada recurrencia nos quedamos con el máximo $S(s_i \oplus s_j)$ de esa instancia. Podemos acotar este resultado simplemente considerando el máximo $S(s_i \oplus s_j)$ de cualquier aplicación del conjunto $\mathcal{O}_r(\oplus,e,s)$ como cota. Resulta entonces:
- $$ S_{contractL} \in O(|s| + \max\limits_{0 \leq i \leq |s|/2} S[s_{2i} \oplus s_{2i+1}]) $$
- \item \textbf{Trabajo de reduceL:}
- Comenzando con la definición de reduceL:
- $$ W_{reduceL}(\oplus, e, 0) = c_0 $$
- $$ W_{reduceL}(\oplus, e, 1) = W(\oplus\ e\ s_0) $$
- $$ W_{reduceL}(\oplus, e, n) = 1 + W_{contractL}(\oplus, n) + W_{reduceL}(\oplus, e, n/2) = $$
- $$ 1 + W_{contractL}(\oplus\ n) = 1 + ( 1 + W_{contractL}(\oplus, n/2) + W_{reduceL}(\oplus, e, n/4) ) = $$
- $$ ... = c + W_{reduceL}(\oplus, n/2) + ... + W(\oplus\ e\ s_0)\ o\ c_0\ (dependiendo\ de\ la\ paridad) $$
- Como vimos en la implementación con arreglos tenemos $n-1$ aplicaciones en total, y como de la ecuación planteada surge la serie geométrica $n/2 + n/4 + ... + 1 = n-1$ de aplicaciones en elementos distintos (utilizamos los nuevos generados anteriormente) tenemos la suma del trabajo en todas las aplicaciones, además del costo lineal de $contractL$ (y la constante). Es decir:
- $$ W_{reduceL} \in O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y]) $$
- \item \textbf{Profundidad de reduceL:}
- Similarmente al caso anterior:
- $$ S_{reduceL}(\oplus, e, 0) = c_0 $$
- $$ S_{reduceL}(\oplus, e, 1) = W(\oplus\ e\ s_0) $$
- $$ S_{reduceL}(\oplus, e, n) = 1 + max\{ S_{contractL}(\oplus, n), S_{reduceL}(\oplus, e, n/2) \} $$
- Al expandir la expresión obtenemos un $max$ con $\log n = \log |s|$ parámetros, de donde nos quedamos con el máximo $S(s_i \oplus s_j)$ para cada caso. De nuevo, podemos acotarlo eligiendo siempre la máxima aplicación del conjunto $\mathcal{O}_r(\oplus,e,s)$ y nos queda:
- $$ S_{reduceL} \in O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y]) $$
- \end{itemize}
- \subsection{scanL es $O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y])$ en trabajo, y $O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y])$ prof.}
- \begin{table}[h]
- \begin{lstlisting}
- expandL f _ [] = []
- expandL f (x:xs) [y] = [x]
- expandL f (x:xs) (y:y':ys) = x:(f x y):expandL f xs ys
- scanL f e [] = ([], e)
- scanL f e [x] = ([e], f e x)
- scanL f e s = let (l, res) = scanL f e (contractL f s)
- in (expandL f l s, res)
- \end{lstlisting}
- \caption{Definicion de expandL y scanL}
- \end{table}
- \begin{itemize}
- \item \textbf{Lema:} \texttt{expandL} es $(|s| + \sum\limits_{i=0}^{|s|/2} W[cs_{i} \oplus s_{2i}])$ en trabajo y $O(|s| + \max\limits_{0 \leq i \leq |s|/2} S[cs_{i} \oplus s_{2i}])$ en prof.
- \textit{Dem:} De la definición de expandL, donde cs es la secuencia parcial y s es la secuencia original, cn y n sus respectivas longitudes :
- $$ W_{expandL}(\oplus, 0, n) = c_0 $$
- $$ W_{expandL}(\oplus, n, 1) = c_1 $$
- $$ W_{expandL}(\oplus, cn, n) = 1 + W(cs_0 \oplus s_0) + W_{expandL}(\oplus, cn-1, n-2) = ... $$
- $$ ... = c + W(cs_0 \oplus s_0) + W(cs_1 \oplus n_2) + .. + W(cs_{n/2} \oplus s_n) \leq $$
- Entonces:
- $$ W_{expandL} \in O(n + \sum\limits_{i=0}^{n/2} W[cs_{i} \oplus s_{2i}]) = O(|s| + \sum\limits_{i=0}^{|s|/2} W[cs_{i} \oplus s_{2i}]) $$
- Análogamente para la profundidad:
- $$ S_{expandL}(\oplus, 0, n) = c_0 $$
- $$ S_{expandL}(\oplus, n, 1) = c_1 $$
- $$ S_{expandL}(\oplus, cn, n) = 1 + max\{ S(cs_0 \oplus s_0), S_{expandL}(\oplus, cn-1, n-2)\} = ... $$
- De donde resulta:
- $$ S_{expandL} \in O(|s| + \max\limits_{0 \leq i \leq |s|/2} S[cs_{i} \oplus s_{2i}]) $$
- \item \textbf{Trabajo de scanL:}
- De la definición de scanL:
- $$ W_{scanL}(\oplus, e, 0) = c_0 $$
- $$ W_{scanL}(\oplus, e, 1) = c_1 + W[e \oplus x] $$
- $$ W_{scanL}(\oplus, e, n) = c_2 + W_{contractL}(n) + W_{scanL}(\oplus, e, n/2) + W_{expandL}(n/2, n) $$
- Notar que contractL y expandL de hecho tienen la misma estructura y sólo difieren en aplicaciones distintas, y ambos pueden ser acotados superiormente de una forma similar como en reduce: eligiendo la sumatoria de aplicaciones en $\mathcal{O}_r(\oplus,e,s)$, pues cada aplicación de $\oplus$ en cada ejecucion tanto de contractL como expandL es miembro de este conjunto, es decir
- $$ W_{contractL}, W_{expandL} \in O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y]) $$
- Esto nos resulta muy útil porque ahora alteramos el orden de los términos en la ecuación anterior y vemos:
- $$ W_{scanL}(\oplus, e, n) = c_2 + W_{scanL}(\oplus, e, n/2) + ( W_{contractL}(n) + W_{expandL}(n/2, n) ) $$
- Donde observamos la misma estructura que en reduce, con contractL y expandL igualmente acotados. Con el mismo razonamiento anterior de la serie geométrica nos queda:
- $$ W_{scanL} \in O(|s| + \sum\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} W[x\oplus y]) $$
- \item \textbf{Profundidad de scanL:}
- De la definición de scanL:
- $$ S_{scanL}(\oplus, e, 0) = c_0 $$
- $$ S_{scanL}(\oplus, e, 1) = c_1 + S[e \oplus x] $$
- $$ S_{scanL}(\oplus, e, n) = 1 + ( 1 + max\{ S_{scanL}(\oplus, e, n/2), S_{contractL}(\oplus, n/2) \} ) + S_{expandL}(n/2, n) $$
- Con el mismo argumento anterior podemos ver que también acotamos a contractL y expandL:
- $$ S_{contractL}, S_{expandL} \in O(|s| + \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y]) $$
- Y también tenemos $\log s$ recursiones. Por lo tanto:
- $$ S_{scanL} \in O(\log |s|\cdot \max\limits_{(x\oplus y)\in\mathcal{O}_r(\oplus,e,s)} S[x\oplus y]) $$
- \end{itemize}
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement