Максимально быстрое определение количество вхождений подстроки в строку - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Необходимо максимально быстро подсчитывать количество пробелов в строке. Написал такой код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            System.Diagnostics.Stopwatch swatch = new System.Diagnostics.Stopwatch();
            swatch.Start();
 
            string line = "Проблемы можно решать по-разному. Можно просто напиться в дым, и они на время исчезнут. Но я предпочитаю разбираться с ними до того, как они начнут разбираться со мной.";
            string symbol = " ";
            int count = -1;
 
            //для теста делаем 100 тыс. итераций
            for (int i = 1; i < 100000; i++)
            {
                int a = 0;
                int x = -1;
                count = -1;
                while (a != -1)
                {
                    a = line.IndexOf(symbol, x + 1);
                    x = a;
                    count++;
                }
            }
 
            swatch.Stop();
 
            MessageBox.Show("Количество символов - " + count.ToString() + "\r\nВремя - " + swatch.ElapsedMilliseconds.ToString());
        }
    }
}
У меня получается: 27 пробелов, 1150 миллисекунд. Процессор i7-3610QM. Что-то все равно медленно, возможно ли ускорить?
О, написал еще такой вариант:
  for (int i = 1; i < 100000; i++)
            {
                string modified = line.Replace(" ", "");
                count = line.Length - modified.Length;
            }
То есть из строки удаляются пробелы, измеряется ее длина, а потом считается разница между длинами. Получается: 148 миллисекунд. Но на больших объемах все равно медленно. Можно ли еще быстрее сделать?

Решение задачи: «Максимально быстрое определение количество вхождений подстроки в строку»

textual
Листинг программы
using System;
using System.Threading.Tasks;
 
namespace ConsoleApplication42
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch swatch = new System.Diagnostics.Stopwatch();
            swatch.Start();
 
            var line = "Проблемы можно решать по-разному. Можно просто напиться в дым, и они на время исчезнут. Но я предпочитаю разбираться с ними до того, как они начнут разбираться со мной.";
            var count = 0;
 
            Parallel.ForEach(line, symbol => { if (symbol.Equals(' ')) count++; });
 
            swatch.Stop();
 
            Console.WriteLine("Количество символов - " + count.ToString() + "\r\nВремя - " + swatch.ElapsedMilliseconds.ToString());
            Console.ReadKey(true);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы