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

Вход

Регистрация

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

 

= Мир MS Excel/Пузырьковая сортировка без дублей. - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Готовые решения » Пузырьковая сортировка без дублей. (Excel)
Пузырьковая сортировка без дублей.
AndreTM Дата: Понедельник, 20.10.2014, 22:00 | Сообщение № 21
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Ещё как вариант. Зная про "ёжиков" для конкретного приложения (скажем, сейчас ё оказывается в конце) - можно сделать алгоритм с в виде "сортировка+перестановка". Т.е. сначала сортируем весь диапазон, используя встроенные средства, а затем переставляем всех "ёжиков" в промежуток между "е" и " ж". На большом количестве данных алгоритм может начать выигрывать у любых "самописных" сортировок - ведь для второго этапа нам понадобится всего один проход (определить два значения - "начало диапазона 'ж или больше'" и "начало диапазона 'ё'") и одна команда на перезапись диапазона данных тремя объединенными диапазонами (по сути, ещё один проход с копированием)...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеЕщё как вариант. Зная про "ёжиков" для конкретного приложения (скажем, сейчас ё оказывается в конце) - можно сделать алгоритм с в виде "сортировка+перестановка". Т.е. сначала сортируем весь диапазон, используя встроенные средства, а затем переставляем всех "ёжиков" в промежуток между "е" и " ж". На большом количестве данных алгоритм может начать выигрывать у любых "самописных" сортировок - ведь для второго этапа нам понадобится всего один проход (определить два значения - "начало диапазона 'ж или больше'" и "начало диапазона 'ё'") и одна команда на перезапись диапазона данных тремя объединенными диапазонами (по сути, ещё один проход с копированием)...

Автор - AndreTM
Дата добавления - 20.10.2014 в 22:00
SLAVICK Дата: Понедельник, 20.10.2014, 22:34 | Сообщение № 22
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
МСН, у Вас как всегда все просто и немного букв в коде :)
Забираю себе в копилку ^_^ .
В этот алгоритм легко можно дописать еще "Ёжиков" и др. У меня код запутаннее был :( Искать не буду.


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Понедельник, 20.10.2014, 22:34
 
Ответить
СообщениеМСН, у Вас как всегда все просто и немного букв в коде :)
Забираю себе в копилку ^_^ .
В этот алгоритм легко можно дописать еще "Ёжиков" и др. У меня код запутаннее был :( Искать не буду.

Автор - SLAVICK
Дата добавления - 20.10.2014 в 22:34
SLAVICK Дата: Вторник, 21.10.2014, 00:07 | Сообщение № 23
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Все таки поискал ... как оказалось не зря :D
У меня код работает в разы быстрее чем у МСН :)
Особенно если размножить до 100000.(0,28125 против 33,85156) B)
В файле нажмите "размножить", а потом можно выбрать способ рассчета :D
К сообщению приложен файл: 6313693.xlsm (81.4 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 00:09
 
Ответить
СообщениеВсе таки поискал ... как оказалось не зря :D
У меня код работает в разы быстрее чем у МСН :)
Особенно если размножить до 100000.(0,28125 против 33,85156) B)
В файле нажмите "размножить", а потом можно выбрать способ рассчета :D

Автор - SLAVICK
Дата добавления - 21.10.2014 в 00:07
RAN Дата: Вторник, 21.10.2014, 01:16 | Сообщение № 24
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
SLAVICK, это круто! :D Сколько варил?
[vba]
Код
Set dic = CreateObject("Scripting.Dictionary")
'Добавление уникальных в коллекцию
   For i = 1 To UBound(mas)
      For ii = 1 To UBound(mas, 2)
      On Error Resume Next
      dic.Add mas(i, ii), i
   Next ii, i
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Вторник, 21.10.2014, 01:18
 
Ответить
СообщениеSLAVICK, это круто! :D Сколько варил?
[vba]
Код
Set dic = CreateObject("Scripting.Dictionary")
'Добавление уникальных в коллекцию
   For i = 1 To UBound(mas)
      For ii = 1 To UBound(mas, 2)
      On Error Resume Next
      dic.Add mas(i, ii), i
   Next ii, i
[/vba]

Автор - RAN
Дата добавления - 21.10.2014 в 01:16
AndreTM Дата: Вторник, 21.10.2014, 02:22 | Сообщение № 25
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
SLAVICK, я все же предлагаю глянуть вариант вашего же алгоритма, но использующий только "встроенные" средства :)
Максимум - в полтора раза дольше вашего исполняется (таймер замера поправлен, поскольку у меня не используется массив).
Ну и все же - поиск уников занимает бОльшую часть этого времени.
К сообщению приложен файл: 3-13568-2.xlsm (86.4 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеSLAVICK, я все же предлагаю глянуть вариант вашего же алгоритма, но использующий только "встроенные" средства :)
Максимум - в полтора раза дольше вашего исполняется (таймер замера поправлен, поскольку у меня не используется массив).
Ну и все же - поиск уников занимает бОльшую часть этого времени.

Автор - AndreTM
Дата добавления - 21.10.2014 в 02:22
SLAVICK Дата: Вторник, 21.10.2014, 10:06 | Сообщение № 26
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
SLAVICK, это круто! Сколько варил?

Спасибо :)
Сначала использовал коллекцию, потом решил использовать словарь, а пометку не поправил. - правильнее "'Добавление уникальных в словарь"

Я просто работаю с большим количеством данных, поэтому для меня скорость - на вес золота :D
Искал не долго, просто так сложилось, что на тот момент у меня уже было 2 инструмента:
добавление в словарь(точнее на тот момент - коллекцию)
Быстрая сортировка.

Осталось только совместить :D


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
SLAVICK, это круто! Сколько варил?

Спасибо :)
Сначала использовал коллекцию, потом решил использовать словарь, а пометку не поправил. - правильнее "'Добавление уникальных в словарь"

Я просто работаю с большим количеством данных, поэтому для меня скорость - на вес золота :D
Искал не долго, просто так сложилось, что на тот момент у меня уже было 2 инструмента:
добавление в словарь(точнее на тот момент - коллекцию)
Быстрая сортировка.

Осталось только совместить :D

Автор - SLAVICK
Дата добавления - 21.10.2014 в 10:06
SLAVICK Дата: Вторник, 21.10.2014, 10:25 | Сообщение № 27
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
AndreTM - в Вашем варианте - совсем другой принцип - Вы задействуете лист, и сортировку на листе, что мне лично не подходит, поскольку мои данные обрабатываются полностью в массивах, коллекциях....
К тому же при таком подходе попробуйте расширить диапазон до нескольких столбцов - возникнут проблемы.
А если на листе будут данные или автофильтры? Придется это дело обходить %)

В моем случае можно использовать сколько угодно столбцов(заменить a1:a100000 на например a1:b100000 или selection для выделенного диаппазона) - добавление в словарь будет происходить по всему диапазону :D.

В данном коде используются штатное сравнение <=> :D .


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 10:27
 
Ответить
СообщениеAndreTM - в Вашем варианте - совсем другой принцип - Вы задействуете лист, и сортировку на листе, что мне лично не подходит, поскольку мои данные обрабатываются полностью в массивах, коллекциях....
К тому же при таком подходе попробуйте расширить диапазон до нескольких столбцов - возникнут проблемы.
А если на листе будут данные или автофильтры? Придется это дело обходить %)

В моем случае можно использовать сколько угодно столбцов(заменить a1:a100000 на например a1:b100000 или selection для выделенного диаппазона) - добавление в словарь будет происходить по всему диапазону :D.

В данном коде используются штатное сравнение <=> :D .

Автор - SLAVICK
Дата добавления - 21.10.2014 в 10:25
SLAVICK Дата: Вторник, 21.10.2014, 10:48 | Сообщение № 28
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Добавил в свой код выбор диапазона выборки и вставки через Inputbox :D
Можно несколько столбцов.

Как у Rioran в самом начале.
К сообщению приложен файл: 5963507.xlsm (82.4 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 12:02
 
Ответить
СообщениеДобавил в свой код выбор диапазона выборки и вставки через Inputbox :D
Можно несколько столбцов.

Как у Rioran в самом начале.

Автор - SLAVICK
Дата добавления - 21.10.2014 в 10:48
AndreTM Дата: Вторник, 21.10.2014, 16:11 | Сообщение № 29
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему: определить набор данных - удалить дубликаты - сделать ключ сортировки - отсортировать - (выгрузить на лист). А непосредственно код - это метод реализации :)
Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти. Не подойдет Вам - другие могут найти нечто полезное. Да и вообще, это тема Rioran про его сортировку :)

[offtop]Ну и замечу, что заявлять о неких "по-вашему, проблемах", судя по всему, не проверив использованных методов - по крайней мере, не комильфо. С чего это .RemoveDuplicates стало работать с "одним столбцом"? Причем здесь "другие данные и или фильтры"? etc...[/offtop]


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Вторник, 21.10.2014, 16:14
 
Ответить
СообщениеSLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему: определить набор данных - удалить дубликаты - сделать ключ сортировки - отсортировать - (выгрузить на лист). А непосредственно код - это метод реализации :)
Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти. Не подойдет Вам - другие могут найти нечто полезное. Да и вообще, это тема Rioran про его сортировку :)

[offtop]Ну и замечу, что заявлять о неких "по-вашему, проблемах", судя по всему, не проверив использованных методов - по крайней мере, не комильфо. С чего это .RemoveDuplicates стало работать с "одним столбцом"? Причем здесь "другие данные и или фильтры"? etc...[/offtop]

Автор - AndreTM
Дата добавления - 21.10.2014 в 16:11
Hugo Дата: Вторник, 21.10.2014, 16:19 | Сообщение № 30
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3253
Репутация: 707 ±
Замечаний: 0% ±

2019
SLAVICK, Если важна скорость - эачем 100000 раз On Error Resume Next выполняете? Достаточно один раз в начале кода отключить.
Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.

P.S. Да даже если скорость не важна - зачем делать лишнюю работу?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеSLAVICK, Если важна скорость - эачем 100000 раз On Error Resume Next выполняете? Достаточно один раз в начале кода отключить.
Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.

P.S. Да даже если скорость не важна - зачем делать лишнюю работу?

Автор - Hugo
Дата добавления - 21.10.2014 в 16:19
SLAVICK Дата: Вторник, 21.10.2014, 16:34 | Сообщение № 31
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему

Как ни странно - нет :D Можете попробовать :)
Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон :) останутся уникальные только с одного столбца.Попробуйте запустить мой макрос и выбрать несколько столбцов и Вы увидите разницу ;)

Не подойдет Вам - другие могут найти нечто полезное.

Вы правы - , но я написал "что мне лично не подходит". Вполне возможно подойдет другим.

Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти.


Да и вообще, это тема Rioran про его сортировку

Да. Rioran - изначально делал код для сортировки исключительно в памяти (почитайте название темы):D
И мое последнее решение, на мой взгляд, наиболее схоже с первоначальным файлом - просто оптимизировано.
Впрочем это решать ни мне ни Вам, а автору. Он задал мне вопрос - я на него ответил :D .У меня единственное отступление от темы - это то, что сортировка не "пузырьковая"...


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 17:02
 
Ответить
Сообщение
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему

Как ни странно - нет :D Можете попробовать :)
Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон :) останутся уникальные только с одного столбца.Попробуйте запустить мой макрос и выбрать несколько столбцов и Вы увидите разницу ;)

Не подойдет Вам - другие могут найти нечто полезное.

Вы правы - , но я написал "что мне лично не подходит". Вполне возможно подойдет другим.

Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти.


Да и вообще, это тема Rioran про его сортировку

Да. Rioran - изначально делал код для сортировки исключительно в памяти (почитайте название темы):D
И мое последнее решение, на мой взгляд, наиболее схоже с первоначальным файлом - просто оптимизировано.
Впрочем это решать ни мне ни Вам, а автору. Он задал мне вопрос - я на него ответил :D .У меня единственное отступление от темы - это то, что сортировка не "пузырьковая"...

Автор - SLAVICK
Дата добавления - 21.10.2014 в 16:34
SLAVICK Дата: Вторник, 21.10.2014, 16:40 | Сообщение № 32
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.


Вы правы :) поправил. Как писал раньше - сначала делал на коллекции, а там свойства "Exists" нет. Остался пережиток старого кода :)
К сообщению приложен файл: Slavick.xlsm (82.5 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 16:45
 
Ответить
Сообщение
Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.


Вы правы :) поправил. Как писал раньше - сначала делал на коллекции, а там свойства "Exists" нет. Остался пережиток старого кода :)

Автор - SLAVICK
Дата добавления - 21.10.2014 в 16:40
AndreTM Дата: Вторник, 21.10.2014, 17:08 | Сообщение № 33
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца
Как ни странно - да :D
Не путайте алгоритм с реализацией, пожалуйста. И в моей реализации, если рассуждать о ней, один диапазон (шириной в один столбец) используется как коллекция исходных данных, а второй диапазон (на один столбец вправо от исходного - как ключ. Если мне надо будет обрабатывать данные из нескольких исходных "столбцов" - я предварительно считаю их в один отдельный, расположенный в нужном месте - и укажу его в качестве источника данных для алгоритма.
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа" :)
Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей. Я - независимое решение каждой подзадачи, в результате решающие общую :)
И да, я же просил сравнить быстродействие подзадач по отдельности?..


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца
Как ни странно - да :D
Не путайте алгоритм с реализацией, пожалуйста. И в моей реализации, если рассуждать о ней, один диапазон (шириной в один столбец) используется как коллекция исходных данных, а второй диапазон (на один столбец вправо от исходного - как ключ. Если мне надо будет обрабатывать данные из нескольких исходных "столбцов" - я предварительно считаю их в один отдельный, расположенный в нужном месте - и укажу его в качестве источника данных для алгоритма.
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа" :)
Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей. Я - независимое решение каждой подзадачи, в результате решающие общую :)
И да, я же просил сравнить быстродействие подзадач по отдельности?..

Автор - AndreTM
Дата добавления - 21.10.2014 в 17:08
Rioran Дата: Вторник, 21.10.2014, 17:23 | Сообщение № 34
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Господа, мне крайне импонирует, что из моей невинной темы вышла довольно серьёзная дискуссия. Спасибо всем за оставленные алгоритмы (в том числе ссылки на видео ^.^), очень полезно и есть о чём подумать, куда совершенствоваться.

Если у кого-нибудь из Вас есть ещё идеи на тему сортировок/фильтров - прошу, высказывайтесь. В таких темах самое ценное - делиться опытом =)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеГоспода, мне крайне импонирует, что из моей невинной темы вышла довольно серьёзная дискуссия. Спасибо всем за оставленные алгоритмы (в том числе ссылки на видео ^.^), очень полезно и есть о чём подумать, куда совершенствоваться.

Если у кого-нибудь из Вас есть ещё идеи на тему сортировок/фильтров - прошу, высказывайтесь. В таких темах самое ценное - делиться опытом =)

Автор - Rioran
Дата добавления - 21.10.2014 в 17:23
SLAVICK Дата: Вторник, 21.10.2014, 18:05 | Сообщение № 35
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа"

Я не противоречил себе. Просто мой алгоритм сразу создает словарь уникальных по всем столбцам массива данных т.е. все данные сразу забрасываются в массив(память) и потом в памяти обрабатываются, без предварительной обработки данных на листе. B)
Обращение к листу у меня аж 2 раза:
для получения исходного массива
для вывода итогового массива <_<

Цитата
Алгори́тм — это точный набор инструкций, описывающих порядок действий некоторого исполнителя для достижения результата, решения некоторой задачи за конечное время.

Исходя из цитаты мой алгоритм одинаков для любого количества столбцов:
1.Считать все данные в один уникальный массив
2.Добавить столбец корректировки
3.Отсортировать по столбцу корректировки
4.Вывести итоговый массив в указанное место.

Ваш алгоритм для нескольких столбцов отличается от алгоритма для одного столбца:
1.Получить отдельный столбец со всеми данными(может также состоять из подпунктов)
2.Считать все данные в один уникальный диапазон
3.Добавить столбец корректировки
4.Отсортировать по столбцу корректировки
5.Удалить столбец сортировки

Исходя из личного опыта могу сказать, что работа с функциями листа медленнее, чем эта же работа в коде - при условии правильно подобранного кода :D

Как подтверждение:
A1__1,011719
A2__1,03125
A3__1,039063

A4__1,050781

против
S1 __0,5039063
S2 __0,515625
S3 __0,53125

S4 __0,5625

Где 1-4 - шаги.
А - Ваш алгоритм
S - мой
Зеленые - шаги между которыми была сортировка. На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.

Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей.

У меня точно так же как у Вас - две задачи решаются отдельно(просто не делал промежуточную выгрузку массива), если хотите - можете выгрузить несортированный массив - для этого добавьте строку вывода массива "arrDicKeys" на лист. :D


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 18:45
 
Ответить
Сообщение
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа"

Я не противоречил себе. Просто мой алгоритм сразу создает словарь уникальных по всем столбцам массива данных т.е. все данные сразу забрасываются в массив(память) и потом в памяти обрабатываются, без предварительной обработки данных на листе. B)
Обращение к листу у меня аж 2 раза:
для получения исходного массива
для вывода итогового массива <_<

Цитата
Алгори́тм — это точный набор инструкций, описывающих порядок действий некоторого исполнителя для достижения результата, решения некоторой задачи за конечное время.

Исходя из цитаты мой алгоритм одинаков для любого количества столбцов:
1.Считать все данные в один уникальный массив
2.Добавить столбец корректировки
3.Отсортировать по столбцу корректировки
4.Вывести итоговый массив в указанное место.

Ваш алгоритм для нескольких столбцов отличается от алгоритма для одного столбца:
1.Получить отдельный столбец со всеми данными(может также состоять из подпунктов)
2.Считать все данные в один уникальный диапазон
3.Добавить столбец корректировки
4.Отсортировать по столбцу корректировки
5.Удалить столбец сортировки

Исходя из личного опыта могу сказать, что работа с функциями листа медленнее, чем эта же работа в коде - при условии правильно подобранного кода :D

Как подтверждение:
A1__1,011719
A2__1,03125
A3__1,039063

A4__1,050781

против
S1 __0,5039063
S2 __0,515625
S3 __0,53125

S4 __0,5625

Где 1-4 - шаги.
А - Ваш алгоритм
S - мой
Зеленые - шаги между которыми была сортировка. На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.

Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей.

У меня точно так же как у Вас - две задачи решаются отдельно(просто не делал промежуточную выгрузку массива), если хотите - можете выгрузить несортированный массив - для этого добавьте строку вывода массива "arrDicKeys" на лист. :D

Автор - SLAVICK
Дата добавления - 21.10.2014 в 18:05
AndreTM Дата: Вторник, 21.10.2014, 22:26 | Сообщение № 36
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Какие-то странные замеры... Ладно, сделал сам.
Я разбил оба теста на соответствующие операции. У вас - чисто работа в памяти, естественно, основной массив и словарь сделаны глобальными. У меня - чисто работа на листе. Так вот.

Тест S: 22:10:11
0,0625 - чтение данных с листа в массив
0,4140625 - создание словаря
0,015625 - создание массива из словаря + замена ё
0,015625 - сортировка
0,015625 - запись массива на лист


Тест A: 22:32:21
0,09375 - копирование данных в другое, "рабочее" место, в принципе, необязательное
0,765625 - удаление дубликатов + сборка данных в один столбец
0,015625 - создание ключа (замена ё)
0,0078125 - сортировка
0,015625 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное

Как мы видим, непосредственно сортировка, - везде наименее затратная операция :)
А удаление дубликатов у меня занимает "настолько больше" времени только из-за тестирования "многостолбцовых данных".
Если исходные данные расположить в одном столбце - тайминги сходных операций будут различаться на меньшие величины.
Я ещё не проверял - но на больших объемах данных динамический SQL-запрос вполне может показать результаты ещё лучше ваших - он ведь все необходимое может проделать одной операцией :)

И да, не смешивайте "функции листа" и "методы объектов приложения". У меня в коде нет никаких функций листа.:)

P.S. Упс... Забыл у себя отключить .ScreenUpdating, исправил,старые замеры убрал под спойлер :)
К сообщению приложен файл: 3-13568-2-2.xlsm (95.6 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Среда, 22.10.2014, 00:52
 
Ответить
СообщениеКакие-то странные замеры... Ладно, сделал сам.
Я разбил оба теста на соответствующие операции. У вас - чисто работа в памяти, естественно, основной массив и словарь сделаны глобальными. У меня - чисто работа на листе. Так вот.

Тест S: 22:10:11
0,0625 - чтение данных с листа в массив
0,4140625 - создание словаря
0,015625 - создание массива из словаря + замена ё
0,015625 - сортировка
0,015625 - запись массива на лист


Тест A: 22:32:21
0,09375 - копирование данных в другое, "рабочее" место, в принципе, необязательное
0,765625 - удаление дубликатов + сборка данных в один столбец
0,015625 - создание ключа (замена ё)
0,0078125 - сортировка
0,015625 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное

Как мы видим, непосредственно сортировка, - везде наименее затратная операция :)
А удаление дубликатов у меня занимает "настолько больше" времени только из-за тестирования "многостолбцовых данных".
Если исходные данные расположить в одном столбце - тайминги сходных операций будут различаться на меньшие величины.
Я ещё не проверял - но на больших объемах данных динамический SQL-запрос вполне может показать результаты ещё лучше ваших - он ведь все необходимое может проделать одной операцией :)

И да, не смешивайте "функции листа" и "методы объектов приложения". У меня в коде нет никаких функций листа.:)

P.S. Упс... Забыл у себя отключить .ScreenUpdating, исправил,старые замеры убрал под спойлер :)

Автор - AndreTM
Дата добавления - 21.10.2014 в 22:26
SLAVICK Дата: Вторник, 21.10.2014, 23:43 | Сообщение № 37
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Какие-то странные замеры...

Ничего странного. Просто Вы считали время между шагами и обнуляли его, а я делал накопительным итогом. :D
В результате по Вашим замерам - получилось примерно так как и у меня - мой код в 1,5 - 2 раза быстрее :D

для наглядности из Вашего файла:



левый столбец - отдельные промежутки(Как Вы считали) - правый как я считал.

В своем примере я делил не на 5 шагов а на 4..., и немного по другому:
1 создание уникального списка и его переброс в одномерный массив
2 создание 2-го массива
3 сортировка массива
4 выгрузка массива на лист

Я же так и написал что сортировка у Вас:
Цитата
На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
(т.е. у меня)

P.S. предлагаю на этом спор закончить, beer все точки вроде расставлены - дальше каждый пускай выбирает что ему по душе. Мне ближе и понятнее мой код, кому-то Ваш. На то и право выбора :D


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 23:44
 
Ответить
Сообщение
Какие-то странные замеры...

Ничего странного. Просто Вы считали время между шагами и обнуляли его, а я делал накопительным итогом. :D
В результате по Вашим замерам - получилось примерно так как и у меня - мой код в 1,5 - 2 раза быстрее :D

для наглядности из Вашего файла:



левый столбец - отдельные промежутки(Как Вы считали) - правый как я считал.

В своем примере я делил не на 5 шагов а на 4..., и немного по другому:
1 создание уникального списка и его переброс в одномерный массив
2 создание 2-го массива
3 сортировка массива
4 выгрузка массива на лист

Я же так и написал что сортировка у Вас:
Цитата
На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
(т.е. у меня)

P.S. предлагаю на этом спор закончить, beer все точки вроде расставлены - дальше каждый пускай выбирает что ему по душе. Мне ближе и понятнее мой код, кому-то Ваш. На то и право выбора :D

Автор - SLAVICK
Дата добавления - 21.10.2014 в 23:43
SLAVICK Дата: Среда, 22.10.2014, 10:12 | Сообщение № 38
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
У вас почему-то не все данные попадают в итоговый результат(на вставленных данных) :o , и странная сортировка :)
В файле 3-й лист - сравнение данных.
Отмечу особенность моего алгоритма - он числа сортирует как текст.
Это может быть как плюсом, так и минусом.
Чтобы сортировал числа как числа нужно в коде изменить 3 строчки yes

m = a(Round((i + j) \ 2), n)    --->    If IsNumeric(m) Then m = a(Round((i + j) \ 2), n) * 1 Else m = a(Round((i + j) \ 2), n)
Do While a(i, n) < m    --->    Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Do While a(j, n) > m    --->    Do While IIf(IsNumeric(a(j, n)), a(j, n) * 1, a(j, n)) > m
К сообщению приложен файл: 1659857.xlsm (92.6 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 22.10.2014, 10:26
 
Ответить
СообщениеУ вас почему-то не все данные попадают в итоговый результат(на вставленных данных) :o , и странная сортировка :)
В файле 3-й лист - сравнение данных.
Отмечу особенность моего алгоритма - он числа сортирует как текст.
Это может быть как плюсом, так и минусом.
Чтобы сортировал числа как числа нужно в коде изменить 3 строчки yes

m = a(Round((i + j) \ 2), n)    --->    If IsNumeric(m) Then m = a(Round((i + j) \ 2), n) * 1 Else m = a(Round((i + j) \ 2), n)
Do While a(i, n) < m    --->    Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Do While a(j, n) > m    --->    Do While IIf(IsNumeric(a(j, n)), a(j, n) * 1, a(j, n)) > m

Автор - SLAVICK
Дата добавления - 22.10.2014 в 10:12
MCH Дата: Четверг, 23.10.2014, 17:47 | Сообщение № 39
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Вопросы к SLAVICKу по коду:
m = a(Round((i + j) \ 2), n)

Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?

Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m

Данный код не проверял, но мне кажется, что на не числовых данных он быдет выдавать ошибку, т.к. в IIf производится оба вычисления, независимо от условий, а уже подставляется результат в зависимости от условия.
по крайне мере выдается ошибка на строчке:
[vba]
Код
a=iif(true,1,"a"*1)
[/vba]
т.к. с текстом нельзя производить математические вычисления, и вместо a(i, n) * 1 лучше записать val(a(i, n)), но тоже есть определенные ограничения
 
Ответить
СообщениеВопросы к SLAVICKу по коду:
m = a(Round((i + j) \ 2), n)

Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?

Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m

Данный код не проверял, но мне кажется, что на не числовых данных он быдет выдавать ошибку, т.к. в IIf производится оба вычисления, независимо от условий, а уже подставляется результат в зависимости от условия.
по крайне мере выдается ошибка на строчке:
[vba]
Код
a=iif(true,1,"a"*1)
[/vba]
т.к. с текстом нельзя производить математические вычисления, и вместо a(i, n) * 1 лучше записать val(a(i, n)), но тоже есть определенные ограничения

Автор - MCH
Дата добавления - 23.10.2014 в 17:47
SLAVICK Дата: Четверг, 23.10.2014, 23:32 | Сообщение № 40
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019

Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?

Вы правы на 100%.
Код сортировки писал не я - я его взял готовый из ссылки которую раньше выкладывал. Проверил - можно и без округления.

По поводу
Цитата
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m

Вы тоже правы - я проверял только на случайных числах :o

Просмотрел код. Проблема была в в "mas1" там столбец сортировки состоял только из текстовых значений - поскольку S string.
Там можно сделать все намного проще:
[vba]
Код
mas1(i, 2) = s      
'нужно заменить на      
If IsNumeric(s) Then mas1(i, 2) = s * 1 Else mas1(i, 2) = s
[/vba]
Спасибо за наблюдательность :D
В приложении поправленный файл. <_<

Интересно есть ли еще быстрее способ сортировать массивы чем "aQSort"? Из того что я проверял - самый быстрый. Но почему тогда сортировка на листе происходит быстрее? Может кто знает :)
К сообщению приложен файл: 8913658.xlsm (79.9 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Пятница, 24.10.2014, 00:45
 
Ответить
Сообщение

Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?

Вы правы на 100%.
Код сортировки писал не я - я его взял готовый из ссылки которую раньше выкладывал. Проверил - можно и без округления.

По поводу
Цитата
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m

Вы тоже правы - я проверял только на случайных числах :o

Просмотрел код. Проблема была в в "mas1" там столбец сортировки состоял только из текстовых значений - поскольку S string.
Там можно сделать все намного проще:
[vba]
Код
mas1(i, 2) = s      
'нужно заменить на      
If IsNumeric(s) Then mas1(i, 2) = s * 1 Else mas1(i, 2) = s
[/vba]
Спасибо за наблюдательность :D
В приложении поправленный файл. <_<

Интересно есть ли еще быстрее способ сортировать массивы чем "aQSort"? Из того что я проверял - самый быстрый. Но почему тогда сортировка на листе происходит быстрее? Может кто знает :)

Автор - SLAVICK
Дата добавления - 23.10.2014 в 23:32
Мир MS Excel » Вопросы и решения » Готовые решения » Пузырьковая сортировка без дублей. (Excel)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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