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

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

12.03.2015, 10:04. Показов 56050. Ответов 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
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 14:49  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Catstail Посмотреть сообщение
Ты продолжаешь мыслить массивами.
Благодаря вашему совету я уже частично абстрагируюсь от этого термина в рамках этой программы, но всё же мне результат этой программы нужно использовать в других модулях и они работают уже не в Excel, т.е. нужен результат в том виде о котором я писал выше, сформировать всё назад в строку и записать её txt файл.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 15:56
Вместо позиции в массиве в словаре можно писать номера в значениях.
Или думаю тут будет удобно так - из строки |ПРОДВИНУТОСТЬЮ|92239|/;2;1;/| создать 3 словаря:
1 - ключ "ПРОДВИНУТОСТЬЮ", значение "номер статуса"
2 - ключ "ПРОДВИНУТОСТЬЮ", значение 92239
3 - ключ "ПРОДВИНУТОСТЬЮ", значение /;2;1;/
ну или второй
ключ "ПРОДВИНУТОСТЬЮ", значение 92239/;2;1;/
Теперь при анализе по ключу легко без лишних операций меняем любое зависимое значение.
А в финале можно выгрузить первый словарь в массивы или двумерный массив, отсортировать по собранным статусам/частоте/иличтотамбудет, или выгрузить на лист и разобрать глазами.
Далее снова пройтись циклом по ключам (взять с листа в массив) и сформировать итоговый текст (словари делать публичными, или промежуточно тоже выгрузить на лист или в файл).
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 16:38  [ТС]
Ок. Благодарю. Буду пробовать!
...и всё же надеюсь на поиск в массиве.

Добавлено через 18 минут
Мысль о переносе массива в словарь и работы там, привела меня к мысли сбросить весь массив в ListBox и искать там, но почему-то не работает ListBox.FindString("|слово поиск|"), результат даёт 0, хотя слово искомое там есть.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 17:16
А что это за ListBox.FindString? Где это?
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 17:24  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
А что это за ListBox.FindString? Где это?
Нашёл здесь
https://msdn.microsoft.com/en-... t1818.aspx
Но не работает и ListBox1.Items.IndexOf(), хотя весь список
ListBox1.Clear
ListBox1.List = Mslov
Выводится очень быстро. Список разместил на страничку. Затык похоже в моих любительских мозгах окончательный.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 17:36
Это вроде как .NET Framework 4.5, в VBA такого нет.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 17:37  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Это вроде как .NET Framework 4.5, в VBA такого нет.
а это ListBox1.Items.IndexOf() ?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.03.2015, 17:40
Такого тоже нет в VBA.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 17:48  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Такого тоже нет в VBA.
Понятно, получается, что из компонента ListBox, индекс по заданному элементу, кроме как его выделением на списке, никак нельзя?
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
12.03.2015, 18:39
Словарь - хеш таблица. Ищи на форуме я полностью исследовал ее работу.
Сортировка словаря методом реконструкции
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
12.03.2015, 22:31  [ТС]
Пришлось поменять ListBox на ComboBox, так же передаю ему массив Mslov
ComboBox.List=Mslov
В ComboBox можно дописывать строку - элемент в начало списка, но определение индекса по заданному элементу, осуществляется в ComboBox.ListIndex при его активации в списке, может кто знает как в ComboBox определить индекс заданного элемента из списка без его активации, т.е. программно.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
16.03.2015, 21:58  [ТС]
Цитата Сообщение от polestar Посмотреть сообщение
Код Visual Basic
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
Помогите разобраться с функцией Find. Пытаюсь заменит ею выше приведённый код, но не хочет работать.
Visual Basic
1
Set psk = Mslov.Find(slovo$, lookat:=xlWhole)
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
17.03.2015, 09:17
Цитата Сообщение от polestar Посмотреть сообщение
Помогите разобраться с функцией Find.
Использовать Find - самый медленый способ...
Я когда то писал поиск миллиона значений на миллион, выполнялось это более 12 часов. После того как описал всё через словари и массивы переменных, срок выполнения сократился до 10 минут.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
17.03.2015, 09:21  [ТС]
Цитата Сообщение от dzug Посмотреть сообщение
Использовать Find - самый медленый способ...
Благодарю, но всё же как её запустить. Пишу в встроенном редакторе VB в Excel, функция Filter работает, а это капризная... исключительно.
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
17.03.2015, 09:32
Цитата Сообщение от polestar Посмотреть сообщение
Благодарю, но всё же как её запустить
В справочнике всё хорошо описано и с примерами.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub mmm()
With Worksheets(1).Range("A4:T12")
s = InputBox("Что ищем ??", , "s22")
Set c = .Find(s, LookIn:=xlValues)
If Not c Is Nothing Then
  firstAddress = c.Address
  Debug.Print c.Address
  ss = c.Address
  Do
      Set c = .FindNext(c)
      Debug.Print c.Address
If c.Address <> firstAddress Then
 ss = ss & " " & c.Address
End If
  Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
MsgBox ss, vbInformation, "Искали  " & s
End Sub
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
17.03.2015, 09:57
Find работает только с диапазоном. По массиву можно использовать Index(), но простой перебор массива быстрее, и заметно быстрее.
1
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
17.03.2015, 10:57  [ТС]
Благодарю, всех за ликбез. Придётся в самом деле, похоже, перейти в словарь.
Быстрее в VB окромя перебора нет!
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
17.03.2015, 11:12
Я там выше перепутал - не INDEX(), а MATCH()!
А когда перейдёте на словарь - как раз от перебора избавитесь.
0
 Аватар для polestar
2 / 3 / 1
Регистрация: 26.02.2015
Сообщений: 198
17.03.2015, 11:14  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
а MATCH()!
По match где-то читал есть ограничение на количество элементов в массиве.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
17.03.2015, 11:22
Кажется там осталось ограничение как в 2003 версии, точно не знаю т.к. не использую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2015, 11:22

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru