Скачать MetaTrader 5

Задачка для программистов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Oreshkin
6649
Alexey Oreshkin  
Допустим есть некоторый текст, скажем "Война и мир" Толстова. Стоит задача посчитать сколько раз используется каждая буква.
Решение в лоб и самое неэффективное - создать массив из 33 элементов, условится что номер элемента совпадает с номером буквы ( Массив[0] = "А") и перебрав весь текст получить ответ. Но если для нас важен регистр, то элементов уже будет не 33 а больше, а если текст не на русском языке ? И если вдруг автор произведения решил не использовать к примеру букву "У" а мы зарезервируем для неё место, что тоже неэффективно и ко всему прочему есть условие - нам нельзя создавать массив где номер элементов имеет соответствие номеру буквы. 
Вот похожую задачу мне надо решить средствами MQL5. Самый просто вариант это как-то сделать так: Увидел букву А и написал так: Массив[А]++, (это вариант 1) но в мкл индексами массива может выступать только целое число, поэтому ищем дальше. Следующий вариант это использовать структуру, тогда будет так. Структура.A++(это вариант 2) В этом случае мне нужно создать некую динамическую структуру, которой я к тому же должен также динамически присвоить имя элемента, и на сколько я знаю в мкл это тоже задача нерешаемая.
Вопрос - как реализовать вариант 1 или вариант 2 ? Или всё же придётся по старинке - перебором в лоб ?
Alexey Volchanskiy
23034
Alexey Volchanskiy  
Alexey Oreshkin:
Допустим есть некоторый текст, скажем "Война и мир" Толстова. Стоит задача посчитать сколько раз используется каждая буква.
....

Для этого придуманы ассоциативные массивы https://www.mql5.com/ru/articles/1334#intro

Еще их называют hash-tables. 

Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
  • 2015.03.23
  • Vasiliy Sokolov
  • www.mql5.com
В данной статье описывается специальный алгоритм, позволяющий эффективно получать доступ к элементам по их уникальному ключу. В качестве ключа может быть использован любой базовый тип данных, например ключом могут быть строки или целочисленные переменные. Такой контейнер данных принято называть словарем или ассоциативным массивом. С его помощью решать многие задачи становиться гораздо проще и эффективней.
Alexey Oreshkin
6649
Alexey Oreshkin  
Alexey Volchanskiy:

Для этого придуманы ассоциативные массивы https://www.mql5.com/ru/articles/1334#intro

А я всё думал для кого эта статья ? ) Спасибо, сейчас гляну.
Alexey Volchanskiy
23034
Alexey Volchanskiy  
Alexey Oreshkin:
А я всё думал для кого эта статья ? ) Спасибо, сейчас гляну.
Для вас)) В качестве ключа надо использовать букву, а в поле значения писать число ее включений.
Yuri Evseenkov
2327
Yuri Evseenkov  
Если обозначить каждую букву цифрой, А-11, Б-12 и т.д то в дальнейшем можно будет использовать операторы >=<  и, например, легче искать слова  начинающиеся с буквы к. 
Dmitry Fedoseev
46938
Dmitry Fedoseev  

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

Экономить здесь нечего, массив лонгов в 256 элементов, это мизер.

На финальной стадии, если надо, то просуммировать количества разных регистров. 

Petros Shatakhtsyan
11365
Petros Shatakhtsyan  
Alexey Oreshkin:

Вопрос - как реализовать вариант 1 или вариант 2 ? Или всё же придётся по старинке - перебором в лоб ?
Если вы посмотрите какие задачи решают школьники 8-10 классов на международных олимпиадах, то поймете что это детская задачка.  :)
Alexey Volchanskiy
23034
Alexey Volchanskiy  
Petros Shatakhtsyan:
Если вы посмотрите какие задачи решают школьники 8-10 классов на международных олимпиадах, то поймете что это детская задачка.  :)
Дык то школьники, а в нашей местной псих. больнице средняя температура ниже нуля ))
Igor Volodin
4085
Igor Volodin  
Dmitry Fedoseev:

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

Экономить здесь нечего, массив лонгов в 256 элементов, это мизер.

На финальной стадии, если надо, то просуммировать количества разных регистров. 

Плюсую, работать будет в несколько раз быстрее чем с ассоциативными массивами. Зачем переводить каждый раз входящий символ с помощью функции сворачивания в уникальный хеш, плюс дополнительные обработки, плюс памяти на порядок жрать больше с объектами будет?

Igor Volodin
4085
Igor Volodin  
Alexey Volchanskiy:
Дык то школьники, а в нашей местной псих. больнице средняя температура ниже нуля ))
Алексей, вы самокритичны ))
Alexey Volchanskiy
23034
Alexey Volchanskiy  
Igor Volodin:
Алексей, вы самокритичны ))

Это что, вот когда я был Наполеоном...)))

Насчет таблицы ASCII c 256 элементfvb. А что будете делать с текстом с китайскими иероглифами или многоязычном на Unicode? 

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий