/// <summary> /// Простой поиск слов в WordList. /// </summary> public void SimpleSearch() { Stopwatch sw = new Stopwatch(); sw.Start(); if (WordList.Contains(WordSearchBox.Text) && //В простом поиске не добавляем в экранный список слова, которые там уже есть (!WordListBox.Items.Contains(WordSearchBox.Text))) { WordListBox.BeginUpdate(); WordListBox.Items.Add(WordSearchBox.Text); WordListBox.EndUpdate(); } sw.Stop(); SimpleSearchTime.Text = sw.Elapsed.ToString(); }
/// <summary> /// Поиск слова в списке WordList и вывод найденных слов в WordListBox. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void WordSearchButton_Click(object sender, EventArgs e) { //Обработка пользовательского ввода //В случае ввода некорректных данных максимальное расстояние Левенштейна считается нулевым if (!int.TryParse(MaxDistanceBox.Text, out int maxDist)) { maxDist = 0; MaxDistanceBox.Text = "0"; } int foundWordsAmount = 0; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < WordList.Count; i++) { if (Levenshtein.Levenshtein.Distance(WordSearchBox.Text, WordList[i]) <= maxDist) { if (!WordListBox.Items.Contains(WordList[i])) { WordListBox.BeginUpdate(); WordListBox.Items.Add(WordList[i]); WordListBox.EndUpdate(); } foundWordsAmount++; } } sw.Stop(); ElapsedWordSearchTime.Text = sw.ElapsedTicks.ToString() + " тиков"; switch (foundWordsAmount) { case 0: label1.Text = "Статус поиска: Слово не найдено"; break; case 1: label1.Text = "Статус поиска: Cлово найдено"; break; default: label1.Text = "Статус поиска: Найдено несколько слов"; break; } }
/// <summary> /// Разделение поиска слов алгоритмом Вагнера-Фишера на паралелльные потоки. Сбор и вывод результатов. /// </summary> /// <param name="ThreadCount">Число потоков</param> /// <param name="MaxDistance">Максимальное расстояние Левенштейна</param> public void ParallelSearch(int ThreadCount, int MaxDistance) { Stopwatch sw = new Stopwatch(); sw.Start(); //Создание списка индексов для разбиения списка слов на подсписки List <MinMax> NewWordLists = SubLists.SplitList(0, WordList.Count, ThreadCount); //Инициализация списка результатов работы потоков List <ParallelSearchResult> SearchResultList = new List <ParallelSearchResult>(); int count = NewWordLists.Count; //Создание нужного числа потоков Task <List <ParallelSearchResult> >[] tasks = new Task <List <ParallelSearchResult> > [count]; for (int i = 0; i < count; i++) { //Разбиение списка слов на подсписки List <string> TempTaskList = WordList.GetRange(NewWordLists[i].Min, NewWordLists[i].Max - NewWordLists[i].Min); //Инициализация потоков методом TempListMethod с передачей необходимых данных в виде кортежа tasks[i] = new Task <List <ParallelSearchResult> >(TempListMethod, new Tuple <List <string>, int, int>(TempTaskList, MaxDistance, i)); //Запуск потоков tasks[i].Start(); } //Ожидание конца работы всех потоков Task.WaitAll(tasks); sw.Stop(); ParallelSearchTime.Text = sw.Elapsed.ToString(); //Сбор результатов работы всех потоков в один список for (int i = 0; i < count; i++) { SearchResultList.AddRange(tasks[i].Result); } //Вывод результатов поиска на экранный список слов WordListBox.BeginUpdate(); WordListBox.Items.Clear(); foreach (ParallelSearchResult res in SearchResultList) { string s = res.Word + " (Поток: " + res.Thread + ") (Расстояние: " + res.Dist + ")"; WordListBox.Items.Add(s); } WordListBox.EndUpdate(); }
/// <summary> /// Поиск слова в списке WordList и вывод найденных слов в WordListBox. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void WordSearchButton_Click(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); sw.Start(); if (WordList.Contains(WordSearchBox.Text)) { label1.Text = "Слово найдено"; if (!WordListBox.Items.Contains(WordSearchBox.Text)) { WordListBox.BeginUpdate(); WordListBox.Items.Add(WordSearchBox.Text); WordListBox.EndUpdate(); } } else { label1.Text = "Слово не найдено"; } sw.Stop(); ElapsedWordSearchTime.Text = sw.ElapsedTicks.ToString() + " тиков"; }