Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/287: Рейтинг темы: голосов - 287, средняя оценка - 4.98
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198

Самый быстрый метод поиска в массиве

12.03.2015, 10:04. Показов 56057. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу в Excel макрос. По условию имею массив около 1 000 000 записей, каждая запись представляет из себя строку:
формата - [|АНАЛИТИЧЕСКОЕ|89938|/;5951;1;/|], это пример. В первых двух вертикальных линиях ||,в строках массива записаны разные слова. Поиск осуществляется среди этих слов
Написал код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function poisk(slovo$) As Currency
p = -1
For k = 0 To hms - 1
    sl = Mslov(k)
    f = InStr(3, sl, "|")
    sl = Mid(sl, 2, f - 1)
    If sl = slovo$ Then
       p = k
       Exit For
    End If
Next
psk = p
Return
End Function
slovo$ - искомое слово заключённое в |поисковое слово|
hms - количество всех элементов в массиве Mslov
p - результат поиск, если -1, то записи с данным словом в массиве нет, если <> -1, то по значению psk в теле основной программы вызывается вся строка.
Код работает крайне медленно, есть ли возможность ускорить... поиск методов определения индекса заданного (не чётко) элемента массива ничего не дал.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2015, 10:04
Ответы с готовыми решениями:

Самый быстрый алгоритм на с++ для поиска изображений с погрешностью
Подскажите самый быстрый алгоритм для поиска одного изображения на другом с погрешностью. То есть загружается два изображения и происходит...

Самый быстрый метод сортировки
Интересует самый быстрый метод сортировки, ссылки, примеры, что угодно

как заполнить вектор векторов прямо в программе (самый быстрый метод)
почему не работает? #include&lt;cstdio&gt; #include &lt;vector&gt; using namespace std; vector&lt;int&gt; a; int main(){ a={4,6}; ...

70
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 12:21
Студворк — интернет-сервис помощи студентам
Что за allBaza?
Если это массив строк из текстового файла, то их 65 мегов его можно получить секунд за 10 так:

Visual Basic
1
AllБаза = Split(CreateObject("Scripting.FileSystemObject").Getfile(Путькфайлу$).OpenasTextStream(1).ReadAll, vbNewLine)
Далее цикл по массиву, берём ключ и кладём всё в словарь, массив убиваем.
1
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 12:24  [ТС]
Цитата Сообщение от shanemac51 Посмотреть сообщение
похоже, что подход к обработке в корне неверен
Можно попросить ответить на конкретный вопрос, о ином способе поиска в массиве элементов, которые представляют из себя тип данных String. Нужно определить индекс массива, элемент которого содержит заданную подстроку. По поводу организации процесса вне этого вопроса, мне ваше мнение интересно, но потом и в другой теме.

Добавлено через 1 минуту
Цитата Сообщение от Hugo121 Посмотреть сообщение
Если это массив строк из текстового файла, то их 65 мегов его можно получить секунд за 10 так:
В VBA, проблем нет.... написал же. Нужен аналог функции в PureBasic, код из которого я привёл, чтобы заменить в этом языке функцию Split
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
12.03.2015, 12:25
Попробуй так
Visual Basic
1
Mslov=Split(CreateObject("Scripting.FileSystemObject").Getfile(Name).OpenasTextStream(1).ReadAll, "\")
2
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 12:26
https://www.cyberforum.ru/pure-basic/
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12512 / 5086 / 814
Регистрация: 07.08.2010
Сообщений: 14,972
Записей в блоге: 4
12.03.2015, 12:27
В файле одна строка, в которой есть блоки [....]\[....]\[....]\.
--какова же длина этой строки(файла)
--что с ней надо делать
--не можете выложить реальный --выложите реалистический пример


и для чего нужен поиск


нет желания угадывать ваши потребности
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 13:17  [ТС]
Цитата Сообщение от snipe Посмотреть сообщение
а можно кусочек txt
.....[|ПРОДВИНУТОСТЬЮ|92239|/;2;1;/|]\[|ИСПОЛЬЗУЕШЬ|92240|/;900;1;/|]\[|МАКСИМУМУ|92241|/;173;1;/|]\[|ПРОДЕМОНСТРИРОВАН|92242|/;2;1;/|]\[|ЗАМЕЛЬКАЛИ|92243|/;92244;1;/|]....

Добавлено через 1 минуту
Цитата Сообщение от shanemac51 Посмотреть сообщение
нет желания угадывать ваши потребности
И что вас заставляет?

Добавлено через 1 минуту
Цитата Сообщение от Hugo121 Посмотреть сообщение
https://www.cyberforum.ru/pure-basic/
Я там был ... не нашёл

Добавлено через 1 минуту
Цитата Сообщение от shanemac51 Посмотреть сообщение
какова же длина этой строки(файла)
Выше я написал 1 000 000 таких блоков. Длина строки тоже написал около 60 мегов.

Добавлено через 2 минуты
Цитата Сообщение от Alex77755 Посмотреть сообщение
Попробуй так
В PureBasic функции Split нет.

Добавлено через 24 минуты
Цитата Сообщение от polestar Посмотреть сообщение
....
[|ПРОДВИНУТОСТЬЮ|92239|/;2;1;/|]
[|ИСПОЛЬЗУЕШЬ|92240|/;900;1;/|]
[|МАКСИМУМУ|92241|/;173;1;/|]
[|ПРОДЕМОНСТРИРОВАН|92242|/;2;1;/|]
[|ЗАМЕЛЬКАЛИ|92243|/;92244;1;/|]
....
Так я представил элементы массива Mslov. Ищется индекс элемента массива в котором содержится заданная подстрока, например: |ЗАМЕЛЬКАЛИ|
Как можно организовать на VBA самый быстрый код решения этого вопроса?

Добавлено через 18 минут
Цитата Сообщение от Alex77755 Посмотреть сообщение
Mslov=Split(CreateObject("Scripting.File SystemObject").Getfile(Name).OpenasTextS tream(1).ReadAll, "\")
Hugo121 и Alex77755 Благодарю вас, вставил в основной код, стало работать быстрее... массив формируется за секунды.
0
 Аватар для Апострофф
9912 / 3933 / 743
Регистрация: 11.10.2011
Сообщений: 5,916
12.03.2015, 13:18
Вариант вообще без циклов
Visual Basic
1
2
3
4
Dim s$, a() As String, n&
s = "[|ПРОДВИНУТОСТЬЮ|92239|/;2;1;/|]\[|ИСПОЛЬЗУЕШЬ|92240|/;900;1;/|]\[|МАКСИМУМУ|92241|/;173;1;/|]\[|ПРОДЕМОНСТРИРОВАН|92242|/;2;1;/|]\[|ЗАМЕЛЬКАЛИ|92243|/;92244;1;/|]"
a = Split(s, "|ЗАМЕЛЬКАЛИ|")
n = Len(a(0)) - Len(Replace(a(0), "[", ""))
но никаких гарантий по производительности?
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 13:26  [ТС]
Цитата Сообщение от Апострофф Посмотреть сообщение
Вариант вообще без циклов
Пробовал, на заре работы с этой программой, дело в том, что таскать за собой строку таким весом очень накладно и дальнейшая обработка тоже связана с вырезанием блока, потом его врезкой на своё место... ушёл от этого принципа, т.е. работы с одной строкой, перешёл на массив. Может вы мне порекомендуете как правильно использовать метод Find, дело в том что как и писал выше методом Filter, я нахожу всю строку, но не могу узнать индекс этого элемента.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 13:40
Я думаю что если этот Find нужен один или два раза - то можно тупо пройтись в цикле по массиву.
Если же искать нужно много и часто - то пройтись один раз циклом и собрать словарь ключ/значение, ну или ключ/индекс массива, если так удобнее.
Зато затем все поиски по словарю будут мнгновенные.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 13:43  [ТС]
Поиск в массиве нужен постоянно, так как макрос читает тексты и заносит в базу слова, новые слова или изменяет определённые параметры в словах, которые уже есть в массиве.... поэтому этот этап в программе самый главный и мне нужно его оптимизировать, желательно идеально в рамках VBA.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 13:57
Цитата Сообщение от polestar Посмотреть сообщение
читает тексты и заносит в базу слова
- ну значит прочитать текст в итоге в словарь, там его изменять-дополнять, в конце выгрузить всё в новый текст.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
12.03.2015, 14:02
polestar, Фу... Пробую последний раз.

Ты используешь массив (обозначим его A). Значит, в твоей программе должно быть:


Visual Basic
1
2
3
4
5
6
7
 
   Redim A(1 to ...) As ....
 
   A(i)=...
 
 
   ...=A(i)
А теперь будет

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
   Set Dict=CreateObject("Scripting.Dictionary")
 
   Dict.Add "|****|","|****|***...|"
 
   '::: Проверка наличия
 
   If Dict.Exists(Ключ) Then B=Dict.Item(Ключ)
 
   '::: Удаление
 
   Dict.Remove(Ключ)
 
   '::: и т.д.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 14:17  [ТС]
Дело в том, что в основном массиве хранятся числовые параметры, которые соответствуют прочитанному слову в данный момент времени, нужно их знать, чтобы внести соответствующие корректировки, которые хранятся в подблоках /.../. Исходя из того что содержится в этих подблоках, к ним добавляется новые или корректируются уже существующие.
/;900;1;/
Этот подблок говорит о том, что слово связано со словом имеющее индекс 900 и встречалось 1 раз. Индекс слова хранится сразу же после самого слова, например: [|ПРОДВИНУТОСТЬЮ|92239|/;2;1;/|] - индекс этого слова ПРОДВИНУТОСТЬЮ 92239, встречалось со словом с индексом 2, 1 раз.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Фу... Пробую последний раз.
Благодарю вас за настойчивость, как и говорил, я ваше предложение использую если лучшего не предложится. Дело в том, что запись в массив, после того как слово уже записывалось первый раз, переносится в начало массива при повторном появлении в тексте, таким образом, я в начале массива кучкую часто встречаемые слова, а редкие смещаются на периферию. Поэтому массив постоянно меняется.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
12.03.2015, 14:19
Цитата Сообщение от polestar Посмотреть сообщение
Дело в том, что запись в массив, после того как слово уже записывалось первый раз, переносится в начало массива при повторном появлении в тексте, таким образом, я в начале массива кучкую часто встречаемые слова, а редкие смещаются на периферию. Поэтому массив постоянно меняется.
- ничего этого НЕ НУЖНО БУДЕТ ДЕЛАТЬ. Словарь ищет данные очень быстро.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 14:23  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
ичего этого НЕ НУЖНО БУДЕТ ДЕЛАТЬ
Мне это нужно делать, так как в тексте встречаются слова написанные с ошибками, буквенные абракадабры, и пр. это я потом удаляю. Если я не буду осуществлять такой алгоритм записи в массив слов, то все эти ошибки будут размазаны по всему массиву.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
12.03.2015, 14:27
Кто мешает удалять из словаря?
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 14:31  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Кто мешает удалять из словаря?
Это вам просто весь словарь допустим просмотреть на наличие ошибок - визуально, а мне как любителю это сложно, всё же 1 000 000 слов. Так я знаю, что все они сосредоточены в конце массива - строки. Я эту зону визуально просматриваю и удаляю.... Всё же есть разница искать ошибки среди 1000000 или в последней сотке слов.
0
0 / 0 / 0
Регистрация: 12.03.2015
Сообщений: 16
12.03.2015, 14:31
Помогите пожалуйста с решение задачи.
Написать программу: Для массива из N целых чисел определить индексы элементов,
равных минимальному.
На языке на языке VBA или OpenOffice BASIC.
Очень срочно помогите пожалуйста.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 14:42  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
А теперь будет
Код Visual Basic
Visual Basic
1
2
3
4
5
6
7
Set Dict=CreateObject("Scripting.Dictionary")
Dict.Add "|****|","|****|***...|"
'::: Проверка наличия
If Dict.Exists(Ключ) Then B=Dict.Item(Ключ)
'::: Удаление
Dict.Remove(Ключ)
'::: и т.д.
Скажите пожалуйста, а я могу в словарь вставить исправленный блок и на первую позицию в словаре?
Затем, считать весь словарь в массив, перевести в строку и записать в файл (это могу)?
(Ключ) - это слово которое ищется?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
12.03.2015, 14:44
В словаре нет понятия "первая позиция". Все слова в словаре ищутся одинаково быстро. Ты продолжаешь мыслить массивами. При использовании словаря все проще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2015, 14:44

Подскажите быстрый метод поиска по коллекции с полем DateTime
привет есть коллекция объектов с полем Datetime коллекция упорядочена по времени временные интервалы между объектами произвольные -...

Быстрый Алгоритм поиска 2х мерного подмассива в 2х мерном массиве
Есть ли что то кроме алгоритма грубой силы, что можно тут использовать? оба массива состоят из единиц и нулей, которые следуют в...

В массиве X найти самый большой элемент и вывести его и его номер на экран, в массиве Y - самый маленький
С помощью датчика случайных чисел сформировать два массива X и Y размерностью 100 и 200 чисел в диапазоне от 0 до 1 и от 0 до 100...

Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя)
Здравствуйте! Дали весьма интересное задание. Сравнить два вышеуказанных метода сортировки для массива из 10000 элементов, результаты...

Самый быстрый сервер
Здравствуйте, подскажите пожалуйста. где можно найти исходники самого быстрого сервера многопоточного. Интересует только принятние...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru