Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Число вхождений элементов однгого массива в другом. - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Число вхождений элементов однгого массива в другом. (Макросы Sub)
Число вхождений элементов однгого массива в другом.
Michael_S Дата: Суббота, 27.07.2013, 14:08 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Всем здрасте.
Интересует наиболее быстрый алгоритм вычисления числа вхождения элементов одного массива в другой.
Конкретно в моем случае, массивы - это натуральные числа, для упрощения скажем от1 до 20
В примере у меня есть решение через встроенные функции, и через VBA.
Есть ли более быстрые алгоритмы?

зы. Функция у меня для примера алгоритма, в действительности это будет макрос и работа не с ячейками, а с массивами. Надо провести несколько миллионов сравнений.
К сообщению приложен файл: Count_in.xls (71.0 Kb)
 
Ответить
СообщениеВсем здрасте.
Интересует наиболее быстрый алгоритм вычисления числа вхождения элементов одного массива в другой.
Конкретно в моем случае, массивы - это натуральные числа, для упрощения скажем от1 до 20
В примере у меня есть решение через встроенные функции, и через VBA.
Есть ли более быстрые алгоритмы?

зы. Функция у меня для примера алгоритма, в действительности это будет макрос и работа не с ячейками, а с массивами. Надо провести несколько миллионов сравнений.

Автор - Michael_S
Дата добавления - 27.07.2013 в 14:08
Michael_S Дата: Суббота, 27.07.2013, 14:51 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Что-то просмотров мало, наверно потому, что сегодня выходной.
Повторил тему на Планете
 
Ответить
СообщениеЧто-то просмотров мало, наверно потому, что сегодня выходной.
Повторил тему на Планете

Автор - Michael_S
Дата добавления - 27.07.2013 в 14:51
SkyPro Дата: Суббота, 27.07.2013, 14:53 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
[offtop]Я посмотрел и понял, что мне до уровня решения данной задачи еще пару лет опыта набираться )


skypro1111@gmail.com
 
Ответить
Сообщение[offtop]Я посмотрел и понял, что мне до уровня решения данной задачи еще пару лет опыта набираться )

Автор - SkyPro
Дата добавления - 27.07.2013 в 14:53
SergeyKorotun Дата: Суббота, 27.07.2013, 15:40 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Michael_S, измените например значение ячейки С1 с 3 на 20 и получите разные результаты (5 и 4) в двух формулах


Сообщение отредактировал SergeyKorotun - Суббота, 27.07.2013, 15:43
 
Ответить
СообщениеMichael_S, измените например значение ячейки С1 с 3 на 20 и получите разные результаты (5 и 4) в двух формулах

Автор - SergeyKorotun
Дата добавления - 27.07.2013 в 15:40
Michael_S Дата: Суббота, 27.07.2013, 15:46 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
SergeyKorotun, забыл указать, что хоть числа и случайны, но в пределах одного массива уникальны.
 
Ответить
СообщениеSergeyKorotun, забыл указать, что хоть числа и случайны, но в пределах одного массива уникальны.

Автор - Michael_S
Дата добавления - 27.07.2013 в 15:46
Матраскин Дата: Суббота, 27.07.2013, 16:27 | Сообщение № 6
Группа: Друзья
Ранг: Обитатель
Сообщений: 375
Репутация: 81 ±
Замечаний: 0% ±

20xx
Michael_S, если возможна сортировка 2ого массив то я бы:
отсортировал
и потом при сравнении с первым доходил не до конца 2 ого массив, а делал проверку А может ли там быть этот элемент?

20 4 5 5 19 14 15 12
18 20 14 5 10 19

первый проход до конца
второй выбывает ^_^
третий 1 раз
и т д

думаю быстрей будет


в интернете опять кто-то не прав

Сообщение отредактировал Матраскин - Суббота, 27.07.2013, 16:32
 
Ответить
СообщениеMichael_S, если возможна сортировка 2ого массив то я бы:
отсортировал
и потом при сравнении с первым доходил не до конца 2 ого массив, а делал проверку А может ли там быть этот элемент?

20 4 5 5 19 14 15 12
18 20 14 5 10 19

первый проход до конца
второй выбывает ^_^
третий 1 раз
и т д

думаю быстрей будет

Автор - Матраскин
Дата добавления - 27.07.2013 в 16:27
Michael_S Дата: Суббота, 27.07.2013, 19:46 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Матраскин, в принципе оба массива отсортированы по возрастанию... вот только по проходам я не пронял...
в моем вариант всего 8=6=14 циклов, какой алгоритм вы предлагаете?
 
Ответить
СообщениеМатраскин, в принципе оба массива отсортированы по возрастанию... вот только по проходам я не пронял...
в моем вариант всего 8=6=14 циклов, какой алгоритм вы предлагаете?

Автор - Michael_S
Дата добавления - 27.07.2013 в 19:46
Матраскин Дата: Суббота, 27.07.2013, 19:59 | Сообщение № 8
Группа: Друзья
Ранг: Обитатель
Сообщений: 375
Репутация: 81 ±
Замечаний: 0% ±

20xx
Michael_S, берём элемент №1 массива№1 сравниваем с элементом №1 массива №2. Если этот элемент < элемента №1 массива№2, то сравниваем с элементом №2 массива№2. Если больше то конец цикла, элемента элемент №1 массива№1 нет в массиве №2. Если равен - то элемент найден, счётчик увеличивается на +1 и выходим из цикла. :)
И так повторяем пока не закончиться массив №1

p.s. массив №2 отсорт. по возрастанию ;)


в интернете опять кто-то не прав

Сообщение отредактировал Матраскин - Суббота, 27.07.2013, 20:02
 
Ответить
СообщениеMichael_S, берём элемент №1 массива№1 сравниваем с элементом №1 массива №2. Если этот элемент < элемента №1 массива№2, то сравниваем с элементом №2 массива№2. Если больше то конец цикла, элемента элемент №1 массива№1 нет в массиве №2. Если равен - то элемент найден, счётчик увеличивается на +1 и выходим из цикла. :)
И так повторяем пока не закончиться массив №1

p.s. массив №2 отсорт. по возрастанию ;)

Автор - Матраскин
Дата добавления - 27.07.2013 в 19:59
SergeyKorotun Дата: Суббота, 27.07.2013, 21:33 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Если массив отсортирован, можно применить метод половинного деления.
Берем средний элемент во втором массиве и сравниваем с элементом с первого массива. Если элементы равны, счетчик увеличиваем и переходим к поиску следующего элемента с первого массива, иначе определяем в какой части второго массива может быть элемент с первого массива и снова делим его пополам и т.д. до тех пор пока или элементы будут равны или размер части второго массива станет = 1.
 
Ответить
СообщениеЕсли массив отсортирован, можно применить метод половинного деления.
Берем средний элемент во втором массиве и сравниваем с элементом с первого массива. Если элементы равны, счетчик увеличиваем и переходим к поиску следующего элемента с первого массива, иначе определяем в какой части второго массива может быть элемент с первого массива и снова делим его пополам и т.д. до тех пор пока или элементы будут равны или размер части второго массива станет = 1.

Автор - SergeyKorotun
Дата добавления - 27.07.2013 в 21:33
MCH Дата: Вторник, 30.07.2013, 03:13 | Сообщение № 10
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Варианты, предложанные на Планете не смотрел, предложу свои
Если данных очень много, лучше работать на массивах

Вариант 1, принцип такой же как и у тебя, создаем массив флагов, и пробегаем по одному массиву и по другому
Достоинства: небольшое количество итераций, сложность O(n+m), не требует сортировки данных
Недостатки: может потребоватся большое количество памяти, в зависимости от значений в массивах, работает только с целыми числами

Вариант 2, в основе принцип предложенный Матраскиным, оба массива отсортированы по возрастанию,
пробегаем по первому массиву, сравниваеваем с элементами второго, до тех пор, пока элемент второго массива не будет равен первому, или превышать, пока не закончатся данные, при этом следущий элемент первого массива сравнивается не с начала второго массива, а с запомненного смещения, тем самым обеспечивается меньшее кол-во итерций, не превышающее n+m
Достоинства: небольшое количество итераций, сложность O(n+m) в худшем случае, не требует выделение памяти, может работать с целыми и дробными числами, а также со строковыми переменными, отсортированными по возрастанию
Недостатки: данные должны быть отсортированы по возрастанию

Т.к. сложность алгоритмов линейна в обоих вариантах, и количество итераций не превышает n+m, то сравнение двух массивов по миллиону элементов составляет доли секунды, второй варинт получился быстрее (в зависимости от данных)
К сообщению приложен файл: Count_in2.xlsb (87.4 Kb)


Сообщение отредактировал MCH - Вторник, 30.07.2013, 07:50
 
Ответить
СообщениеВарианты, предложанные на Планете не смотрел, предложу свои
Если данных очень много, лучше работать на массивах

Вариант 1, принцип такой же как и у тебя, создаем массив флагов, и пробегаем по одному массиву и по другому
Достоинства: небольшое количество итераций, сложность O(n+m), не требует сортировки данных
Недостатки: может потребоватся большое количество памяти, в зависимости от значений в массивах, работает только с целыми числами

Вариант 2, в основе принцип предложенный Матраскиным, оба массива отсортированы по возрастанию,
пробегаем по первому массиву, сравниваеваем с элементами второго, до тех пор, пока элемент второго массива не будет равен первому, или превышать, пока не закончатся данные, при этом следущий элемент первого массива сравнивается не с начала второго массива, а с запомненного смещения, тем самым обеспечивается меньшее кол-во итерций, не превышающее n+m
Достоинства: небольшое количество итераций, сложность O(n+m) в худшем случае, не требует выделение памяти, может работать с целыми и дробными числами, а также со строковыми переменными, отсортированными по возрастанию
Недостатки: данные должны быть отсортированы по возрастанию

Т.к. сложность алгоритмов линейна в обоих вариантах, и количество итераций не превышает n+m, то сравнение двух массивов по миллиону элементов составляет доли секунды, второй варинт получился быстрее (в зависимости от данных)

Автор - MCH
Дата добавления - 30.07.2013 в 03:13
SergeyKorotun Дата: Вторник, 30.07.2013, 16:17 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Хотелось бы кроме затраченного времени увидеть и количество операций сравнения элементов.
 
Ответить
СообщениеХотелось бы кроме затраченного времени увидеть и количество операций сравнения элементов.

Автор - SergeyKorotun
Дата добавления - 30.07.2013 в 16:17
MCH Дата: Вторник, 30.07.2013, 17:39 | Сообщение № 12
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Хотелось бы кроме затраченного времени увидеть и количество операций сравнения элементов

Что Вам мешает сделать счетчик и вывести в окно Immediate?

Принципиально не стал это делать, чтобы не производилась дополнительная задержка на счет счетчика
 
Ответить
Сообщение
Хотелось бы кроме затраченного времени увидеть и количество операций сравнения элементов

Что Вам мешает сделать счетчик и вывести в окно Immediate?

Принципиально не стал это делать, чтобы не производилась дополнительная задержка на счет счетчика

Автор - MCH
Дата добавления - 30.07.2013 в 17:39
MCH Дата: Вторник, 30.07.2013, 17:56 | Сообщение № 13
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Сделал счетчик
К сообщению приложен файл: Count_in3.xlsb (70.4 Kb)


Сообщение отредактировал MCH - Вторник, 30.07.2013, 18:04
 
Ответить
СообщениеСделал счетчик

Автор - MCH
Дата добавления - 30.07.2013 в 17:56
SergeyKorotun Дата: Вторник, 30.07.2013, 18:41 | Сообщение № 14
Группа: Гости
[quote=MCH]Что Вам мешает сделать счетчик и вывести в окно Immediate?[/quote]
только собираюсь начинать изучать VBA
[quote=MCH]Сделал счетчик[/quote]
не вижу
 
Ответить
Сообщение[quote=MCH]Что Вам мешает сделать счетчик и вывести в окно Immediate?[/quote]
только собираюсь начинать изучать VBA
[quote=MCH]Сделал счетчик[/quote]
не вижу

Автор - SergeyKorotun
Дата добавления - 30.07.2013 в 18:41
nerv Дата: Вторник, 30.07.2013, 20:12 | Сообщение № 15
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Число вхождений элементов однгого массива в другом

см. операции со множествами (пересечение, разность ...)

в php для этого даже есть функции специальные

http://www.php.net/manual/ru/function.array-intersect.php
http://php.net/manual/ru/function.array-diff.php

можно сорцы посмотреть

p.s/: если речь идет о данных, проще использовать sql http://www.excelworld.ru/forum/4-4334-1


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Вторник, 30.07.2013, 20:15
 
Ответить
Сообщение
Число вхождений элементов однгого массива в другом

см. операции со множествами (пересечение, разность ...)

в php для этого даже есть функции специальные

http://www.php.net/manual/ru/function.array-intersect.php
http://php.net/manual/ru/function.array-diff.php

можно сорцы посмотреть

p.s/: если речь идет о данных, проще использовать sql http://www.excelworld.ru/forum/4-4334-1

Автор - nerv
Дата добавления - 30.07.2013 в 20:12
Michael_S Дата: Воскресенье, 04.08.2013, 16:19 | Сообщение № 16
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Снова всем здравствуйте!
Появилось немного времени и желания вновь вернуться к этой теме. Прежде всего спасибо всем ответившим.
Есть интересные предложения для общего случая небольших массивов данных, но ... из преложенных наиболее подходящим будет "Вариант 2", предложенный MCH.



В файле пример с частичной реализацией.
После разрешения макросов произойдет загрузка тиражей за 2013 год.
Если после загрузки нажать кнопку "Обновить все", а потом еще раз запустить макрос - будет таблица всех тиражей.
К сообщению приложен файл: 5_from_36.xlsm (64.8 Kb)


Сообщение отредактировал Michael_S - Воскресенье, 04.08.2013, 16:23
 
Ответить
СообщениеСнова всем здравствуйте!
Появилось немного времени и желания вновь вернуться к этой теме. Прежде всего спасибо всем ответившим.
Есть интересные предложения для общего случая небольших массивов данных, но ... из преложенных наиболее подходящим будет "Вариант 2", предложенный MCH.



В файле пример с частичной реализацией.
После разрешения макросов произойдет загрузка тиражей за 2013 год.
Если после загрузки нажать кнопку "Обновить все", а потом еще раз запустить макрос - будет таблица всех тиражей.

Автор - Michael_S
Дата добавления - 04.08.2013 в 16:19
MCH Дата: Воскресенье, 04.08.2013, 16:54 | Сообщение № 17
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Миш, а озвучь какую задачу хочешь решить, с точки зрения комбинаторики возможно интересно будет порешать.
500 млн чисел (376992 * 1340) для массивов - плевое дело перебрать.

Не ради лотереи, а ради комбинаторики могу помочь.
 
Ответить
СообщениеМиш, а озвучь какую задачу хочешь решить, с точки зрения комбинаторики возможно интересно будет порешать.
500 млн чисел (376992 * 1340) для массивов - плевое дело перебрать.

Не ради лотереи, а ради комбинаторики могу помочь.

Автор - MCH
Дата добавления - 04.08.2013 в 16:54
Michael_S Дата: Воскресенье, 04.08.2013, 17:47 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Миш, да задача пока, на первом этапе, простая.
Для лисов Пары-Четверки показать, когда и сколько выпадала эта комбинация;
для "Все" показать кол-во совпадений каждого варианта в каждом тираже.
Есть у меня (в мозгах) еще один алгоритм, там кол-во переборов в два раза меньше, но не уверен, что в общем случае это будет быстрее.

Да и, честно говоря - скорость обработки здесь не решающий фактор. Пусть даже, при первом расчете будет обрабатывать сутки (хотя думаю, что даже на не самом оптимальном алгоритме займет не более часа), потом только добавлять вновь появившиеся данные. Была бы от этого хоть какая-то (материальная) польза - уже б сделал. А так - только моральное удовлетворение, ...и немалые материальные потери, если на эти расчеты положиться.
А если и повезет - то не благодаря расчетам :)


Сообщение отредактировал Michael_S - Воскресенье, 04.08.2013, 17:48
 
Ответить
СообщениеМиш, да задача пока, на первом этапе, простая.
Для лисов Пары-Четверки показать, когда и сколько выпадала эта комбинация;
для "Все" показать кол-во совпадений каждого варианта в каждом тираже.
Есть у меня (в мозгах) еще один алгоритм, там кол-во переборов в два раза меньше, но не уверен, что в общем случае это будет быстрее.

Да и, честно говоря - скорость обработки здесь не решающий фактор. Пусть даже, при первом расчете будет обрабатывать сутки (хотя думаю, что даже на не самом оптимальном алгоритме займет не более часа), потом только добавлять вновь появившиеся данные. Была бы от этого хоть какая-то (материальная) польза - уже б сделал. А так - только моральное удовлетворение, ...и немалые материальные потери, если на эти расчеты положиться.
А если и повезет - то не благодаря расчетам :)

Автор - Michael_S
Дата добавления - 04.08.2013 в 17:47
Serge_007 Дата: Воскресенье, 04.08.2013, 17:56 | Сообщение № 19
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
И ты Брут...


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеИ ты Брут...

Автор - Serge_007
Дата добавления - 04.08.2013 в 17:56
MCH Дата: Воскресенье, 04.08.2013, 18:08 | Сообщение № 20
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Да и, честно говоря - скорость обработки здесь не решающий фактор.

Думаю что для задач двойки, тройки, четверки - перебор займет секунды

Твой файл не смотрел, но могу предложить следующий алгоритм
Для пар: генерируем выборку 2 из 36, проверяем все 630 (36*35/2) вариантов на 1340 тиражей, сортируем по убыванию и выводим на экран, с указанием номеров тиражей, где совпадало
Для троек аналогично, только времени затратится больше: 7140 вариантов (36*35*34/6), для четверок - 58905 вариантов
Но учитывая, что количество вариантов не такое уж и большое, то времени затратится немного
 
Ответить
Сообщение
Да и, честно говоря - скорость обработки здесь не решающий фактор.

Думаю что для задач двойки, тройки, четверки - перебор займет секунды

Твой файл не смотрел, но могу предложить следующий алгоритм
Для пар: генерируем выборку 2 из 36, проверяем все 630 (36*35/2) вариантов на 1340 тиражей, сортируем по убыванию и выводим на экран, с указанием номеров тиражей, где совпадало
Для троек аналогично, только времени затратится больше: 7140 вариантов (36*35*34/6), для четверок - 58905 вариантов
Но учитывая, что количество вариантов не такое уж и большое, то времени затратится немного

Автор - MCH
Дата добавления - 04.08.2013 в 18:08
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Число вхождений элементов однгого массива в другом. (Макросы Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!