Какую структуру данных использовать в VB.NET, чтобы с учетом двух символов возвращать целое число для оптимальной производительности? - PullRequest
0 голосов
/ 11 августа 2010

Я заканчиваю программу, которая выполняет большое количество вычислений, и пытаюсь оптимизировать самый внутренний цикл.

Вычисление, на которое я сейчас обращаюсь, повторяет большое количество пар слов и делаеттаблица количества соответствующих пар символов.Например, одна пара слов может быть:

voice
louse

, а пары символов будут (v, l), (o, o), (i, u), (c, s),и (e, e), и тогда все эти пары будут иметь счет 1. Если комбинация (v, l) когда-либо встретится снова в другом слове, это увеличит этот счет до двух.

Чтоструктуру данных я должен использовать для максимальной производительности?Учитывая два символа, мне нужно получить количество для этой пары.В настоящее время я использую вложенную хеш-таблицу, объявление которой выглядит следующим образом:

Dim data As New Dictionary(of String, Dictionary(of String, Integer))

Используя эту структуру данных, программа должна хешировать две строки для каждого целого числа, которое она получает.Для каждой пары символов он должен сначала проверить, есть ли пара в хеш-таблице, а если нет, добавить еще два хэша.Я также рассмотрел одноуровневую хеш-таблицу, в которой ключом являются два соединенных вместе символа, поэтому key = "vl" и value = 1, но я прочитал, что конкатенация строк в VB относительно медленная.

тогда мои вопросы:

Насколько быстры словари в VB?Разве четыре хеша будут быстрее, чем один хеш и конкатенация строк (два уровня по сравнению с хэш-таблицей одного уровня)?

Можете ли вы придумать лучшую структуру для хранения таких данных, которая позволяет быстро добавлять и извлекать данные?*

1 Ответ

4 голосов
/ 11 августа 2010

Один из вариантов - использовать Dictionary(Of Integer, Integer).Вы можете преобразовать любой символ .NET Unicode в 16-разрядное целое число без знака, так как они являются единицами кода UTF-16.

Затем можно очень легко объединить два 16-разрядных целых числа без знака в 32-разрядное целое число.Кроме того, вы можете просто преобразовать каждую единицу кода в 32-разрядное целое число без знака для начала, а также сдвигать и комбинировать таким же образом:)

В C # я бы просто использовал:

int combination = (((int) char1) << 16) | ((int) char2);

РЕДАКТИРОВАТЬ: Согласно комментарию jeroenh, VB эквивалент:

Dim combination As Integer = (AscW(char1) << 16) Or AscW(char2)
...