diff --git a/.gitignore b/.gitignore index 1f72da6..b622f4d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ bin/ compile_commands.json build-*/ +latex.out/ +docs/folien/folien.pdf diff --git a/.nix/flake.nix b/.nix/flake.nix index ff1538c..bd6c1e5 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -22,6 +22,13 @@ qt6.full libGL + # presentation + pandoc + texlive.combined.scheme-full + noto-fonts + latexrun + entr + # pre-commit pre-commit commitizen diff --git a/QVectorSearch/mainwindow.cpp b/QVectorSearch/mainwindow.cpp index 90121a8..9709e98 100644 --- a/QVectorSearch/mainwindow.cpp +++ b/QVectorSearch/mainwindow.cpp @@ -23,6 +23,7 @@ MainWindow::MainWindow(QWidget *parent) setupAlgorithmSelector(); setupWordListSourceSelector(); setupWordList(); + createSelectedFinder(); } MainWindow::~MainWindow() { delete ui; } @@ -79,8 +80,7 @@ void MainWindow::loadWordList(std::filesystem::path path) { void MainWindow::search(const QString &search_term) { if (search_term.isEmpty()) { - result_model_.setStringList(QStringList()); - ui->mainStatusBar->clearMessage(); + clearResults(); return; } @@ -99,6 +99,7 @@ void MainWindow::search(const QString &search_term) { void MainWindow::createSelectedFinder() { auto selectedFinder = ui->searchAlgorithmSelector->currentIndex(); + Timer timer; switch (selectedFinder) { case 0: default: @@ -120,6 +121,12 @@ void MainWindow::createSelectedFinder() { finder_ = std::make_unique(word_list_); break; } + timer.stop(); + + std::stringstream status_message; + status_message << "finder initialized in " << timer << ", " + << word_list_.size() << " words loaded"; + ui->mainStatusBar->showMessage(QString::fromStdString(status_message.str())); } void MainWindow::showResults(const WordRefList &results) { @@ -131,32 +138,37 @@ void MainWindow::showResults(const WordRefList &results) { result_model_.setStringList(ui_results); } +void MainWindow::clearResults() { result_model_.setStringList({}); } + void MainWindow::on_searchInput_textChanged(const QString &search_term) { - QGuiApplication::setOverrideCursor(Qt::WaitCursor); - search(search_term); - QGuiApplication::restoreOverrideCursor(); + // QGuiApplication::setOverrideCursor(Qt::WaitCursor); + // search(search_term); + // QGuiApplication::restoreOverrideCursor(); } void MainWindow::on_searchAlgorithmSelector_currentIndexChanged(int) { QGuiApplication::setOverrideCursor(Qt::WaitCursor); + clearResults(); createSelectedFinder(); - search(ui->searchInput->displayText()); + // search(ui->searchInput->displayText()); QGuiApplication::restoreOverrideCursor(); } void MainWindow::on_wordListSourceSelector_currentIndexChanged(int) { QGuiApplication::setOverrideCursor(Qt::WaitCursor); + clearResults(); setupWordList(); createSelectedFinder(); - search(ui->searchInput->displayText()); + // search(ui->searchInput->displayText()); QGuiApplication::restoreOverrideCursor(); } void MainWindow::on_wordListSizeSelector_valueChanged(int) { QGuiApplication::setOverrideCursor(Qt::WaitCursor); + clearResults(); setupWordList(); createSelectedFinder(); - search(ui->searchInput->displayText()); + // search(ui->searchInput->displayText()); QGuiApplication::restoreOverrideCursor(); } diff --git a/QVectorSearch/mainwindow.h b/QVectorSearch/mainwindow.h index 9736b75..f686664 100644 --- a/QVectorSearch/mainwindow.h +++ b/QVectorSearch/mainwindow.h @@ -37,6 +37,7 @@ private: void search(const QString &search_term); void createSelectedFinder(); void showResults(const WordRefList &results); + void clearResults(); private slots: void on_searchInput_textChanged(const QString &search_term); diff --git a/docs/folien/analyse.tex b/docs/folien/analyse.tex new file mode 100644 index 0000000..b1ec6f9 --- /dev/null +++ b/docs/folien/analyse.tex @@ -0,0 +1,34 @@ +\begin{frame}{Analyse} + + {\Large Anforderungen} + \vspace{0.5cm} + + \begin{itemize} + \item Datenstruktur für Wortliste + \item Paralleler Such-Algorithmus + \item Abgeleitet: Optimierung der Such-Zeit + \end{itemize} +\end{frame} + +\begin{frame}{Analyse} + + {\Large Abgeleitete Aufgabenstellung} + \vspace{0.5cm} + + \begin{minipage}{0.7\textwidth} + Aufteilung in zwei Blöcke: + \begin{block}{Anwendungs-Schicht (Layer 5 - 7)} + \begin{itemize} + \item Request/Reponse + \item Konkurrierender Zugriff + \item Session Handling + \end{itemize} + \end{block} + \begin{block}{Transport-Schicht (Layer 1 - 4)} + \begin{itemize} + \item Datenübertragung zwischen SG + \item Gleichzeitige Kommunikation + \end{itemize} + \end{block} + \end{minipage} +\end{frame} diff --git a/docs/folien/aufgabe.tex b/docs/folien/aufgabe.tex new file mode 100644 index 0000000..5e48891 --- /dev/null +++ b/docs/folien/aufgabe.tex @@ -0,0 +1,14 @@ +\begin{frame}{Aufgabe} + + {\Large Entwicklung einer parallelen Suche in einer Liste mit Wörtern} + \vspace{0.5cm} + + Es ist eine Datenstruktur in Form einer Liste (Vektor) mit unterschiedlichen Wörtern + gegeben. Ein Suchalgorithmus soll eine Liste mit Wörtern aus dieser Wortliste ermitteln, + deren erste Zeichen mit einem Suchstring übereinstimmen. + + Der Algorithmus soll moderne Multi-Core-Prozessoren ausnutzen, die Suche also auf + möglichst viele Cores verteilen. +\end{frame} + + diff --git a/docs/folien/danke.tex b/docs/folien/danke.tex new file mode 100644 index 0000000..cc6c94b --- /dev/null +++ b/docs/folien/danke.tex @@ -0,0 +1,5 @@ +\begin{frame} + \begin{center} + \huge Vielen Dank + \end{center} +\end{frame} diff --git a/docs/folien/folien.tex b/docs/folien/folien.tex new file mode 100644 index 0000000..509a45a --- /dev/null +++ b/docs/folien/folien.tex @@ -0,0 +1,51 @@ +\documentclass[aspectratio=169]{beamer} +\title{Fallstudie Wortliste} +\author{Michael Mandl} +\date[v0.1 | 25.03.2024]{25.03.2024} + +\usepackage[sfdefault]{noto} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage{fontawesome} + +\definecolor{vector_red}{RGB}{183, 0, 50} +\definecolor{vector_grey}{RGB}{234, 236, 237} + +\usetheme{Boadilla} + +\setbeamercolor*{palette primary}{fg=white,bg=vector_red} +\setbeamercolor*{palette secondary}{fg=black,bg=vector_grey} +\setbeamercolor*{palette tertiary}{fg=black,bg=vector_grey} +\setbeamercolor*{palette quaternary}{fg=black,bg=vector_grey} + +\setbeamercolor{titlelike}{fg=white, bg=vector_red} +\setbeamercolor{frametitle}{bg=vector_red,fg=white} + +\setbeamertemplate{itemize item}[triangle] +\setbeamertemplate{itemize subitem}[circle] +\setbeamercolor{itemize item}{fg=vector_red} +\setbeamercolor{itemize subitem}{fg=vector_red} +\setbeamercolor{itemize subsubitem}{fg=vector_red} + +\setbeamercolor{description item}{fg=vector_red} + +\setbeamercolor{block title}{fg=white, bg=vector_red} +\setbeamercolor{block body}{fg=black, bg=vector_grey} + +\setbeamertemplate{navigation symbols}{} + +\setbeamersize +{ + text margin left=2cm, + text margin right=2cm +} + +\begin{document} + +\frame[plain]{\titlepage} + +\include{aufgabe} +\include{analyse} +\include{danke} + +\end{document} diff --git a/docs/folien/insert_1.png b/docs/folien/insert_1.png new file mode 100644 index 0000000..524ab95 Binary files /dev/null and b/docs/folien/insert_1.png differ diff --git a/docs/folien/insert_2.png b/docs/folien/insert_2.png new file mode 100644 index 0000000..8ea56cc Binary files /dev/null and b/docs/folien/insert_2.png differ diff --git a/docs/folien/insert_3.png b/docs/folien/insert_3.png new file mode 100644 index 0000000..5384e42 Binary files /dev/null and b/docs/folien/insert_3.png differ diff --git a/docs/folien/insert_4.png b/docs/folien/insert_4.png new file mode 100644 index 0000000..26b08b2 Binary files /dev/null and b/docs/folien/insert_4.png differ diff --git a/docs/folien/watch_and_build.sh b/docs/folien/watch_and_build.sh new file mode 100755 index 0000000..a8b90fc --- /dev/null +++ b/docs/folien/watch_and_build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +find . -name "*.tex" -o -name "*.png" | entr latexrun folien.tex diff --git a/docs/input.svg b/docs/input.svg new file mode 100644 index 0000000..662ad6c --- /dev/null +++ b/docs/input.svg @@ -0,0 +1,2270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EZGA + + + + BBPR + + + + EPWE + + + + AGTK + + + + CCDC + + + + APUX + + + + BBZA + + + + MNPP + + + + QLAN + + + + BHAN + + + + OZTT + + + + YUAA + + + + + + + + + EZGA + + + + BBPR + + + + EPWE + + + + AGTK + + + + CCDC + + + + APUX + + + + BBZA + + + + MNPP + + + + QLAN + + + + BHAN + + + + OZTT + + + + YUAA + + + + + + EZGA + + + + BBPR + + + + EPWE + + + + AGTK + + + + CCDC + + + + APUX + + + + BBZA + + + + MNPP + + + + QLAN + + + + BHAN + + + + OZTT + + + + YUAA + + + Bucket 0 + Bucket 1 + Bucket 2 + Bucket 1 + + + + + + + + + + + + + + + EZGA + + + + BBPR + + + + EPWE + + + + AGTK + + + + CCDC + + + + APUX + + + + BBZA + + + + MNPP + + + + QLAN + + + + BHAN + + + + OZTT + + + + YUAA + + Bucket 0 + A + + + + + + E + + + + + + + + + + Bucket 1 + A + + + + + B + + + + + + C + + + + + + + + + + + Bucket 3 + M + + + + + O + + + + + + Y + + + + + + + + + + + Bucket 2 + B + + + + + Q + + + + + diff --git a/lib_vector_search/include/bucket_finder.h b/lib_vector_search/include/bucket_finder.h index d8eae45..15b7dbe 100644 --- a/lib_vector_search/include/bucket_finder.h +++ b/lib_vector_search/include/bucket_finder.h @@ -7,7 +7,7 @@ class Bucket { private: - std::map groups_; + std::map directory_; public: void insert(const WordList &word_list, size_t first_index, size_t last_index); diff --git a/lib_vector_search/src/bucket_finder.cpp b/lib_vector_search/src/bucket_finder.cpp index 2738b0b..8fd7500 100644 --- a/lib_vector_search/src/bucket_finder.cpp +++ b/lib_vector_search/src/bucket_finder.cpp @@ -6,20 +6,20 @@ void Bucket::insert(const WordList &word_list, size_t first_index, size_t last_index) { - for (size_t index = first_index; index < last_index; ++index) { + for (auto index = first_index; index < last_index; ++index) { const auto ¤t_word = word_list[index]; - groups_[current_word.front()].push_back(¤t_word); + directory_[current_word.front()].push_back(¤t_word); } } WordRefList Bucket::find_prefix(std::string_view search_term) const { - auto group_it = groups_.find(search_term.front()); - if (group_it == groups_.cend()) { + auto directory_it = directory_.find(search_term.front()); + if (directory_it == directory_.cend()) { return {}; } WordRefList result; - for (const auto *word : group_it->second) { + for (const auto *word : directory_it->second) { if (word->starts_with(search_term)) { result.push_back(word); }