325 lines
9.2 KiB
TeX
325 lines
9.2 KiB
TeX
\documentclass{article}
|
||
\usepackage{float}
|
||
\usepackage{hyperref}
|
||
\hypersetup{
|
||
pdfborder={0 0 0}
|
||
}
|
||
\usepackage{graphicx}
|
||
\graphicspath{{images/}}
|
||
|
||
\setlength{\parindent}{0pt}
|
||
\setlength{\parskip}{0.6em}
|
||
\linespread{1.08}
|
||
|
||
\title{Outline of EE}
|
||
\author{Seungjun Lee}
|
||
\date{February 22, 2026}
|
||
|
||
\begin{document}
|
||
\maketitle
|
||
|
||
\begin{abstract}
|
||
|
||
\textbf{Title}:
|
||
When Asymptotic Complexity Fails: An Empirical and Cost-Based Study of Binary and Fibonacci Heaps in Python
|
||
|
||
\textbf{RQ}:
|
||
Why does the theoretical asymptotic advantage of Fibonacci heap in Dijkstra’s algorithm not translate into practical runtime improvements in Python implementations?
|
||
|
||
\textbf{Category}:
|
||
Computer Science
|
||
|
||
\end{abstract}
|
||
|
||
\newpage
|
||
\tableofcontents
|
||
\newpage
|
||
|
||
\section{Introduction}
|
||
|
||
\subsection*{Context}
|
||
\begin{itemize}
|
||
\item Dijkstra’s algorithm widely used for shortest path problems
|
||
\item Priority queue choice affects theoretical time complexity
|
||
\item Pure Dijkstra: $O(E+ V^2)$
|
||
\item Binary heap: $O(E \log V)$
|
||
\item Fibonacci heap: $O(E + V \log V)$
|
||
\item Theoretical advantage not clearly observed in practical implementations
|
||
\end{itemize}
|
||
|
||
\subsection*{Outline of argument}
|
||
\begin{itemize}
|
||
\item Graph structure influences decrease-key frequency
|
||
\item Decrease-key frequency determines theoretical advantage
|
||
\item Empirical runtime does not reflect the theory
|
||
\item Operation level cost explains the gap between the thoery and reality
|
||
\end{itemize}
|
||
|
||
\subsection*{Scope}
|
||
\begin{itemize}
|
||
\item Python implementation only
|
||
\item Synthetic directed graphs (using outdegree-based generation)
|
||
\item Lognormal edge weight distribution
|
||
\item Nodes: 2000--16000, density: 0.00015--0.0384, stds: 1000--16000, trials: 200
|
||
\item Single-source single-target shortest path
|
||
\end{itemize}
|
||
|
||
\subsection*{Worthiness}
|
||
\begin{itemize}
|
||
\item Evaluates limits of asymptotic complexity in practice
|
||
\item Provides empirical basis for heap selection
|
||
\item Bridges theory and implementation level cost analysis
|
||
\end{itemize}
|
||
|
||
\section{Theoretical Framework}
|
||
|
||
\begin{itemize}
|
||
\item Formal runtime models:
|
||
\begin{itemize}
|
||
\item $T_B = c_1 E \log V$
|
||
\item $T_F = c_2 E + c_3 V \log V$
|
||
\end{itemize}
|
||
\item Role of decrease-key in Dijkstra
|
||
\item Relation between relax\_success and decrease-key calls
|
||
\item Theoretical crossover condition:
|
||
\[
|
||
T_F < T_B
|
||
\]
|
||
\end{itemize}
|
||
|
||
\section{Methodology}
|
||
|
||
\subsection*{Development}
|
||
\begin{itemize}
|
||
\item Real-world road dataset used to estimate distribution of real-world data
|
||
\item Lognormal parameters derived from real data
|
||
\item Synthetic graph generation with various nodes, density, std
|
||
\item Measurement metrics:
|
||
\begin{itemize}
|
||
\item reached
|
||
\item extract\_min\_calls
|
||
\item relax\_attempts
|
||
\item relax\_success
|
||
\item relax\_success\_ratio
|
||
\item runtime
|
||
\end{itemize}
|
||
\end{itemize}
|
||
|
||
\subsection*{Evidence}
|
||
\begin{itemize}
|
||
\item Experimental configuration
|
||
\begin{verbatim}
|
||
python -V
|
||
Python 3.12.12
|
||
|
||
pip -V
|
||
pip 26.0.1
|
||
|
||
python -c "import platform; print(platform.platform())"
|
||
Linux-6.8.12-17-pve-x86_64-with-glibc2.41
|
||
|
||
lscpu | head
|
||
Architecture: x86_64
|
||
CPU op-mode(s): 32-bit, 64-bit
|
||
Address sizes: 48 bits physical, 48 bits virtual
|
||
Byte Order: Little Endian
|
||
CPU(s): 16
|
||
On-line CPU(s) list: 1-3,8
|
||
Off-line CPU(s) list: 0,4-7,9-15
|
||
Vendor ID: AuthenticAMD
|
||
Model name: AMD Ryzen 7 7700 8-Core Processor
|
||
CPU family: 25
|
||
\end{verbatim}
|
||
\end{itemize}
|
||
|
||
\subsection*{Analysis}
|
||
\begin{itemize}
|
||
\item Justification of parameter intervals
|
||
\item Retain stability by 200 trials
|
||
\end{itemize}
|
||
|
||
\subsection*{Connection}
|
||
\begin{itemize}
|
||
\item Method is the fundament of runtime investigation
|
||
\end{itemize}
|
||
|
||
\section{Real Data Analysis}
|
||
|
||
\subsection*{Development}
|
||
\begin{itemize}
|
||
\item Get real data from DIMACS
|
||
\item Extraction of edge weight distribution
|
||
\item Calculation of mean and std
|
||
\end{itemize}
|
||
|
||
\subsection*{Evidence}
|
||
\begin{itemize}
|
||
\item Edge weight distribition
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{hist_original.png}
|
||
\end{figure}
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{hist_log.png}
|
||
\end{figure}
|
||
\item Summary statistics tableofcontents
|
||
\begin{table}[H]
|
||
\centering
|
||
\begin{tabular}{ll}
|
||
\hline
|
||
Key & Value \\ \hline
|
||
Total edges & 58333344 \\
|
||
Mean & 2950.322 \\
|
||
Std & 4071.694 \\
|
||
Min & 1 \\
|
||
Max & 368855 \\ \hline
|
||
\end{tabular}
|
||
\end{table}
|
||
\end{itemize}
|
||
|
||
\subsection*{Analysis}
|
||
\begin{itemize}
|
||
\item Lognormal approximation calculation
|
||
\item Justification of synthetic distribution parameters
|
||
\end{itemize}
|
||
|
||
\subsection*{Connection}
|
||
\begin{itemize}
|
||
\item Synthetic data is based on real-world data
|
||
\end{itemize}
|
||
|
||
\section{Relationship between variables}
|
||
|
||
\subsection*{Development}
|
||
\begin{itemize}
|
||
\item Density vs relax\_attempts
|
||
\item Sigma vs relax\_success\_ratio
|
||
\item Decrease-key vs speedup
|
||
\end{itemize}
|
||
|
||
\subsection*{Evidence}
|
||
\begin{itemize}
|
||
\item Density vs relax\_attempts plot
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{density_vs_relax_attempts.png}
|
||
\end{figure}
|
||
\item Sigma vs relax\_success\_ratio platform
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{sigma_vs_relax_ratio.png}
|
||
\end{figure}
|
||
\item Decrease-key vs speedup correlation
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{speedup_corr.png}
|
||
\end{figure}
|
||
\end{itemize}
|
||
|
||
\subsection*{Analysis}
|
||
\begin{itemize}
|
||
\item Density increases relax attempts nearly linearly
|
||
\item Higher variance increases relax\_success ratio
|
||
\item Speedup weakly correlated with decrease-key frequency
|
||
\end{itemize}
|
||
|
||
\subsection*{Connection}
|
||
\begin{itemize}
|
||
\item Structural conditions necessary but insufficient for crossover
|
||
\end{itemize}
|
||
|
||
\section{Runtime}
|
||
|
||
\subsection*{Development}
|
||
\begin{itemize}
|
||
\item Multiple linear regression of runtime
|
||
\item Operation level cost estimation
|
||
\end{itemize}
|
||
|
||
\subsection*{Evidence}
|
||
\begin{itemize}
|
||
\item Regression summary table
|
||
\begin{table}[H]
|
||
\small
|
||
\centering
|
||
\begin{tabular}{llllllll}
|
||
\hline
|
||
algorithm & intercept & $coef_{add}$ & $coef_{extract}$ & $coef_{relax}$ & $coef_{decrease}$ \\ \hline
|
||
binary & 0.000492 & -3.496595e-07 & 3.259253e-07 & 9.095429e-08 & 1.702164e-07 \\
|
||
fibonacci & -0.001191 & 7.446706e-07 & 3.938917e-07 & 9.333419e-08 & 1.504052e-06 \\ \hline
|
||
\end{tabular}
|
||
\end{table}
|
||
\item $R^2$ comparison between models
|
||
\begin{table}[H]
|
||
\centering
|
||
\begin{tabular}{lll}
|
||
\hline
|
||
algorithm & $r_2$ & $n_{samples}$ \\ \hline
|
||
binary & 0.980930 & 54801 \\
|
||
fibonacci & 0.980877 & 54801 \\ \hline
|
||
\end{tabular}
|
||
\end{table}
|
||
\end{itemize}
|
||
|
||
\subsection*{Analysis}
|
||
\begin{itemize}
|
||
\item Fibonacci decrease-key cost significantly larger in Python
|
||
\item Constant factors dominate asymptotic differences
|
||
\end{itemize}
|
||
|
||
\subsection*{Connection}
|
||
\begin{itemize}
|
||
\item Explains absence of empirical speedup
|
||
\end{itemize}
|
||
|
||
\section{Deriving the Crossover Condition}
|
||
|
||
\subsection*{Development}
|
||
\begin{itemize}
|
||
\item Substitute empirical coefficients into:
|
||
\[
|
||
T_F < T_B
|
||
\]
|
||
\end{itemize}
|
||
|
||
\subsection*{Evidence}
|
||
\begin{itemize}
|
||
\item Derived inequality expression
|
||
\end{itemize}
|
||
|
||
\subsection*{Analysis}
|
||
\begin{itemize}
|
||
\item Required conditions exceed practical graph scale
|
||
\item Python constant overhead prevents crossover
|
||
\end{itemize}
|
||
|
||
\subsection*{Connection}
|
||
\begin{itemize}
|
||
\item Theoretical superiority does not always linked to practical improvement
|
||
\end{itemize}
|
||
|
||
\section{Conclusion}
|
||
|
||
\subsection*{Conclusion}
|
||
\begin{itemize}
|
||
\item Fibonacci heap does not outperform Binary heap in Python
|
||
\item Operation level costs dominate asymptotic complexity
|
||
\item Crossover condition impractical under tested environment
|
||
\end{itemize}
|
||
|
||
\subsection*{Limitation \& Evaulation}
|
||
\begin{itemize}
|
||
\item Python-only implementation
|
||
\item Synthetic graph model assumptions
|
||
\item No low-level memory/cache analysis
|
||
\end{itemize}
|
||
|
||
\subsection*{Summarize main points}
|
||
\begin{itemize}
|
||
\item Graph structure affects decrease-key frequency
|
||
\item Empirical runtime does not follow asymptotic expectation
|
||
\item Constant factors determine real-world performance
|
||
\end{itemize}
|
||
|
||
\end{document} |