示例#1
0
 /// <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();
 }
示例#2
0
        /// <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;
            }
        }
示例#3
0
        /// <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();
        }
示例#4
0
        /// <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() + " тиков";
        }