Поиск символов в строке с использованием хэш-таблицы - PullRequest
4 голосов
/ 30 мая 2011

Я решил решить проблему поиска заданных символов в строке.И я решил это двумя способами:

Первый (использование хеш-таблицы для хранения значений в ASCII для символов, которые мы хотим найти):

static void Hash(string text, char[] charsToFind)
{
    Dictionary<int,char> chars = new Dictionary<int,char>();
    foreach (var letter in charsToFind)
    {
        chars[(int)letter] = letter;
    }

    foreach (var letter in text)
    {
        if (chars.ContainsKey((int)letter))
        {
            if (letter == chars[(int)letter])
            {
                Console.WriteLine("Element found at: {0}, value: {1}", (int)letter, letter);
            }
        }
    }
}

И второй способ (наивный):

static void Naive(string text, char[] charsToFind)
{
    foreach (var letter in text)
    {
        foreach (var character in charsToFind)
        {
            if ((int)letter == (int)character)
            {
                Console.WriteLine("Element found at: {0}, value: {1}", (int)letter, letter);
            }
        }
    }
}

И все отлично работает!Вопрос, который я хотел бы задать, - какой из них лучше, и есть ли еще лучшие решения этой проблемы?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 30 мая 2011

Использование LINQ:

string input = "abc";
char[] charsToFind = new[] { 'a', '1', 'b' };
IEnumerable<int> ids = charsToFind.Select(ch => input.IndexOf(ch)); // { 0, -1, 1 }

С Hashset<T>, который является общей хэш-таблицей:

HashSet<char> set = new HashSet<char>(input.ToCharArray());
...
1 голос
/ 30 мая 2011

Первый подход лучше, но второй, вероятно, будет быстрее для небольшого числа символов.

Некоторые комментарии к первому. В первом случае использование словаря связано с затратами на вычисление хэша и выполнение поиска. Если бы вы знали, что символы были ASCII, вы могли бы использовать массив для ускорения поиска.

Вместо того, чтобы делать 'ContainsKey', вы можете сделать 'TryGetValue' только для поиска один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...