Добрый утро всем любителям эксель! Помогите решить следующую задачу: необходимо найти наиболее общую (консенсусную) последовательность, то есть нужно сравнить поочередно все буквы в каждой позиции нескольких ячеек и вернуть букву которая наиболее частов стречается в каждой позиции. Пример прилагаю. Если разных букв в какой-либо позиции одинаковое число, как в примере в самом конце, то можно оставить любую из них.
Поиск консенсусной последовательности
13.11.2023 10:20:24
|
|
|
|
13.11.2023 10:54:09
|
|
|
|
13.11.2023 11:02:07
|
|
|
|
13.11.2023 11:25:33
В виде UDF. В качестве входного аргумента должен быть одностолбиковый диапазон (как в примере)
Изменено: |
|||
|
|
13.11.2023 11:59:34
|
|
|
|
13.11.2023 12:19:13
Мой вариант тоже проверите?
|
|||
|
|
13.11.2023 12:45:21
Евгений, Вы великолепны, как всегда! Код функции короче, состоит из одной функции (без вложенных в неё функций) и, самое главное, работает в 3,25 раз быстрее. Ну, теперь любой человек может стать биоинформатиком.
|
|
|
|
13.11.2023 12:48:23
В спешке не объявил счетчики i J как Long, что не правильно. Исправьте.
Изменено: |
|
|
|
13.11.2023 13:53:23
Правильно?
|
|||
|
|
13.11.2023 15:12:59
Можно проверить скорость.
Изменено: |
|||
|
|
13.11.2023 17:13:58
Ну и последний вариант.
|
|||
|
|
13.11.2023 17:50:49
Доброе время суток
surkenny, коллега, предполагаю, что имелось ввиду
|
|||
|
|
14.11.2023 10:22:27
Итого: победитель функция StrVih1 из сообщения #11 - 0.05 мс, серебро StrVih из сообщения #7 - 0,08 мс, бронза StrVih2 из сообщения #12 - 0,29 мс.
С PQ не получается, возможно из-за того, что в коде все на английском, а у меня эсель русский, source в моем варианте Источник. В общем помучился немного, но ничего не получилось. Хотя обидно, можно было скорость сравнить, "Мерка 2.1" позволяет измерять скорость кодов PQ. Но что-то мне подсказывает, что это будет медленнее: пока загрузишь, пока выгрузишь, уже два действия ![]() |
|
|
|
14.11.2023 10:53:20
Вот вам ещё функция. Она хуже на маленьком диапазоне и лучше на большом. По-хорошему, нужно сравнивать время обработки строк, а не диапазонов (собрать строковый массив и тестить на нём). В моей функции закомментирован доп. вариант ( на тесте дал то же время, но на чистых строках всё может измениться).
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||||
|
|
14.11.2023 11:37:13
Так, на вс. случай, если говорить о скорости, ели использовать "ранее связывание" функции, использующие словарь могут раскрыть себя немного иначе. Вообще, вариантов, может быть много конечно и без словаря (с ним прото всегда проще), тот же вариант с фильтром, если написать функцию фильтра на vba, может быть побыстрее (есть хорошая вероятность)..
Изменено: |
|||
|
|
14.11.2023 12:13:54
Если в моём методе ограничить массив символов до латиницы (Const symMax& = 122) то будет быстрее во всех случаях (ReDim большого массива ел всё время). Можно и не ограничивать, но тогда в памяти нужно будет хранить таких пустых массивов — по количеству символов в строке. Памяти хватит, но пока делать не стал. Сравнение по коду символа, как индексу массива всегда будет быстрее словаря, но, к сожалению, на VBA эти коды ещё нужно получить, а это время…
Мой код работает со строками с разным количеством символов и есть проверка на ошибки и пустоты (наличие на время практически не влияет)
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||
|
|
14.11.2023 12:18:04
Testuser Здравствуйте. Вчера вечером тоже потестил на скорость. Меня удивил значительный проигрыш варианта со словарем. Потом переписал со словаря на коллекции, код получился длиннее (с коллекцией проблематичнее в каких-то случаях работать), но по скорости близко ко 2 варианту (обработка строк). Вот это совсем непонятно.
Но при больших объемах данных для скорости надо наверно на байтовые массивы переходить. Но мне как любителю, зачем этим голову забивать. |
|
|
|
14.11.2023 12:20:57
UPD: можно ещё на InStr сравнение сделать. Сейчас попробую
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
14.11.2023 12:27:00
Jack Famous, я бы потестил функцию JF_MainString, но она у меня не работает?
|
|
|
|
14.11.2023 12:34:29
Да и вообще, она не требует подключения сторонних библиотек…
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||||
|
|
14.11.2023 13:55:46
Файл и открываю, там ошибка знач, см. фото. А если использовать код из последнего сообщения, то эксель ругается на каждую строчку где написано "Dict As New Dictionary", см. скриншот.
Как бы там ни было, функция от Евгения замечательная и скорость вполне приличная чтобы работать с большими объемами данных. |
|
|
|
14.11.2023 13:56:40
Jack Famous, спасибо за тест, у вас как всегда зубодробительные стенды, с непонятными названиями )
|
|||||
|
|
14.11.2023 13:59:31
dim284, добавьте небольшой код для вызова на листе функции CallMe, т.к. я писал функцию для использования на VBA
Сам тест имеет имя Test, EvSm это Евгений Смирнов, JF это Jack Famous, MainString это общая/обобщённая строка, Matrix это матрица. Надеюсь помог ![]() Стенд охватывает только разное количество ячеек диапазона. Как проверить более "правильно" — писал выше. Видел у вас фокусы с копированием памяти, но не видел тестов со штатными аналогами. Не хотите сделать? Мои пробы (не на вашем коде) не показали никакого ускорения… Возможно, кстати, копирование памяти может помочь в обнулении большого целочисленного одномерного массива (вместо ReDim) …
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||
|
|
14.11.2023 14:33:39
|
|||
|
|
14.11.2023 14:53:20
|
|||
|
|
14.11.2023 14:55:01
testuser, спасибо
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
14.11.2023 15:09:28
Ну вы конечно гиганты!
Jack Famous, а нельзя эти строчки как-то объединить, ну, чтобы я не запутался с годами:
|
|||||||||||||||||||||||||||||||||
|
|
14.11.2023 15:13:50
• со строками не более 100 символов (корректировать в строке ReDim aMatrix(n, 100) — можно 1000 выставить, на скорость не повлияет заметно) • с символами до 122 по юникоду (это последняя латинская буква из таблицы). Посмотреть таблицу можно
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||
|
|
14.11.2023 16:05:36
Спасибо всем! Оставил все три функции, мало ли что. Jack Famous, спасибо за упрощение кода. Символов больше не нужно, в моем случае их либо 20 (если аминокислоты), либо 4 (нуклеотиды) и черточка при выравнивании добавляется. Количество символов сразу поставил 32767, больше точно не получится.
|
||||
|
|
|||